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

Commit 97a1b87e authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Dave Chinner
Browse files

xfs: remove isize check from unshare operation



Now that fallocate has an explicit unshare flag again, let's try
to remove the inode reflink flag whenever the user unshares any
part of a file since checking is cheap compared to the CoW.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reported-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 024adf48
Loading
Loading
Loading
Loading
+6 −12
Original line number Diff line number Diff line
@@ -1570,8 +1570,7 @@ xfs_reflink_clear_inode_flag(
 */
STATIC int
xfs_reflink_try_clear_inode_flag(
	struct xfs_inode	*ip,
	xfs_off_t		old_isize)
	struct xfs_inode	*ip)
{
	struct xfs_mount	*mp = ip->i_mount;
	struct xfs_trans	*tp;
@@ -1585,9 +1584,6 @@ xfs_reflink_try_clear_inode_flag(
	xfs_ilock(ip, XFS_ILOCK_EXCL);
	xfs_trans_ijoin(tp, ip, 0);

	if (old_isize != i_size_read(VFS_I(ip)))
		goto cancel;

	error = xfs_reflink_clear_inode_flag(ip, &tp);
	if (error)
		goto cancel;
@@ -1630,7 +1626,7 @@ xfs_reflink_unshare(

	/* Try to CoW the selected ranges */
	xfs_ilock(ip, XFS_ILOCK_EXCL);
	fbno = XFS_B_TO_FSB(mp, offset);
	fbno = XFS_B_TO_FSBT(mp, offset);
	isize = i_size_read(VFS_I(ip));
	end = XFS_B_TO_FSB(mp, offset + len);
	error = xfs_reflink_dirty_extents(ip, fbno, end, isize);
@@ -1643,12 +1639,10 @@ xfs_reflink_unshare(
	if (error)
		goto out;

	/* Turn off the reflink flag if we unshared the whole file */
	if (offset == 0 && len == isize) {
		error = xfs_reflink_try_clear_inode_flag(ip, isize);
	/* Turn off the reflink flag if possible. */
	error = xfs_reflink_try_clear_inode_flag(ip);
	if (error)
		goto out;
	}

	return 0;