aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/resize.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/resize.c')
-rw-r--r--fs/ext4/resize.c28
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
625handle_ib: 626handle_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
687out: 686out:
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