]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
exfat: fix incorrect directory checksum after rename to shorter name
authorChi Zhiling <chizhiling@kylinos.cn>
Fri, 3 Apr 2026 08:05:33 +0000 (16:05 +0800)
committerNamjae Jeon <linkinjeon@kernel.org>
Fri, 3 Apr 2026 13:41:02 +0000 (22:41 +0900)
When renaming a file in-place to a shorter name, exfat_remove_entries
marks excess entries as DELETED, but es->num_entries is not updated
accordingly. As a result, exfat_update_dir_chksum iterates over the
deleted entries and computes an incorrect checksum.

This does not lead to persistent corruption because mark_inode_dirty()
is called afterward, and __exfat_write_inode later recomputes the
checksum using the correct num_entries value.

Fix by setting es->num_entries = num_entries in exfat_init_ext_entry.

Signed-off-by: Chi Zhiling <chizhiling@kylinos.cn>
Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com>
Reviewed-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/exfat/dir.c

index a2c2b998808ca62a9c4641552b94e7d6f123c494..7619410d668e8209ebdcac2fa0c7420042c6813b 100644 (file)
@@ -490,6 +490,7 @@ void exfat_init_ext_entry(struct exfat_entry_set_cache *es, int num_entries,
        unsigned short *uniname = p_uniname->name;
        struct exfat_dentry *ep;
 
+       es->num_entries = num_entries;
        ep = exfat_get_dentry_cached(es, ES_IDX_FILE);
        ep->dentry.file.num_ext = (unsigned char)(num_entries - 1);