diff options
Diffstat (limited to 'fs/ext4/resize.c')
-rw-r--r-- | fs/ext4/resize.c | 64 |
1 files changed, 46 insertions, 18 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 981c8477adab..3ecc6e45d2f9 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -220,7 +220,11 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
220 | memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size); | 220 | memcpy(gdb->b_data, sbi->s_group_desc[i]->b_data, gdb->b_size); |
221 | set_buffer_uptodate(gdb); | 221 | set_buffer_uptodate(gdb); |
222 | unlock_buffer(gdb); | 222 | unlock_buffer(gdb); |
223 | ext4_handle_dirty_metadata(handle, NULL, gdb); | 223 | err = ext4_handle_dirty_metadata(handle, NULL, gdb); |
224 | if (unlikely(err)) { | ||
225 | brelse(gdb); | ||
226 | goto exit_bh; | ||
227 | } | ||
224 | ext4_set_bit(bit, bh->b_data); | 228 | ext4_set_bit(bit, bh->b_data); |
225 | brelse(gdb); | 229 | brelse(gdb); |
226 | } | 230 | } |
@@ -258,7 +262,11 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
258 | 262 | ||
259 | ext4_mark_bitmap_end(input->blocks_count, sb->s_blocksize * 8, | 263 | ext4_mark_bitmap_end(input->blocks_count, sb->s_blocksize * 8, |
260 | bh->b_data); | 264 | bh->b_data); |
261 | ext4_handle_dirty_metadata(handle, NULL, bh); | 265 | err = ext4_handle_dirty_metadata(handle, NULL, bh); |
266 | if (unlikely(err)) { | ||
267 | ext4_std_error(sb, err); | ||
268 | goto exit_bh; | ||
269 | } | ||
262 | brelse(bh); | 270 | brelse(bh); |
263 | /* Mark unused entries in inode bitmap used */ | 271 | /* Mark unused entries in inode bitmap used */ |
264 | ext4_debug("clear inode bitmap %#04llx (+%llu)\n", | 272 | ext4_debug("clear inode bitmap %#04llx (+%llu)\n", |
@@ -270,7 +278,9 @@ static int setup_new_group_blocks(struct super_block *sb, | |||
270 | 278 | ||
271 | ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), sb->s_blocksize * 8, | 279 | ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), sb->s_blocksize * 8, |
272 | bh->b_data); | 280 | bh->b_data); |
273 | ext4_handle_dirty_metadata(handle, NULL, bh); | 281 | err = ext4_handle_dirty_metadata(handle, NULL, bh); |
282 | if (unlikely(err)) | ||
283 | ext4_std_error(sb, err); | ||
274 | exit_bh: | 284 | exit_bh: |
275 | brelse(bh); | 285 | brelse(bh); |
276 | 286 | ||
@@ -422,17 +432,21 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
422 | goto exit_dind; | 432 | goto exit_dind; |
423 | } | 433 | } |
424 | 434 | ||
425 | if ((err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh))) | 435 | err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh); |
436 | if (unlikely(err)) | ||
426 | goto exit_dind; | 437 | goto exit_dind; |
427 | 438 | ||
428 | if ((err = ext4_journal_get_write_access(handle, *primary))) | 439 | err = ext4_journal_get_write_access(handle, *primary); |
440 | if (unlikely(err)) | ||
429 | goto exit_sbh; | 441 | goto exit_sbh; |
430 | 442 | ||
431 | if ((err = ext4_journal_get_write_access(handle, dind))) | 443 | err = ext4_journal_get_write_access(handle, dind); |
432 | goto exit_primary; | 444 | if (unlikely(err)) |
445 | ext4_std_error(sb, err); | ||
433 | 446 | ||
434 | /* ext4_reserve_inode_write() gets a reference on the iloc */ | 447 | /* ext4_reserve_inode_write() gets a reference on the iloc */ |
435 | if ((err = ext4_reserve_inode_write(handle, inode, &iloc))) | 448 | err = ext4_reserve_inode_write(handle, inode, &iloc); |
449 | if (unlikely(err)) | ||
436 | goto exit_dindj; | 450 | goto exit_dindj; |
437 | 451 | ||
438 | n_group_desc = kmalloc((gdb_num + 1) * sizeof(struct buffer_head *), | 452 | n_group_desc = kmalloc((gdb_num + 1) * sizeof(struct buffer_head *), |
@@ -454,12 +468,20 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
454 | * reserved inode, and will become GDT blocks (primary and backup). | 468 | * reserved inode, and will become GDT blocks (primary and backup). |
455 | */ | 469 | */ |
456 | data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)] = 0; | 470 | data[gdb_num % EXT4_ADDR_PER_BLOCK(sb)] = 0; |
457 | ext4_handle_dirty_metadata(handle, NULL, dind); | 471 | err = ext4_handle_dirty_metadata(handle, NULL, dind); |
458 | brelse(dind); | 472 | if (unlikely(err)) { |
473 | ext4_std_error(sb, err); | ||
474 | goto exit_inode; | ||
475 | } | ||
459 | inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; | 476 | inode->i_blocks -= (gdbackups + 1) * sb->s_blocksize >> 9; |
460 | ext4_mark_iloc_dirty(handle, inode, &iloc); | 477 | ext4_mark_iloc_dirty(handle, inode, &iloc); |
461 | memset((*primary)->b_data, 0, sb->s_blocksize); | 478 | memset((*primary)->b_data, 0, sb->s_blocksize); |
462 | ext4_handle_dirty_metadata(handle, NULL, *primary); | 479 | err = ext4_handle_dirty_metadata(handle, NULL, *primary); |
480 | if (unlikely(err)) { | ||
481 | ext4_std_error(sb, err); | ||
482 | goto exit_inode; | ||
483 | } | ||
484 | brelse(dind); | ||
463 | 485 | ||
464 | o_group_desc = EXT4_SB(sb)->s_group_desc; | 486 | o_group_desc = EXT4_SB(sb)->s_group_desc; |
465 | memcpy(n_group_desc, o_group_desc, | 487 | memcpy(n_group_desc, o_group_desc, |
@@ -470,19 +492,19 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
470 | kfree(o_group_desc); | 492 | kfree(o_group_desc); |
471 | 493 | ||
472 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); | 494 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); |
473 | ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh); | 495 | err = ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh); |
496 | if (err) | ||
497 | ext4_std_error(sb, err); | ||
474 | 498 | ||
475 | return 0; | 499 | return err; |
476 | 500 | ||
477 | exit_inode: | 501 | exit_inode: |
478 | /* ext4_journal_release_buffer(handle, iloc.bh); */ | 502 | /* ext4_journal_release_buffer(handle, iloc.bh); */ |
479 | brelse(iloc.bh); | 503 | brelse(iloc.bh); |
480 | exit_dindj: | 504 | exit_dindj: |
481 | /* ext4_journal_release_buffer(handle, dind); */ | 505 | /* ext4_journal_release_buffer(handle, dind); */ |
482 | exit_primary: | ||
483 | /* ext4_journal_release_buffer(handle, *primary); */ | ||
484 | exit_sbh: | 506 | exit_sbh: |
485 | /* ext4_journal_release_buffer(handle, *primary); */ | 507 | /* ext4_journal_release_buffer(handle, EXT4_SB(sb)->s_sbh); */ |
486 | exit_dind: | 508 | exit_dind: |
487 | brelse(dind); | 509 | brelse(dind); |
488 | exit_bh: | 510 | exit_bh: |
@@ -665,7 +687,9 @@ static void update_backups(struct super_block *sb, | |||
665 | memset(bh->b_data + size, 0, rest); | 687 | memset(bh->b_data + size, 0, rest); |
666 | set_buffer_uptodate(bh); | 688 | set_buffer_uptodate(bh); |
667 | unlock_buffer(bh); | 689 | unlock_buffer(bh); |
668 | ext4_handle_dirty_metadata(handle, NULL, bh); | 690 | err = ext4_handle_dirty_metadata(handle, NULL, bh); |
691 | if (unlikely(err)) | ||
692 | ext4_std_error(sb, err); | ||
669 | brelse(bh); | 693 | brelse(bh); |
670 | } | 694 | } |
671 | if ((err2 = ext4_journal_stop(handle)) && !err) | 695 | if ((err2 = ext4_journal_stop(handle)) && !err) |
@@ -883,7 +907,11 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) | |||
883 | /* Update the global fs size fields */ | 907 | /* Update the global fs size fields */ |
884 | sbi->s_groups_count++; | 908 | sbi->s_groups_count++; |
885 | 909 | ||
886 | ext4_handle_dirty_metadata(handle, NULL, primary); | 910 | err = ext4_handle_dirty_metadata(handle, NULL, primary); |
911 | if (unlikely(err)) { | ||
912 | ext4_std_error(sb, err); | ||
913 | goto exit_journal; | ||
914 | } | ||
887 | 915 | ||
888 | /* Update the reserved block counts only once the new group is | 916 | /* Update the reserved block counts only once the new group is |
889 | * active. */ | 917 | * active. */ |