Commit 304ec448 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Greg Kroah-Hartman

xfs: update ctime and mtime on clone destinatation inodes

commit c5ecb423 upstream.

We're changing both metadata and data, so we need to update the
timestamps for clone operations.  Dedupe on the other hand does
not change file data, and only changes invisible metadata so the
timestamps should not be updated.

This follows existing btrfs behavior.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
[darrick: remove redundant is_dedupe test]
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 900c499d
...@@ -955,13 +955,14 @@ STATIC int ...@@ -955,13 +955,14 @@ STATIC int
xfs_reflink_update_dest( xfs_reflink_update_dest(
struct xfs_inode *dest, struct xfs_inode *dest,
xfs_off_t newlen, xfs_off_t newlen,
xfs_extlen_t cowextsize) xfs_extlen_t cowextsize,
bool is_dedupe)
{ {
struct xfs_mount *mp = dest->i_mount; struct xfs_mount *mp = dest->i_mount;
struct xfs_trans *tp; struct xfs_trans *tp;
int error; int error;
if (newlen <= i_size_read(VFS_I(dest)) && cowextsize == 0) if (is_dedupe && newlen <= i_size_read(VFS_I(dest)) && cowextsize == 0)
return 0; return 0;
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
...@@ -982,6 +983,10 @@ xfs_reflink_update_dest( ...@@ -982,6 +983,10 @@ xfs_reflink_update_dest(
dest->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE; dest->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
} }
if (!is_dedupe) {
xfs_trans_ichgtime(tp, dest,
XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
}
xfs_trans_log_inode(tp, dest, XFS_ILOG_CORE); xfs_trans_log_inode(tp, dest, XFS_ILOG_CORE);
error = xfs_trans_commit(tp); error = xfs_trans_commit(tp);
...@@ -1295,7 +1300,8 @@ xfs_reflink_remap_range( ...@@ -1295,7 +1300,8 @@ xfs_reflink_remap_range(
!(dest->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE)) !(dest->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE))
cowextsize = src->i_d.di_cowextsize; cowextsize = src->i_d.di_cowextsize;
ret = xfs_reflink_update_dest(dest, pos_out + len, cowextsize); ret = xfs_reflink_update_dest(dest, pos_out + len, cowextsize,
is_dedupe);
out_unlock: out_unlock:
xfs_iunlock(src, XFS_MMAPLOCK_EXCL); xfs_iunlock(src, XFS_MMAPLOCK_EXCL);
......
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