]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
hfsplus: fix to update ctime after rename
authorViacheslav Dubeyko <slava@dubeyko.com>
Tue, 17 Mar 2026 22:14:00 +0000 (15:14 -0700)
committerViacheslav Dubeyko <slava@dubeyko.com>
Tue, 17 Mar 2026 22:42:19 +0000 (15:42 -0700)
[BUG]
$ sudo ./check generic/003
FSTYP         -- hfsplus
PLATFORM      -- Linux/x86_64 graphic 6.8.0-58-generic #60~22.04.1-Ubuntu
MKFS_OPTIONS  -- /dev/loop29
MOUNT_OPTIONS -- /dev/loop29 /mnt/scratch

generic/003       - output mismatch
    --- tests/generic/003.out   2025-04-27 08:49:39.876945323 -0600
    +++ /home/graphic/fs/xfstests-dev/results//generic/003.out.bad

     QA output created by 003
    +ERROR: change time has not been updated after changing file1
     Silence is golden
    ...

Ran: generic/003
Failures: generic/003
Failed 1 of 1 tests

[CAUSE]
change time has not been updated after changing file1

[FIX]
Update file ctime after rename in hfsplus_rename().

Signed-off-by: Yangtao Li <frank.li@vivo.com>
Tested-by: Viacheslav Dubeyko <slava@dubeyko.com>
Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
Link: https://lore.kernel.org/linux-fsdevel/20250530081719.2430291-1-frank.li@vivo.com/
Signed-off-by: Viacheslav Dubeyko <slava@dubeyko.com>
fs/hfsplus/dir.c

index 6059bd59d66e59841664e65c53e71b84bdd6bf3b..8ad73378ed64412b2016fda058cc5cf60d6a7a46 100644 (file)
@@ -603,11 +603,22 @@ static int hfsplus_rename(struct mnt_idmap *idmap,
                                 old_dir, &old_dentry->d_name,
                                 new_dir, &new_dentry->d_name);
        if (!res) {
+               struct inode *inode = d_inode(old_dentry);
+
                new_dentry->d_fsdata = old_dentry->d_fsdata;
 
+               inode_set_ctime_current(inode);
+               mark_inode_dirty(inode);
+
                res = hfsplus_cat_write_inode(old_dir);
-               if (!res)
-                       res = hfsplus_cat_write_inode(new_dir);
+               if (res)
+                       return res;
+
+               res = hfsplus_cat_write_inode(new_dir);
+               if (res)
+                       return res;
+
+               res = hfsplus_cat_write_inode(inode);
        }
        return res;
 }