From fb823ed335807a9a4105bda185fd99976b332f7f Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 9 Nov 2003 15:18:01 -0800 Subject: [PATCH] [PATCH] ext2 block allocation race fix 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. --- fs/ext2/balloc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index b63ebc25a245e..a0aa0386f21fa 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -402,6 +402,7 @@ int ext2_new_block(struct inode *inode, unsigned long goal, * 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, unsigned long goal, 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: -- 2.53.0