diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index f7beb9b0d37a..b437d3bdf95e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2194,6 +2194,8 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, | |||
2194 | again: | 2194 | again: |
2195 | spin_lock(&em_tree->lock); | 2195 | spin_lock(&em_tree->lock); |
2196 | em = lookup_extent_mapping(em_tree, start, len); | 2196 | em = lookup_extent_mapping(em_tree, start, len); |
2197 | if (em) | ||
2198 | em->bdev = root->fs_info->fs_devices->latest_bdev; | ||
2197 | spin_unlock(&em_tree->lock); | 2199 | spin_unlock(&em_tree->lock); |
2198 | 2200 | ||
2199 | if (em) { | 2201 | if (em) { |
@@ -2212,7 +2214,7 @@ again: | |||
2212 | 2214 | ||
2213 | em->start = EXTENT_MAP_HOLE; | 2215 | em->start = EXTENT_MAP_HOLE; |
2214 | em->len = (u64)-1; | 2216 | em->len = (u64)-1; |
2215 | em->bdev = inode->i_sb->s_bdev; | 2217 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
2216 | ret = btrfs_lookup_file_extent(trans, root, path, | 2218 | ret = btrfs_lookup_file_extent(trans, root, path, |
2217 | objectid, start, trans != NULL); | 2219 | objectid, start, trans != NULL); |
2218 | if (ret < 0) { | 2220 | if (ret < 0) { |
@@ -3101,6 +3103,27 @@ out: | |||
3101 | return ret; | 3103 | return ret; |
3102 | } | 3104 | } |
3103 | 3105 | ||
3106 | long btrfs_ioctl_rm_dev(struct btrfs_root *root, void __user *arg) | ||
3107 | { | ||
3108 | struct btrfs_ioctl_vol_args *vol_args; | ||
3109 | int ret; | ||
3110 | |||
3111 | vol_args = kmalloc(sizeof(*vol_args), GFP_NOFS); | ||
3112 | |||
3113 | if (!vol_args) | ||
3114 | return -ENOMEM; | ||
3115 | |||
3116 | if (copy_from_user(vol_args, arg, sizeof(*vol_args))) { | ||
3117 | ret = -EFAULT; | ||
3118 | goto out; | ||
3119 | } | ||
3120 | ret = btrfs_rm_device(root, vol_args->name); | ||
3121 | |||
3122 | out: | ||
3123 | kfree(vol_args); | ||
3124 | return ret; | ||
3125 | } | ||
3126 | |||
3104 | int dup_item_to_inode(struct btrfs_trans_handle *trans, | 3127 | int dup_item_to_inode(struct btrfs_trans_handle *trans, |
3105 | struct btrfs_root *root, | 3128 | struct btrfs_root *root, |
3106 | struct btrfs_path *path, | 3129 | struct btrfs_path *path, |
@@ -3294,6 +3317,8 @@ long btrfs_ioctl(struct file *file, unsigned int | |||
3294 | return btrfs_ioctl_resize(root, (void __user *)arg); | 3317 | return btrfs_ioctl_resize(root, (void __user *)arg); |
3295 | case BTRFS_IOC_ADD_DEV: | 3318 | case BTRFS_IOC_ADD_DEV: |
3296 | return btrfs_ioctl_add_dev(root, (void __user *)arg); | 3319 | return btrfs_ioctl_add_dev(root, (void __user *)arg); |
3320 | case BTRFS_IOC_RM_DEV: | ||
3321 | return btrfs_ioctl_rm_dev(root, (void __user *)arg); | ||
3297 | case BTRFS_IOC_BALANCE: | 3322 | case BTRFS_IOC_BALANCE: |
3298 | return btrfs_balance(root->fs_info->dev_root); | 3323 | return btrfs_balance(root->fs_info->dev_root); |
3299 | case BTRFS_IOC_CLONE: | 3324 | case BTRFS_IOC_CLONE: |