summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYichong Chen <chenyichong@uniontech.com>2026-07-27 17:12:14 +0800
committerNamjae Jeon <linkinjeon@kernel.org>2026-07-27 21:02:55 +0900
commit896fcc93574fd511ee04a4110e8ea59d6d8d43d7 (patch)
treed22cc025edf29158626b368d502f071cfb4230f1
parent4b1fac2bb1bcb2416f5bee66428312d5f9eb8dfb (diff)
downloadlinux-next-896fcc93574fd511ee04a4110e8ea59d6d8d43d7.tar.gz
linux-next-896fcc93574fd511ee04a4110e8ea59d6d8d43d7.zip
exfat: write moved entry before removing source
exfat_move_file() removes the old directory entry before the new entry has been written. If writing the new entry fails, rename returns an error after the source entry has already been marked deleted. Write the new entry first, then remove the old entry and update the cached inode location. This keeps the source entry intact if creating the destination entry fails. Signed-off-by: Yichong Chen <chenyichong@uniontech.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
-rw-r--r--fs/exfat/namei.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/exfat/namei.c b/fs/exfat/namei.c
index b7d5e44ad38e..8725dfc6467c 100644
--- a/fs/exfat/namei.c
+++ b/fs/exfat/namei.c
@@ -1116,11 +1116,6 @@ static int exfat_move_file(struct inode *parent_inode,
exfat_init_ext_entry(&new_es, num_new_entries, p_uniname,
&mov_es, num_extra_entries);
- exfat_remove_entries(parent_inode, &mov_es, ES_IDX_FILE, false);
-
- ei->dir = newdir;
- ei->entry = newentry;
-
ret = exfat_put_dentry_set(&new_es, IS_DIRSYNC(parent_inode));
if (ret) {
/* Best-effort delete to avoid duplicate entries */
@@ -1134,6 +1129,11 @@ static int exfat_move_file(struct inode *parent_inode,
goto put_mov_es;
}
+ exfat_remove_entries(parent_inode, &mov_es, ES_IDX_FILE, false);
+
+ ei->dir = newdir;
+ ei->entry = newentry;
+
return exfat_put_dentry_set(&mov_es, IS_DIRSYNC(parent_inode));
put_mov_es: