Merge tag 'for-6.7-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
[linux-2.6-microblaze.git] / fs / btrfs / ioctl.c
index 8e7d03b..dfe257e 100644 (file)
@@ -385,7 +385,7 @@ update_flags:
        btrfs_sync_inode_flags_to_i_flags(inode);
        inode_inc_iversion(inode);
        inode_set_ctime_current(inode);
-       ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
+       ret = btrfs_update_inode(trans, BTRFS_I(inode));
 
  out_end_trans:
        btrfs_end_transaction(trans);
@@ -652,18 +652,18 @@ static noinline int create_subvol(struct mnt_idmap *idmap,
        /* Tree log can't currently deal with an inode which is a new root. */
        btrfs_set_log_full_commit(trans);
 
-       ret = btrfs_qgroup_inherit(trans, 0, objectid, inherit);
+       ret = btrfs_qgroup_inherit(trans, 0, objectid, root->root_key.objectid, inherit);
        if (ret)
                goto out;
 
        leaf = btrfs_alloc_tree_block(trans, root, 0, objectid, NULL, 0, 0, 0,
-                                     BTRFS_NESTING_NORMAL);
+                                     0, BTRFS_NESTING_NORMAL);
        if (IS_ERR(leaf)) {
                ret = PTR_ERR(leaf);
                goto out;
        }
 
-       btrfs_mark_buffer_dirty(leaf);
+       btrfs_mark_buffer_dirty(trans, leaf);
 
        inode_item = &root_item->inode;
        btrfs_set_stack_inode_generation(inode_item, 1);
@@ -1528,7 +1528,7 @@ static noinline int key_in_sk(struct btrfs_key *key,
 static noinline int copy_to_sk(struct btrfs_path *path,
                               struct btrfs_key *key,
                               struct btrfs_ioctl_search_key *sk,
-                              size_t *buf_size,
+                              u64 *buf_size,
                               char __user *ubuf,
                               unsigned long *sk_offset,
                               int *num_found)
@@ -1660,7 +1660,7 @@ out:
 
 static noinline int search_ioctl(struct inode *inode,
                                 struct btrfs_ioctl_search_key *sk,
-                                size_t *buf_size,
+                                u64 *buf_size,
                                 char __user *ubuf)
 {
        struct btrfs_fs_info *info = btrfs_sb(inode->i_sb);
@@ -1733,7 +1733,7 @@ static noinline int btrfs_ioctl_tree_search(struct inode *inode,
        struct btrfs_ioctl_search_args __user *uargs = argp;
        struct btrfs_ioctl_search_key sk;
        int ret;
-       size_t buf_size;
+       u64 buf_size;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
@@ -1763,8 +1763,8 @@ static noinline int btrfs_ioctl_tree_search_v2(struct inode *inode,
        struct btrfs_ioctl_search_args_v2 __user *uarg = argp;
        struct btrfs_ioctl_search_args_v2 args;
        int ret;
-       size_t buf_size;
-       const size_t buf_limit = SZ_16M;
+       u64 buf_size;
+       const u64 buf_limit = SZ_16M;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
@@ -2635,6 +2635,12 @@ static long btrfs_ioctl_add_dev(struct btrfs_fs_info *fs_info, void __user *arg)
                return -EINVAL;
        }
 
+       if (fs_info->fs_devices->temp_fsid) {
+               btrfs_err(fs_info,
+                         "device add not supported on cloned temp-fsid mount");
+               return -EINVAL;
+       }
+
        if (!btrfs_exclop_start(fs_info, BTRFS_EXCLOP_DEV_ADD)) {
                if (!btrfs_exclop_start_try_lock(fs_info, BTRFS_EXCLOP_DEV_ADD))
                        return BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS;
@@ -2676,8 +2682,7 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
        struct inode *inode = file_inode(file);
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct btrfs_ioctl_vol_args_v2 *vol_args;
-       struct block_device *bdev = NULL;
-       void *holder;
+       struct bdev_handle *bdev_handle = NULL;
        int ret;
        bool cancel = false;
 
@@ -2714,7 +2719,7 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
                goto err_drop;
 
        /* Exclusive operation is now claimed */
-       ret = btrfs_rm_device(fs_info, &args, &bdev, &holder);
+       ret = btrfs_rm_device(fs_info, &args, &bdev_handle);
 
        btrfs_exclop_finish(fs_info);
 
@@ -2728,8 +2733,8 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg)
        }
 err_drop:
        mnt_drop_write_file(file);
-       if (bdev)
-               blkdev_put(bdev, holder);
+       if (bdev_handle)
+               bdev_release(bdev_handle);
 out:
        btrfs_put_dev_args_from_path(&args);
        kfree(vol_args);
@@ -2742,8 +2747,7 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
        struct inode *inode = file_inode(file);
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct btrfs_ioctl_vol_args *vol_args;
-       struct block_device *bdev = NULL;
-       void *holder;
+       struct bdev_handle *bdev_handle = NULL;
        int ret;
        bool cancel = false;
 
@@ -2770,15 +2774,15 @@ static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)
        ret = exclop_start_or_cancel_reloc(fs_info, BTRFS_EXCLOP_DEV_REMOVE,
                                           cancel);
        if (ret == 0) {
-               ret = btrfs_rm_device(fs_info, &args, &bdev, &holder);
+               ret = btrfs_rm_device(fs_info, &args, &bdev_handle);
                if (!ret)
                        btrfs_info(fs_info, "disk deleted %s", vol_args->name);
                btrfs_exclop_finish(fs_info);
        }
 
        mnt_drop_write_file(file);
-       if (bdev)
-               blkdev_put(bdev, holder);
+       if (bdev_handle)
+               bdev_release(bdev_handle);
 out:
        btrfs_put_dev_args_from_path(&args);
        kfree(vol_args);
@@ -2822,7 +2826,7 @@ static long btrfs_ioctl_fs_info(struct btrfs_fs_info *fs_info,
        }
 
        if (flags_in & BTRFS_FS_INFO_FLAG_GENERATION) {
-               fi_args->generation = fs_info->generation;
+               fi_args->generation = btrfs_get_fs_generation(fs_info);
                fi_args->flags |= BTRFS_FS_INFO_FLAG_GENERATION;
        }
 
@@ -2947,7 +2951,7 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
 
        btrfs_cpu_key_to_disk(&disk_key, &new_root->root_key);
        btrfs_set_dir_item_key(path->nodes[0], di, &disk_key);
-       btrfs_mark_buffer_dirty(path->nodes[0]);
+       btrfs_mark_buffer_dirty(trans, path->nodes[0]);
        btrfs_release_path(path);
 
        btrfs_set_fs_incompat(fs_info, DEFAULT_SUBVOL);
@@ -3131,7 +3135,7 @@ static noinline long btrfs_ioctl_start_sync(struct btrfs_root *root,
                        return PTR_ERR(trans);
 
                /* No running transaction, don't bother */
-               transid = root->fs_info->last_trans_committed;
+               transid = btrfs_get_last_trans_committed(root->fs_info);
                goto out;
        }
        transid = trans->transid;
@@ -3697,7 +3701,8 @@ static long btrfs_ioctl_quota_ctl(struct file *file, void __user *arg)
 
        switch (sa->cmd) {
        case BTRFS_QUOTA_CTL_ENABLE:
-               ret = btrfs_quota_enable(fs_info);
+       case BTRFS_QUOTA_CTL_ENABLE_SIMPLE_QUOTA:
+               ret = btrfs_quota_enable(fs_info, sa);
                break;
        case BTRFS_QUOTA_CTL_DISABLE:
                ret = btrfs_quota_disable(fs_info);