]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/ext4/resize.c
ext4: convert number of blocks to clusters properly
[karo-tx-linux.git] / fs / ext4 / resize.c
index d99387b89eddae77a2aa3a7b147f6fc7c9aa858e..b2c8ee56eb98744ab7481e4d0849e2fb5ca71365 100644 (file)
@@ -333,8 +333,8 @@ static struct buffer_head *bclean(handle_t *handle, struct super_block *sb,
        int err;
 
        bh = sb_getblk(sb, blk);
-       if (!bh)
-               return ERR_PTR(-EIO);
+       if (unlikely(!bh))
+               return ERR_PTR(-ENOMEM);
        if ((err = ext4_journal_get_write_access(handle, bh))) {
                brelse(bh);
                bh = ERR_PTR(err);
@@ -410,8 +410,8 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle,
                        return err;
 
                bh = sb_getblk(sb, flex_gd->groups[group].block_bitmap);
-               if (!bh)
-                       return -EIO;
+               if (unlikely(!bh))
+                       return -ENOMEM;
 
                err = ext4_journal_get_write_access(handle, bh);
                if (err)
@@ -466,7 +466,7 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
        meta_bg = EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG);
 
        /* This transaction may be extended/restarted along the way */
-       handle = ext4_journal_start_sb(sb, EXT4_MAX_TRANS_DATA);
+       handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, EXT4_MAX_TRANS_DATA);
        if (IS_ERR(handle))
                return PTR_ERR(handle);
 
@@ -500,8 +500,8 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
                                goto out;
 
                        gdb = sb_getblk(sb, block);
-                       if (!gdb) {
-                               err = -EIO;
+                       if (unlikely(!gdb)) {
+                               err = -ENOMEM;
                                goto out;
                        }
 
@@ -1031,7 +1031,7 @@ static void update_backups(struct super_block *sb, int blk_off, char *data,
        handle_t *handle;
        int err = 0, err2;
 
-       handle = ext4_journal_start_sb(sb, EXT4_MAX_TRANS_DATA);
+       handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, EXT4_MAX_TRANS_DATA);
        if (IS_ERR(handle)) {
                group = 1;
                err = PTR_ERR(handle);
@@ -1064,8 +1064,8 @@ static void update_backups(struct super_block *sb, int blk_off, char *data,
                                        ext4_bg_has_super(sb, group));
 
                bh = sb_getblk(sb, backup_block);
-               if (!bh) {
-                       err = -EIO;
+               if (unlikely(!bh)) {
+                       err = -ENOMEM;
                        break;
                }
                ext4_debug("update metadata backup %llu(+%llu)\n",
@@ -1168,7 +1168,7 @@ static int ext4_add_new_descs(handle_t *handle, struct super_block *sb,
 static struct buffer_head *ext4_get_bitmap(struct super_block *sb, __u64 block)
 {
        struct buffer_head *bh = sb_getblk(sb, block);
-       if (!bh)
+       if (unlikely(!bh))
                return NULL;
        if (!bh_uptodate_or_lock(bh)) {
                if (bh_submit_read(bh) < 0) {
@@ -1247,7 +1247,7 @@ static int ext4_setup_new_descs(handle_t *handle, struct super_block *sb,
 
                ext4_inode_table_set(sb, gdp, group_data->inode_table);
                ext4_free_group_clusters_set(sb, gdp,
-                                            EXT4_B2C(sbi, group_data->free_blocks_count));
+                       EXT4_NUM_B2C(sbi, group_data->free_blocks_count));
                ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb));
                if (ext4_has_group_desc_csum(sb))
                        ext4_itable_unused_set(sb, gdp,
@@ -1349,7 +1349,7 @@ static void ext4_update_super(struct super_block *sb,
 
        /* Update the free space counts */
        percpu_counter_add(&sbi->s_freeclusters_counter,
-                          EXT4_B2C(sbi, free_blocks));
+                          EXT4_NUM_B2C(sbi, free_blocks));
        percpu_counter_add(&sbi->s_freeinodes_counter,
                           EXT4_INODES_PER_GROUP(sb) * flex_gd->count);
 
@@ -1360,7 +1360,7 @@ static void ext4_update_super(struct super_block *sb,
            sbi->s_log_groups_per_flex) {
                ext4_group_t flex_group;
                flex_group = ext4_flex_group(sbi, group_data[0].group);
-               atomic_add(EXT4_B2C(sbi, free_blocks),
+               atomic_add(EXT4_NUM_B2C(sbi, free_blocks),
                           &sbi->s_flex_groups[flex_group].free_clusters);
                atomic_add(EXT4_INODES_PER_GROUP(sb) * flex_gd->count,
                           &sbi->s_flex_groups[flex_group].free_inodes);
@@ -1412,7 +1412,7 @@ static int ext4_flex_group_add(struct super_block *sb,
         * modify each of the reserved GDT dindirect blocks.
         */
        credit = flex_gd->count * 4 + reserved_gdb;
-       handle = ext4_journal_start_sb(sb, credit);
+       handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, credit);
        if (IS_ERR(handle)) {
                err = PTR_ERR(handle);
                goto exit;
@@ -1506,10 +1506,12 @@ static int ext4_setup_next_flex_gd(struct super_block *sb,
                group_data[i].blocks_count = blocks_per_group;
                overhead = ext4_group_overhead_blocks(sb, group + i);
                group_data[i].free_blocks_count = blocks_per_group - overhead;
-               if (ext4_has_group_desc_csum(sb))
+               if (ext4_has_group_desc_csum(sb)) {
                        flex_gd->bg_flags[i] = EXT4_BG_BLOCK_UNINIT |
                                               EXT4_BG_INODE_UNINIT;
-               else
+                       if (!test_opt(sb, INIT_INODE_TABLE))
+                               flex_gd->bg_flags[i] |= EXT4_BG_INODE_ZEROED;
+               } else
                        flex_gd->bg_flags[i] = EXT4_BG_INODE_ZEROED;
        }
 
@@ -1594,7 +1596,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
 
        err = ext4_alloc_flex_bg_array(sb, input->group + 1);
        if (err)
-               return err;
+               goto out;
 
        err = ext4_mb_alloc_groupinfo(sb, input->group + 1);
        if (err)
@@ -1622,7 +1624,7 @@ static int ext4_group_extend_no_check(struct super_block *sb,
        /* We will update the superblock, one block bitmap, and
         * one group descriptor via ext4_group_add_blocks().
         */
-       handle = ext4_journal_start_sb(sb, 3);
+       handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, 3);
        if (IS_ERR(handle)) {
                err = PTR_ERR(handle);
                ext4_warning(sb, "error %d on journal start", err);
@@ -1786,7 +1788,7 @@ static int ext4_convert_meta_bg(struct super_block *sb, struct inode *inode)
                credits += 3;   /* block bitmap, bg descriptor, resize inode */
        }
 
-       handle = ext4_journal_start_sb(sb, credits);
+       handle = ext4_journal_start_sb(sb, EXT4_HT_RESIZE, credits);
        if (IS_ERR(handle))
                return PTR_ERR(handle);