If this CPU decides that an ext2 block group has a free block it will then go
in and try to acquire it. No locks are held, so another CPU can come in and
steal the last block.
In this case we will bogusly report a corrupted filessytem.
Fix it by just restarting the scan - this will choose a different blockgroup
or will generate -ENOSPC.
* Now search the rest of the groups. We assume that
* i and desc correctly point to the last group visited.
*/
+retry:
for (bit = 0; !group_alloc &&
bit < sbi->s_groups_count; bit++) {
group_no++;
ret_block = grab_block(sb_bgl_lock(sbi, group_no), bitmap_bh->b_data,
group_size, 0);
if (ret_block < 0) {
- ext2_error (sb, "ext2_new_block",
- "Free blocks count corrupted for block group %d",
- group_no);
+ /*
+ * Someone else grabbed the last free block in this blockgroup
+ * before us. Retry the scan.
+ */
group_alloc = 0;
- goto io_error;
+ goto retry;
}
got_block: