Browse Source

xfs: cancel CoW reservations and clear inode reflink flag when freeing blocks

When we're freeing blocks (truncate, punch, etc.), clear all CoW
reservations in the range being freed.  If the file block count
drops to zero, also clear the inode reflink flag.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Darrick J. Wong 8 years ago
parent
commit
aa8968f227
1 changed files with 13 additions and 0 deletions
  1. 13 0
      fs/xfs/xfs_inode.c

+ 13 - 0
fs/xfs/xfs_inode.c

@@ -49,6 +49,7 @@
 #include "xfs_trans_priv.h"
 #include "xfs_trans_priv.h"
 #include "xfs_log.h"
 #include "xfs_log.h"
 #include "xfs_bmap_btree.h"
 #include "xfs_bmap_btree.h"
+#include "xfs_reflink.h"
 
 
 kmem_zone_t *xfs_inode_zone;
 kmem_zone_t *xfs_inode_zone;
 
 
@@ -1586,6 +1587,18 @@ xfs_itruncate_extents(
 			goto out;
 			goto out;
 	}
 	}
 
 
+	/* Remove all pending CoW reservations. */
+	error = xfs_reflink_cancel_cow_blocks(ip, &tp, first_unmap_block,
+			last_block);
+	if (error)
+		goto out;
+
+	/*
+	 * Clear the reflink flag if we truncated everything.
+	 */
+	if (ip->i_d.di_nblocks == 0 && xfs_is_reflink_inode(ip))
+		ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
+
 	/*
 	/*
 	 * Always re-log the inode so that our permanent transaction can keep
 	 * Always re-log the inode so that our permanent transaction can keep
 	 * on rolling it forward in the log.
 	 * on rolling it forward in the log.