diff options
| author | Chi Zhiling <chizhiling@kylinos.cn> | 2026-09-05 13:49:50 +0800 |
|---|---|---|
| committer | Namjae Jeon <linkinjeon@kernel.org> | 2026-10-21 08:28:27 +0900 |
| commit | cb9dbf8a4e34b4fdf311598835ab4d76ed7e07c1 (patch) | |
| tree | ea0c152d0b0485ddf99efc1d0ff052bbc062e826 /scripts/Makefile.thinlto | |
| parent | 4483ab85d1e0d934dfc827a828c8b265e82cdb4f (diff) | |
| download | linux-cb9dbf8a4e34b4fdf311598835ab4d76ed7e07c1.tar.gz linux-cb9dbf8a4e34b4fdf311598835ab4d76ed7e07c1.zip | |
exfat: fix used_clusters accounting during cluster allocation
In the current exfat_alloc_cluster(), p_chain->size is incremented as
each cluster is allocated so that the partially allocated chain can
be freed by __exfat_free_cluster() on the error path.
However, sbi->used_clusters is still updated only after all clusters
have been allocated, while __exfat_free_cluster() unconditionally
subtracts the number of freed clusters from sbi->used_clusters.
Therefore, when allocation fails partway through, the partially
allocated clusters are subtracted from sbi->used_clusters even
though they were never added to it. This corrupts the free-space
accounting and can cause sbi->used_clusters to underflow.
Increment sbi->used_clusters together with p_chain->size as each
cluster is allocated. This keeps the accounting consistent with
__exfat_free_cluster() on both the success and error paths.
This issue is caught by generic/476 with 256k cluster size:
Ran: generic/476
Failures: generic/476
Failed 1 of 1 tests
*** fsck.exfat output ***
ERROR: <path>: more clusters are allocated. truncate to N bytes
...
/dev/vdc: corrupted. directories 331, files 526
/dev/vdc: files corrupted 9, files fixed 0
*** end fsck.exfat output ***
Fixes: d5c514b6a0c0 ("exfat: fix the newly allocated clusters are not freed in error handling")
Signed-off-by: Chi Zhiling <chizhiling@kylinos.cn>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Diffstat (limited to 'scripts/Makefile.thinlto')
0 files changed, 0 insertions, 0 deletions
