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 sifferent blockgroup or will generate -ENOSPC. 25-akpm/fs/ext2/balloc.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff -puN fs/ext2/balloc.c~ext2-allocation-fix fs/ext2/balloc.c --- 25/fs/ext2/balloc.c~ext2-allocation-fix Wed Oct 29 15:56:43 2003 +++ 25-akpm/fs/ext2/balloc.c Wed Oct 29 15:56:43 2003 @@ -402,6 +402,7 @@ int ext2_new_block(struct inode *inode, * 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++; @@ -425,11 +426,12 @@ int ext2_new_block(struct inode *inode, 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: _