Re: [PATCH v1 2/5] ntfs: preserve timestamps when creating hard links
From: liubaolin
Date: Wed Oct 28 2026 - 21:50:25 EST
在 2026/10/29 08:15, Hyunchul Lee 写道:
Hi Baolin,
On Tue, Oct 27, 2026 at 05:35:12PM +0800, Baolin Liu wrote:
From: Xuewen Wang <wangxuewen@xxxxxxxxxx>
ntfs_link() resets atime, mtime and ctime on both the source file and
the destination directory after creating a hard link. This overwrites
the source file's atime and mtime and the directory's atime.
Update only the source ctime and the destination directory mtime/ctime.
Mark both inodes dirty so these changes are queued for writeback instead
of relying on the earlier FILE_NAME write.
Signed-off-by: Xuewen Wang <wangxuewen@xxxxxxxxxx>
---
Tested with the complete five-patch series in QEMU. Explicitly assigned
atime and mtime are preserved across ordinary hard-link creation and
O_TMPFILE publication. A separate persistence check set and synced
atime/mtime on the published file, then verified those values after
cache eviction, remount and a fresh boot.
fs/ntfs/namei.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/fs/ntfs/namei.c b/fs/ntfs/namei.c
index 0c84a5c..4442e1d 100644
--- a/fs/ntfs/namei.c
+++ b/fs/ntfs/namei.c
@@ -1663,12 +1663,13 @@ static int ntfs_link(struct dentry *old_dentry, struct inode *dir,
}
inode_inc_iversion(dir);
- simple_inode_init_ts(dir);
+ inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
+ mark_inode_dirty(dir);
inode_inc_iversion(vi);
- simple_inode_init_ts(vi);
+ inode_set_ctime_current(vi);
+ mark_inode_dirty(vi);
Could you also update the last_mft_change_time of $FILE_NAME? it still
appears to retains the old ctime.
Additionaly, could you run run xfstests generic/004 and generic/389?
>
Hi Hyunchul,
Thanks for your review. Xuewen and I will make modifications and run tests per your comments, and submit the v2 patch afterwards.
Thanks,
Baolin.
- /* timestamp is already written, so mark_inode_dirty() is unneeded. */
d_instantiate(dentry, vi);
mutex_unlock(&dir_ni->mrec_lock);
mutex_unlock(&ni->mrec_lock);