Re: [PATCH v1 8/9] ntfs: only count successfully cleared runs when freeing clusters
From: Hyunchul Lee
Date: Mon Aug 24 2026 - 01:10:09 EST
2026년 8월 21일 (금) 오후 2:33, Baolin Liu <liubaolin12138@xxxxxxx>님이 작성:
>
> From: Baolin Liu <liubaolin@xxxxxxxxxx>
>
> ntfs_cluster_free_from_rl_nolock() adds a run's length to nr_freed
> whenever the error bookkeeping condition is false, which includes
> cases where ntfs_bitmap_clear_run() actually failed - e.g. a second
> run failing with the same errno as an earlier one, or any failure
> after a non-ENOMEM error was already recorded. Since a failed
> ntfs_bitmap_clear_run() rolls back its partial modifications, no
> bits were cleared for that run, yet its length still inflates
> vol->free_clusters, corrupting statfs output and the allocator's
> free space gate.
>
> Only count runs whose bitmap clear succeeded.
>
> Fixes: 11ccc9107dc4 ("ntfs: update runlist handling and cluster allocator")
> Signed-off-by: Baolin Liu <liubaolin@xxxxxxxxxx>
Looks good to me.
Reviewed-by: Hyunchul Lee <hyc.lee@xxxxxxxxx>
> ---
> fs/ntfs/lcnalloc.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/fs/ntfs/lcnalloc.c b/fs/ntfs/lcnalloc.c
> index aa2e017a4384..795f71d26895 100644
> --- a/fs/ntfs/lcnalloc.c
> +++ b/fs/ntfs/lcnalloc.c
> @@ -53,10 +53,10 @@ int ntfs_cluster_free_from_rl_nolock(struct ntfs_volume *vol,
> if (rl->lcn < 0)
> continue;
> err = ntfs_bitmap_clear_run(lcnbmp_vi, rl->lcn, rl->length);
> - if (unlikely(err && (!ret || ret == -ENOMEM) && ret != err))
> - ret = err;
> - else
> + if (likely(!err))
> nr_freed += rl->length;
> + else if (!ret || ret == -ENOMEM)
> + ret = err;
> }
> ntfs_inc_free_clusters(vol, nr_freed);
> ntfs_debug("Done.");
> --
> 2.51.0
>
>
--
Thanks,
Hyunchul