btrfs_rm_device() has a section of the code to check for min number
of the devices required by various group profile. This patch move
that part of the code in the function __check_raid_min_devices()

Signed-off-by: Anand Jain <anand.j...@oracle.com>
---
 fs/btrfs/volumes.c | 78 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 43 insertions(+), 35 deletions(-)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 2f8b974..1573997 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1637,61 +1637,69 @@ out:
        return ret;
 }
 
-int btrfs_rm_device(struct btrfs_root *root, char *device_path, u64 devid)
+static int __check_raid_min_devices(struct btrfs_fs_info *fs_info)
 {
-       struct btrfs_device *device;
-       struct btrfs_device *next_device;
-       struct block_device *bdev = NULL;
-       struct buffer_head *bh = NULL;
-       struct btrfs_super_block *disk_super = NULL;
-       struct btrfs_fs_devices *cur_devices;
        u64 all_avail;
        u64 num_devices;
-       u8 *dev_uuid;
        unsigned seq;
-       int ret = 0;
-       bool clear_super = false;
-       char *dev_name = NULL;
-
-       mutex_lock(&uuid_mutex);
 
-       do {
-               seq = read_seqbegin(&root->fs_info->profiles_lock);
-
-               all_avail = root->fs_info->avail_data_alloc_bits |
-                           root->fs_info->avail_system_alloc_bits |
-                           root->fs_info->avail_metadata_alloc_bits;
-       } while (read_seqretry(&root->fs_info->profiles_lock, seq));
-
-       num_devices = root->fs_info->fs_devices->num_devices;
-       btrfs_dev_replace_lock(&root->fs_info->dev_replace);
-       if (btrfs_dev_replace_is_ongoing(&root->fs_info->dev_replace)) {
+       num_devices = fs_info->fs_devices->num_devices;
+       btrfs_dev_replace_lock(&fs_info->dev_replace);
+       if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
                WARN_ON(num_devices < 1);
                num_devices--;
        }
-       btrfs_dev_replace_unlock(&root->fs_info->dev_replace);
+       btrfs_dev_replace_unlock(&fs_info->dev_replace);
+
+       do {
+               seq = read_seqbegin(&fs_info->profiles_lock);
+
+               all_avail = fs_info->avail_data_alloc_bits |
+                           fs_info->avail_system_alloc_bits |
+                           fs_info->avail_metadata_alloc_bits;
+       } while (read_seqretry(&fs_info->profiles_lock, seq));
 
        if ((all_avail & BTRFS_BLOCK_GROUP_RAID10) && num_devices <= 4) {
-               ret = BTRFS_ERROR_DEV_RAID10_MIN_NOT_MET;
-               goto out;
+               return BTRFS_ERROR_DEV_RAID10_MIN_NOT_MET;
        }
 
        if ((all_avail & BTRFS_BLOCK_GROUP_RAID1) && num_devices <= 2) {
-               ret = BTRFS_ERROR_DEV_RAID1_MIN_NOT_MET;
-               goto out;
+               return BTRFS_ERROR_DEV_RAID1_MIN_NOT_MET;
        }
 
        if ((all_avail & BTRFS_BLOCK_GROUP_RAID5) &&
-           root->fs_info->fs_devices->rw_devices <= 2) {
-               ret = BTRFS_ERROR_DEV_RAID5_MIN_NOT_MET;
-               goto out;
+           fs_info->fs_devices->rw_devices <= 2) {
+               return BTRFS_ERROR_DEV_RAID5_MIN_NOT_MET;
        }
+
        if ((all_avail & BTRFS_BLOCK_GROUP_RAID6) &&
-           root->fs_info->fs_devices->rw_devices <= 3) {
-               ret = BTRFS_ERROR_DEV_RAID6_MIN_NOT_MET;
-               goto out;
+           fs_info->fs_devices->rw_devices <= 3) {
+               return BTRFS_ERROR_DEV_RAID6_MIN_NOT_MET;
        }
 
+       return 0;
+}
+
+int btrfs_rm_device(struct btrfs_root *root, char *device_path, u64 devid)
+{
+       struct btrfs_device *device;
+       struct btrfs_device *next_device;
+       struct block_device *bdev = NULL;
+       struct buffer_head *bh = NULL;
+       struct btrfs_super_block *disk_super = NULL;
+       struct btrfs_fs_devices *cur_devices;
+       u64 num_devices;
+       u8 *dev_uuid;
+       int ret = 0;
+       bool clear_super = false;
+       char *dev_name = NULL;
+
+       mutex_lock(&uuid_mutex);
+
+       ret = __check_raid_min_devices(root->fs_info);
+       if (ret)
+               goto out;
+
        if (devid) {
                device = btrfs_find_device(root->fs_info, devid,
                                NULL, NULL);
-- 
2.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to