[PATCH] ext3 filesystem bogus ENOSPC with reservation fix

To handle the earlier bogus ENOSPC error caused by filesystem full of block
reservation, current code falls back to non block reservation, starts to
allocate block(s) from the goal allocation block group as if there is no
block reservation.

Current code needs to re-load the corresponding block group descriptor for
the initial goal block group in this case. The patch fixes this.

Signed-off-by: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Mingming Cao and committed by Linus Torvalds 08fb306f 607eb266

+3 -3
+3 -3
fs/ext3/balloc.c
··· 1269 goal = le32_to_cpu(es->s_first_data_block); 1270 group_no = (goal - le32_to_cpu(es->s_first_data_block)) / 1271 EXT3_BLOCKS_PER_GROUP(sb); 1272 gdp = ext3_get_group_desc(sb, group_no, &gdp_bh); 1273 if (!gdp) 1274 goto io_error; 1275 1276 - goal_group = group_no; 1277 - retry: 1278 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count); 1279 /* 1280 * if there is not enough free blocks to make a new resevation ··· 1349 if (my_rsv) { 1350 my_rsv = NULL; 1351 group_no = goal_group; 1352 - goto retry; 1353 } 1354 /* No space left on the device */ 1355 *errp = -ENOSPC;
··· 1269 goal = le32_to_cpu(es->s_first_data_block); 1270 group_no = (goal - le32_to_cpu(es->s_first_data_block)) / 1271 EXT3_BLOCKS_PER_GROUP(sb); 1272 + goal_group = group_no; 1273 + retry_alloc: 1274 gdp = ext3_get_group_desc(sb, group_no, &gdp_bh); 1275 if (!gdp) 1276 goto io_error; 1277 1278 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count); 1279 /* 1280 * if there is not enough free blocks to make a new resevation ··· 1349 if (my_rsv) { 1350 my_rsv = NULL; 1351 group_no = goal_group; 1352 + goto retry_alloc; 1353 } 1354 /* No space left on the device */ 1355 *errp = -ENOSPC;