diff options
| author | Christian Brauner <brauner@kernel.org> | 2026-07-27 17:15:40 +0200 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-07-27 17:15:40 +0200 |
| commit | d7de16e240daae88d910b425951a5dd644f01006 (patch) | |
| tree | bb45b46e9763b4f02acc8c2deb70ad8bcee09059 /include | |
| parent | 6e75f357864821770f0c60456f2d1b86052186ef (diff) | |
| download | linux-d7de16e240daae88d910b425951a5dd644f01006.tar.gz linux-d7de16e240daae88d910b425951a5dd644f01006.zip | |
fat: Fix lost inode update in do_msdos_rename() with DIRSYNC
Commit e668e0668181 ("fat: Replace fat_sync_inode() with
sync_inode_metadata()") hoisted mark_inode_dirty() in front of the
IS_DIRSYNC conditional in all converted callers except for the main
rename path of do_msdos_rename(). There old_inode is generally still
clean when the target directory has DIRSYNC set and, unlike
fat_sync_inode(), sync_inode_metadata() does nothing for a clean inode.
Thus the directory entry at the new location is never updated with the
contents of old_inode: it stays the way msdos_add_entry() created it,
with start cluster 0 and size 0 (or, when the rename replaced an
existing target, it keeps describing the deleted target). Since
old_inode is also never marked dirty, later writeback doesn't update
the entry either and the stale directory entry ends up on disk even on
a clean unmount, so the renamed file loses its contents.
Mark old_inode dirty before calling sync_inode_metadata() like all the
other call sites do.
Fixes: e668e0668181 ("fat: Replace fat_sync_inode() with sync_inode_metadata()")
Reported-by: Sashiko <sashiko-bot@kernel.org>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'include')
0 files changed, 0 insertions, 0 deletions
