aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/inode.c5
-rw-r--r--fs/ext4/namei.c5
-rw-r--r--fs/ext4/resize.c28
-rw-r--r--fs/ext4/super.c17
-rw-r--r--fs/ext4/xattr.c27
5 files changed, 51 insertions, 31 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 05f01fbd9c7f..22a9d8159720 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -5835,9 +5835,10 @@ int ext4_mark_iloc_dirty(handle_t *handle,
5835{ 5835{
5836 int err = 0; 5836 int err = 0;
5837 5837
5838 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) 5838 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) {
5839 put_bh(iloc->bh);
5839 return -EIO; 5840 return -EIO;
5840 5841 }
5841 if (IS_I_VERSION(inode)) 5842 if (IS_I_VERSION(inode))
5842 inode_inc_iversion(inode); 5843 inode_inc_iversion(inode);
5843 5844
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 17adcb16a9c8..437f71fe83ae 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -126,6 +126,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
126 if (!is_dx_block && type == INDEX) { 126 if (!is_dx_block && type == INDEX) {
127 ext4_error_inode(inode, func, line, block, 127 ext4_error_inode(inode, func, line, block,
128 "directory leaf block found instead of index block"); 128 "directory leaf block found instead of index block");
129 brelse(bh);
129 return ERR_PTR(-EFSCORRUPTED); 130 return ERR_PTR(-EFSCORRUPTED);
130 } 131 }
131 if (!ext4_has_metadata_csum(inode->i_sb) || 132 if (!ext4_has_metadata_csum(inode->i_sb) ||
@@ -2811,7 +2812,9 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode)
2811 list_del_init(&EXT4_I(inode)->i_orphan); 2812 list_del_init(&EXT4_I(inode)->i_orphan);
2812 mutex_unlock(&sbi->s_orphan_lock); 2813 mutex_unlock(&sbi->s_orphan_lock);
2813 } 2814 }
2814 } 2815 } else
2816 brelse(iloc.bh);
2817
2815 jbd_debug(4, "superblock will point to %lu\n", inode->i_ino); 2818 jbd_debug(4, "superblock will point to %lu\n", inode->i_ino);
2816 jbd_debug(4, "orphan inode %lu will point to %d\n", 2819 jbd_debug(4, "orphan inode %lu will point to %d\n",
2817 inode->i_ino, NEXT_ORPHAN(inode)); 2820 inode->i_ino, NEXT_ORPHAN(inode));
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
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index a221f1cdf704..53ff6c2a26ed 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4075,6 +4075,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
4075 sbi->s_groups_count = blocks_count; 4075 sbi->s_groups_count = blocks_count;
4076 sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,