|
@@ -3936,73 +3936,6 @@ int btrfs_clone_file_range(struct file *src_file, loff_t off,
|
|
|
return btrfs_clone_files(dst_file, src_file, off, len, destoff);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * there are many ways the trans_start and trans_end ioctls can lead
|
|
|
- * to deadlocks. They should only be used by applications that
|
|
|
- * basically own the machine, and have a very in depth understanding
|
|
|
- * of all the possible deadlocks and enospc problems.
|
|
|
- */
|
|
|
-static long btrfs_ioctl_trans_start(struct file *file)
|
|
|
-{
|
|
|
- struct inode *inode = file_inode(file);
|
|
|
- struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
|
|
|
- struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
- struct btrfs_trans_handle *trans;
|
|
|
- struct btrfs_file_private *private;
|
|
|
- int ret;
|
|
|
- static bool warned = false;
|
|
|
-
|
|
|
- ret = -EPERM;
|
|
|
- if (!capable(CAP_SYS_ADMIN))
|
|
|
- goto out;
|
|
|
-
|
|
|
- if (!warned) {
|
|
|
- btrfs_warn(fs_info,
|
|
|
- "Userspace transaction mechanism is considered "
|
|
|
- "deprecated and slated to be removed in 4.17. "
|
|
|
- "If you have a valid use case please "
|
|
|
- "speak up on the mailing list");
|
|
|
- WARN_ON(1);
|
|
|
- warned = true;
|
|
|
- }
|
|
|
-
|
|
|
- ret = -EINPROGRESS;
|
|
|
- private = file->private_data;
|
|
|
- if (private && private->trans)
|
|
|
- goto out;
|
|
|
- if (!private) {
|
|
|
- private = kzalloc(sizeof(struct btrfs_file_private),
|
|
|
- GFP_KERNEL);
|
|
|
- if (!private)
|
|
|
- return -ENOMEM;
|
|
|
- file->private_data = private;
|
|
|
- }
|
|
|
-
|
|
|
- ret = -EROFS;
|
|
|
- if (btrfs_root_readonly(root))
|
|
|
- goto out;
|
|
|
-
|
|
|
- ret = mnt_want_write_file(file);
|
|
|
- if (ret)
|
|
|
- goto out;
|
|
|
-
|
|
|
- atomic_inc(&fs_info->open_ioctl_trans);
|
|
|
-
|
|
|
- ret = -ENOMEM;
|
|
|
- trans = btrfs_start_ioctl_transaction(root);
|
|
|
- if (IS_ERR(trans))
|
|
|
- goto out_drop;
|
|
|
-
|
|
|
- private->trans = trans;
|
|
|
- return 0;
|
|
|
-
|
|
|
-out_drop:
|
|
|
- atomic_dec(&fs_info->open_ioctl_trans);
|
|
|
- mnt_drop_write_file(file);
|
|
|
-out:
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
|
|
|
{
|
|
|
struct inode *inode = file_inode(file);
|
|
@@ -4244,30 +4177,6 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * there are many ways the trans_start and trans_end ioctls can lead
|
|
|
- * to deadlocks. They should only be used by applications that
|
|
|
- * basically own the machine, and have a very in depth understanding
|
|
|
- * of all the possible deadlocks and enospc problems.
|
|
|
- */
|
|
|
-long btrfs_ioctl_trans_end(struct file *file)
|
|
|
-{
|
|
|
- struct inode *inode = file_inode(file);
|
|
|
- struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
|
- struct btrfs_file_private *private = file->private_data;
|
|
|
-
|
|
|
- if (!private || !private->trans)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- btrfs_end_transaction(private->trans);
|
|
|
- private->trans = NULL;
|
|
|
-
|
|
|
- atomic_dec(&root->fs_info->open_ioctl_trans);
|
|
|
-
|
|
|
- mnt_drop_write_file(file);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static noinline long btrfs_ioctl_start_sync(struct btrfs_root *root,
|
|
|
void __user *argp)
|
|
|
{
|
|
@@ -5575,10 +5484,6 @@ long btrfs_ioctl(struct file *file, unsigned int
|
|
|
return btrfs_ioctl_dev_info(fs_info, argp);
|
|
|
case BTRFS_IOC_BALANCE:
|
|
|
return btrfs_ioctl_balance(file, NULL);
|
|
|
- case BTRFS_IOC_TRANS_START:
|
|
|
- return btrfs_ioctl_trans_start(file);
|
|
|
- case BTRFS_IOC_TRANS_END:
|
|
|
- return btrfs_ioctl_trans_end(file);
|
|
|
case BTRFS_IOC_TREE_SEARCH:
|
|
|
return btrfs_ioctl_tree_search(file, argp);
|
|
|
case BTRFS_IOC_TREE_SEARCH_V2:
|