Commit 52bfcdd7 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: always swap the cow forks when swapping extents

Since the CoW fork exists as a secondary data structure to the data
fork, we must always swap cow forks during swapext.  We also need to
swap the extent counts and reset the cowblocks tags.
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 5e5c943c
...@@ -2122,11 +2122,31 @@ xfs_swap_extents( ...@@ -2122,11 +2122,31 @@ xfs_swap_extents(
ip->i_d.di_flags2 |= tip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK; ip->i_d.di_flags2 |= tip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK;
tip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; tip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
tip->i_d.di_flags2 |= f & XFS_DIFLAG2_REFLINK; tip->i_d.di_flags2 |= f & XFS_DIFLAG2_REFLINK;
}
/* Swap the cow forks. */
if (xfs_sb_version_hasreflink(&mp->m_sb)) {
xfs_extnum_t extnum;
ASSERT(ip->i_cformat == XFS_DINODE_FMT_EXTENTS);
ASSERT(tip->i_cformat == XFS_DINODE_FMT_EXTENTS);
extnum = ip->i_cnextents;
ip->i_cnextents = tip->i_cnextents;
tip->i_cnextents = extnum;
cowfp = ip->i_cowfp; cowfp = ip->i_cowfp;
ip->i_cowfp = tip->i_cowfp; ip->i_cowfp = tip->i_cowfp;
tip->i_cowfp = cowfp; tip->i_cowfp = cowfp;
if (ip->i_cowfp && ip->i_cnextents)
xfs_inode_set_cowblocks_tag(ip); xfs_inode_set_cowblocks_tag(ip);
else
xfs_inode_clear_cowblocks_tag(ip);
if (tip->i_cowfp && tip->i_cnextents)
xfs_inode_set_cowblocks_tag(tip); xfs_inode_set_cowblocks_tag(tip);
else
xfs_inode_clear_cowblocks_tag(tip);
} }
xfs_trans_log_inode(tp, ip, src_log_flags); xfs_trans_log_inode(tp, ip, src_log_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment