]> Pileus Git - ~andy/linux/blobdiff - fs/ext4/resize.c
Merge branch 'samsung/fixes' of git+ssh://master.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / fs / ext4 / resize.c
index 9e453552f10eb41169e3cecbebc9417bbaa019e4..707d3f16f7ce63732222e78c247a8a87e668b433 100644 (file)
@@ -467,12 +467,13 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
        if (unlikely(err))
                goto exit_dindj;
 
-       n_group_desc = kmalloc((gdb_num + 1) * sizeof(struct buffer_head *),
-                       GFP_NOFS);
+       n_group_desc = ext4_kvmalloc((gdb_num + 1) *
+                                    sizeof(struct buffer_head *),
+                                    GFP_NOFS);
        if (!n_group_desc) {
                err = -ENOMEM;
-               ext4_warning(sb,
-                             "not enough memory for %lu groups", gdb_num + 1);
+               ext4_warning(sb, "not enough memory for %lu groups",
+                            gdb_num + 1);
                goto exit_inode;
        }
 
@@ -507,7 +508,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
        n_group_desc[gdb_num] = gdb_bh;
        EXT4_SB(sb)->s_group_desc = n_group_desc;
        EXT4_SB(sb)->s_gdb_count++;
-       kfree(o_group_desc);
+       ext4_kvfree(o_group_desc);
 
        le16_add_cpu(&es->s_reserved_gdt_blocks, -1);
        err = ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh);
@@ -517,6 +518,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode,
        return err;
 
 exit_inode:
+       ext4_kvfree(n_group_desc);
        /* ext4_handle_release_buffer(handle, iloc.bh); */
        brelse(iloc.bh);
 exit_dindj:
@@ -546,7 +548,7 @@ exit_bh:
  * backup GDT blocks are stored in their reserved primary GDT block.
  */
 static int reserve_backup_gdb(handle_t *handle, struct inode *inode,
-                             struct ext4_new_group_data *input)
+                             ext4_group_t group)
 {
        struct super_block *sb = inode->i_sb;
        int reserved_gdb =le16_to_cpu(EXT4_SB(sb)->s_es->s_reserved_gdt_blocks);
@@ -617,7 +619,7 @@ static int reserve_backup_gdb(handle_t *handle, struct inode *inode,
         * Finally we can add each of the reserved backup GDT blocks from
         * the new group to its reserved primary GDT block.
         */
-       blk = input->group * EXT4_BLOCKS_PER_GROUP(sb);
+       blk = group * EXT4_BLOCKS_PER_GROUP(sb);
        for (i = 0; i < reserved_gdb; i++) {
                int err2;
                data = (__le32 *)primary[i]->b_data;
@@ -831,9 +833,11 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
                if ((err = ext4_journal_get_write_access(handle, primary)))
                        goto exit_journal;
 
-               if (reserved_gdb && ext4_bg_num_gdb(sb, input->group) &&
-                   (err = reserve_backup_gdb(handle, inode, input)))
-                       goto exit_journal;
+               if (reserved_gdb && ext4_bg_num_gdb(sb, input->group)) {
+                       err = reserve_backup_gdb(handle, inode, input->group);
+                       if (err)
+                               goto exit_journal;
+               }
        } else {
                /*
                 * Note that we can access new group descriptor block safely