]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ocfs2: fix the space leak in LA when releasing LA
authorHeming Zhao <heming.zhao@suse.com>
Thu, 5 Dec 2024 10:48:33 +0000 (18:48 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 19 Dec 2024 03:04:41 +0000 (19:04 -0800)
Commit 30dd3478c3cd ("ocfs2: correctly use ocfs2_find_next_zero_bit()")
introduced an issue, the ocfs2_sync_local_to_main() ignores the last
contiguous free bits, which causes an OCFS2 volume to lose the last free
clusters of LA window during the release routine.

Please note, because commit dfe6c5692fb5 ("ocfs2: fix the la space leak
when unmounting an ocfs2 volume") was reverted, this commit is a
replacement fix for commit dfe6c5692fb5.

Link: https://lkml.kernel.org/r/20241205104835.18223-3-heming.zhao@suse.com
Fixes: 30dd3478c3cd ("ocfs2: correctly use ocfs2_find_next_zero_bit()")
Signed-off-by: Heming Zhao <heming.zhao@suse.com>
Suggested-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Jun Piao <piaojun@huawei.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/ocfs2/localalloc.c

index 5df34561c551c6e1368f8665b9d9824f712ba51e..d1aa04a5af1b1c8f8d15da0f7ccd65ee2013a214 100644 (file)
@@ -971,9 +971,9 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb,
        start = count = 0;
        left = le32_to_cpu(alloc->id1.bitmap1.i_total);
 
-       while ((bit_off = ocfs2_find_next_zero_bit(bitmap, left, start)) <
-              left) {
-               if (bit_off == start) {
+       while (1) {
+               bit_off = ocfs2_find_next_zero_bit(bitmap, left, start);
+               if ((bit_off < left) && (bit_off == start)) {
                        count++;
                        start++;
                        continue;
@@ -998,6 +998,8 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb,
                        }
                }
 
+               if (bit_off >= left)
+                       break;
                count = 1;
                start = bit_off + 1;
        }