]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
btrfs: Refactor btrfs_calc_avail_data_space
authorNikolay Borisov <nborisov@suse.com>
Wed, 3 Jul 2019 12:32:59 +0000 (15:32 +0300)
committerDavid Sterba <dsterba@suse.com>
Mon, 9 Sep 2019 12:59:02 +0000 (14:59 +0200)
Simplify the code by removing variables that don't bring any real value
as well as simplifying the checks when buidling the candidate list of
devices. No functional changes.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/super.c

index 78de9d5d80c6f0b63f19094c40b01f8569f5d447..10bc7e6cca750e51baff4c8733eb8c428d371f1c 100644 (file)
@@ -1899,11 +1899,10 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
        struct btrfs_device_info *devices_info;
        struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
        struct btrfs_device *device;
-       u64 skip_space;
        u64 type;
        u64 avail_space;
        u64 min_stripe_size;
-       int min_stripes, num_stripes = 1;
+       int num_stripes = 1;
        int i = 0, nr_devices;
        const struct btrfs_raid_attr *rattr;
 
@@ -1930,7 +1929,6 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
        /* calc min stripe number for data space allocation */
        type = btrfs_data_alloc_profile(fs_info);
        rattr = &btrfs_raid_array[btrfs_bg_flags_to_raid_index(type)];
-       min_stripes = rattr->devs_min;
 
        if (type & BTRFS_BLOCK_GROUP_RAID0)
                num_stripes = nr_devices;
@@ -1956,28 +1954,21 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
                avail_space = device->total_bytes - device->bytes_used;
 
                /* align with stripe_len */
-               avail_space = div_u64(avail_space, BTRFS_STRIPE_LEN);
-               avail_space *= BTRFS_STRIPE_LEN;
+               avail_space = rounddown(avail_space, BTRFS_STRIPE_LEN);
 
                /*
                 * In order to avoid overwriting the superblock on the drive,
                 * btrfs starts at an offset of at least 1MB when doing chunk
                 * allocation.
+                *
+                * This ensures we have at least min_stripe_size free space
+                * after excluding 1MB.
                 */
-               skip_space = SZ_1M;
-
-               /*
-                * we can use the free space in [0, skip_space - 1], subtract
-                * it from the total.
-                */
-               if (avail_space && avail_space >= skip_space)
-                       avail_space -= skip_space;
-               else
-                       avail_space = 0;
-
-               if (avail_space < min_stripe_size)
+               if (avail_space <= SZ_1M + min_stripe_size)
                        continue;
 
+               avail_space -= SZ_1M;
+
                devices_info[i].dev = device;
                devices_info[i].max_avail = avail_space;
 
@@ -1991,9 +1982,8 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
 
        i = nr_devices - 1;
        avail_space = 0;
-       while (nr_devices >= min_stripes) {
-               if (num_stripes > nr_devices)
-                       num_stripes = nr_devices;
+       while (nr_devices >= rattr->devs_min) {
+               num_stripes = min(num_stripes, nr_devices);
 
                if (devices_info[i].max_avail >= min_stripe_size) {
                        int j;