diff options
Diffstat (limited to 'fs/ext4/resize.c')
-rw-r--r-- | fs/ext4/resize.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index ebbc663d0798..a5efee34415f 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -459,16 +459,18 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle, | |||
459 | 459 | ||
460 | BUFFER_TRACE(bh, "get_write_access"); | 460 | BUFFER_TRACE(bh, "get_write_access"); |
461 | err = ext4_journal_get_write_access(handle, bh); | 461 | err = ext4_journal_get_write_access(handle, bh); |
462 | if (err) | 462 | if (err) { |
463 | brelse(bh); | ||
463 | return err; | 464 | return err; |
465 | } | ||
464 | ext4_debug("mark block bitmap %#04llx (+%llu/%u)\n", | 466 | ext4_debug("mark block bitmap %#04llx (+%llu/%u)\n", |
465 | first_cluster, first_cluster - start, count2); | 467 | first_cluster, first_cluster - start, count2); |
466 | ext4_set_bits(bh->b_data, first_cluster - start, count2); | 468 | ext4_set_bits(bh->b_data, first_cluster - start, count2); |
467 | 469 | ||
468 | err = ext4_handle_dirty_metadata(handle, NULL, bh); | 470 | err = ext4_handle_dirty_metadata(handle, NULL, bh); |
471 | brelse(bh); | ||
469 | if (unlikely(err)) | 472 | if (unlikely(err)) |
470 | return err; | 473 | return err; |
471 | brelse(bh); | ||
472 | } | 474 | } |
473 | 475 | ||
474 | return 0; | 476 | return 0; |
@@ -605,7 +607,6 @@ handle_bb: | |||
605 | bh = bclean(handle, sb, block); | 607 | bh = bclean(handle, sb, block); |
606 | if (IS_ERR(bh)) { | 608 | if (IS_ERR(bh)) { |
607 | err = PTR_ERR(bh); | 609 | err = PTR_ERR(bh); |
608 | bh = NULL; | ||
609 | goto out; | 610 | goto out; |
610 | } | 611 | } |
611 | overhead = ext4_group_overhead_blocks(sb, group); | 612 | overhead = ext4_group_overhead_blocks(sb, group); |
@@ -618,9 +619,9 @@ handle_bb: | |||
618 | ext4_mark_bitmap_end(EXT4_B2C(sbi, group_data[i].blocks_count), | 619 | ext4_mark_bitmap_end(EXT4_B2C(sbi, group_data[i].blocks_count), |
619 | sb->s_blocksize * 8, bh->b_data); | 620 | sb->s_blocksize * 8, bh->b_data); |
620 | err = ext4_handle_dirty_metadata(handle, NULL, bh); | 621 | err = ext4_handle_dirty_metadata(handle, NULL, bh); |
622 | brelse(bh); | ||
621 | if (err) | 623 | if (err) |
622 | goto out; | 624 | goto out; |
623 | brelse(bh); | ||
624 | 625 | ||
625 | handle_ib: | 626 | handle_ib: |
626 | if (bg_flags[i] & EXT4_BG_INODE_UNINIT) | 627 | if (bg_flags[i] & EXT4_BG_INODE_UNINIT) |
@@ -635,18 +636,16 @@ handle_ib: | |||
635 | bh = bclean(handle, sb, block); | 636 | bh = bclean(handle, sb, block); |
636 | if (IS_ERR(bh)) { | 637 | if (IS_ERR(bh)) { |
637 | err = PTR_ERR(bh); | 638 | err = PTR_ERR(bh); |
638 | bh = NULL; | ||
639 | goto out; | 639 | goto out; |
640 | } | 640 | } |
641 | 641 | ||
642 | ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), | 642 | ext4_mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), |
643 | sb->s_blocksize * 8, bh->b_data); | 643 | sb->s_blocksize * 8, bh->b_data); |
644 | err = ext4_handle_dirty_metadata(handle, NULL, bh); | 644 | err = ext4_handle_dirty_metadata(handle, NULL, bh); |
645 | brelse(bh); | ||
645 | if (err) | 646 | if (err) |
646 | goto out; | 647 | goto out; |
647 | brelse(bh); | ||
648 | } | 648 | } |
649 | bh = NULL; | ||
650 | 649 | ||
651 | /* Mark group tables in block bitmap */ | 650 | /* Mark group tables in block bitmap */ |
652 | for (j = 0; j < GROUP_TABLE_COUNT; j++) { | 651 | for (j = 0; j < GROUP_TABLE_COUNT; j++) { |
@@ -685,7 +684,6 @@ handle_ib: | |||
685 | } | 684 | } |
686 | 685 | ||
687 | out: | 686 | out: |
688 | brelse(bh); | ||
689 | err2 = ext4_journal_stop(handle); | 687 | err2 = ext4_journal_stop(handle); |
690 | if (err2 && !err) | 688 | if (err2 && !err) |
691 | err = err2; | 689 | err = err2; |
@@ -873,6 +871,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
873 | err = ext4_handle_dirty_metadata(handle, NULL, gdb_bh); | 871 | err = ext4_handle_dirty_metadata(handle, NULL, gdb_bh); |
874 | if (unlikely(err)) { | 872 | if (unlikely(err)) { |
875 | ext4_std_error(sb, err); | 873 | ext4_std_error(sb, err); |
874 | iloc.bh = NULL; | ||
876 | goto exit_inode; | 875 | goto exit_inode; |
877 | } | 876 | } |
878 | brelse(dind); | 877 | brelse(dind); |
@@ -924,6 +923,7 @@ static int add_new_gdb_meta_bg(struct super_block *sb, | |||
924 | sizeof(struct buffer_head *), | 923 | sizeof(struct buffer_head *), |
925 | GFP_NOFS); | 924 | GFP_NOFS); |
926 | if (!n_group_desc) { | 925 | if (!n_group_desc) { |
926 | brelse(gdb_bh); | ||
927 | err = -ENOMEM; | 927 | err = -ENOMEM; |
928 | ext4_warning(sb, "not enough memory for %lu groups", | 928 | ext4_warning(sb, "not enough memory for %lu groups", |
929 | gdb_num + 1); | 929 | gdb_num + 1); |
@@ -939,8 +939,6 @@ static int add_new_gdb_meta_bg(struct super_block *sb, | |||
939 | kvfree(o_group_desc); | 939 | kvfree(o_group_desc); |
940 | BUFFER_TRACE(gdb_bh, "get_write_access"); | 940 | BUFFER_TRACE(gdb_bh, "get_write_access"); |
941 | err = ext4_journal_get_write_access(handle, gdb_bh); | 941 | err = ext4_journal_get_write_access(handle, gdb_bh); |
942 | if (unlikely(err)) | ||
943 | brelse(gdb_bh); | ||
944 | return err; | 942 | return err; |
945 | } | 943 | } |
946 | 944 | ||
@@ -1124,8 +1122,10 @@ static void update_backups(struct super_block *sb, sector_t blk_off, char *data, | |||
1124 | backup_block, backup_block - | 1122 | backup_block, backup_block - |
1125 | ext4_group_first_block_no(sb, group)); | 1123 | ext4_group_first_block_no(sb, group)); |
1126 | BUFFER_TRACE(bh, "get_write_access"); | 1124 | BUFFER_TRACE(bh, "get_write_access"); |
1127 | if ((err = ext4_journal_get_write_access(handle, bh))) | 1125 | if ((err = ext4_journal_get_write_access(handle, bh))) { |
1126 | brelse(bh); | ||
1128 | break; | 1127 | break; |
1128 | } | ||
1129 | lock_buffer(bh); | 1129 | lock_buffer(bh); |
1130 | memcpy(bh->b_data, data, size); | 1130 | memcpy(bh->b_data, data, size); |
1131 | if (rest) | 1131 | if (rest) |
@@ -2023,7 +2023,7 @@ retry: | |||
2023 | 2023 | ||
2024 | err = ext4_alloc_flex_bg_array(sb, n_group + 1); | 2024 | err = ext4_alloc_flex_bg_array(sb, n_group + 1); |
2025 | if (err) | 2025 | if (err) |
2026 | return err; | 2026 | goto out; |
2027 | 2027 | ||
2028 | err = ext4_mb_alloc_groupinfo(sb, n_group + 1); | 2028 | err = ext4_mb_alloc_groupinfo(sb, n_group + 1); |
2029 | if (err) | 2029 | if (err) |
@@ -2059,6 +2059,10 @@ retry: | |||
2059 | n_blocks_count_retry = 0; | 2059 | n_blocks_count_retry = 0; |
2060 | free_flex_gd(flex_gd); | 2060 | free_flex_gd(flex_gd); |
2061 | flex_gd = NULL; | 2061 | flex_gd = NULL; |
2062 | if (resize_inode) { | ||
2063 | iput(resize_inode); | ||
2064 | resize_inode = NULL; | ||
2065 | } | ||
2062 | goto retry; | 2066 | goto retry; |
2063 | } | 2067 | } |
2064 | 2068 | ||