Message ID | 20241205104835.18223-3-heming.zhao@suse.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Revert ocfs2 commit dfe6c5692fb5 and provide a new fix | expand |
On 12/5/24 6:48 PM, Heming Zhao wrote: > 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. > > 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> > --- > fs/ocfs2/localalloc.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c > index 5df34561c551..d1aa04a5af1b 100644 > --- a/fs/ocfs2/localalloc.c > +++ b/fs/ocfs2/localalloc.c > @@ -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; > }
On 12/5/24 7:10 PM, Joseph Qi wrote: > > > On 12/5/24 6:48 PM, Heming Zhao wrote: >> 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. >> >> 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: <stable@vger.kernel.org> # 6.10+ >> --- >> fs/ocfs2/localalloc.c | 8 +++++--- >> 1 file changed, 5 insertions(+), 3 deletions(-) >> >> diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c >> index 5df34561c551..d1aa04a5af1b 100644 >> --- a/fs/ocfs2/localalloc.c >> +++ b/fs/ocfs2/localalloc.c >> @@ -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; >> } >
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index 5df34561c551..d1aa04a5af1b 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c @@ -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; }
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. 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> --- fs/ocfs2/localalloc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)