mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 13:14:02 +02:00
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>
This commit is contained in:
parent
4b1fac2bb1
commit
896fcc9357
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user