]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/ext4/ioctl.c
ext4: fix WARN_ON from ext4_releasepage()
[karo-tx-linux.git] / fs / ext4 / ioctl.c
index 5439d6a56e991391d1e57682bf713738bf28b3e2..31f4f56a32d64f635208da250e380f8f8697bd6f 100644 (file)
@@ -104,7 +104,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
                } else if (oldflags & EXT4_EOFBLOCKS_FL)
                        ext4_truncate(inode);
 
-               handle = ext4_journal_start(inode, 1);
+               handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
                if (IS_ERR(handle)) {
                        err = PTR_ERR(handle);
                        goto flags_out;
@@ -173,7 +173,7 @@ flags_out:
                }
 
                mutex_lock(&inode->i_mutex);
-               handle = ext4_journal_start(inode, 1);
+               handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
                if (IS_ERR(handle)) {
                        err = PTR_ERR(handle);
                        goto unlock_out;
@@ -313,6 +313,9 @@ mext_out:
                if (err == 0)
                        err = err2;
                mnt_drop_write_file(filp);
+               if (!err && ext4_has_group_desc_csum(sb) &&
+                   test_opt(sb, INIT_INODE_TABLE))
+                       err = ext4_register_li_request(sb, input.group);
 group_add_out:
                ext4_resize_end(sb);
                return err;
@@ -358,6 +361,7 @@ group_add_out:
                ext4_fsblk_t n_blocks_count;
                struct super_block *sb = inode->i_sb;
                int err = 0, err2 = 0;
+               ext4_group_t o_group = EXT4_SB(sb)->s_groups_count;
 
                if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
                               EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
@@ -366,26 +370,11 @@ group_add_out:
                        return -EOPNOTSUPP;
                }
 
-               if (EXT4_HAS_INCOMPAT_FEATURE(sb,
-                              EXT4_FEATURE_INCOMPAT_META_BG)) {
-                       ext4_msg(sb, KERN_ERR,
-                                "Online resizing not (yet) supported with meta_bg");
-                       return -EOPNOTSUPP;
-               }
-
                if (copy_from_user(&n_blocks_count, (__u64 __user *)arg,
                                   sizeof(__u64))) {
                        return -EFAULT;
                }
 
-               if (n_blocks_count > MAX_32_NUM &&
-                   !EXT4_HAS_INCOMPAT_FEATURE(sb,
-                                              EXT4_FEATURE_INCOMPAT_64BIT)) {
-                       ext4_msg(sb, KERN_ERR,
-                                "File system only supports 32-bit block numbers");
-                       return -EOPNOTSUPP;
-               }
-
                err = ext4_resize_begin(sb);
                if (err)
                        return err;
@@ -403,6 +392,11 @@ group_add_out:
                if (err == 0)
                        err = err2;
                mnt_drop_write_file(filp);
+               if (!err && (o_group > EXT4_SB(sb)->s_groups_count) &&
+                   ext4_has_group_desc_csum(sb) &&
+                   test_opt(sb, INIT_INODE_TABLE))
+                       err = ext4_register_li_request(sb, o_group);
+
 resizefs_out:
                ext4_resize_end(sb);
                return err;
@@ -420,13 +414,6 @@ resizefs_out:
                if (!blk_queue_discard(q))
                        return -EOPNOTSUPP;
 
-               if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
-                              EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
-                       ext4_msg(sb, KERN_ERR,
-                                "FITRIM not supported with bigalloc");
-                       return -EOPNOTSUPP;
-               }
-
                if (copy_from_user(&range, (struct fstrim_range __user *)arg,
                    sizeof(range)))
                        return -EFAULT;