Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa8968f2 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

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: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 0613f16c
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@
#include "xfs_trans_priv.h"
#include "xfs_log.h"
#include "xfs_bmap_btree.h"
#include "xfs_reflink.h"

kmem_zone_t *xfs_inode_zone;

@@ -1586,6 +1587,18 @@ xfs_itruncate_extents(
			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
	 * on rolling it forward in the log.