btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE
authorAnand Jain <anand.jain@oracle.com>
Mon, 4 Dec 2017 04:54:52 +0000 (12:54 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 22 Jan 2018 15:08:15 +0000 (16:08 +0100)
Currently device state is being managed by each individual int
variable such as struct btrfs_device::writeable. Instead of that
declare device state BTRFS_DEV_STATE_WRITEABLE and use the
bit operations.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
[ whitespace adjustments ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.c
fs/btrfs/ioctl.c
fs/btrfs/scrub.c
fs/btrfs/volumes.c
fs/btrfs/volumes.h

index 5f9430063c50cc01087761d3a6e34c57897e62fe..396f8183ee865bbd697d0bbd4c15e2b113f06c74 100644 (file)
@@ -3393,7 +3393,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
                        continue;
                if (!dev->bdev)
                        continue;
-               if (!dev->in_fs_metadata || !dev->writeable)
+               if (!dev->in_fs_metadata ||
+                   !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
                        continue;
 
                write_dev_flush(dev);
@@ -3408,7 +3409,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
                        errors_wait++;
                        continue;
                }
-               if (!dev->in_fs_metadata || !dev->writeable)
+               if (!dev->in_fs_metadata ||
+                   !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
                        continue;
 
                ret = wait_dev_flush(dev);
@@ -3505,7 +3507,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
                        total_errors++;
                        continue;
                }
-               if (!dev->in_fs_metadata || !dev->writeable)
+               if (!dev->in_fs_metadata ||
+                   !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
                        continue;
 
                btrfs_set_stack_device_generation(dev_item, 0);
@@ -3544,7 +3547,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
        list_for_each_entry(dev, head, dev_list) {
                if (!dev->bdev)
                        continue;
-               if (!dev->in_fs_metadata || !dev->writeable)
+               if (!dev->in_fs_metadata ||
+                   !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
                        continue;
 
                ret = wait_dev_supers(dev, max_mirrors);
index 7411f65099d18195a48a3f944a539d453f0f74f5..53cb2a1d025f3441a9e9e79fa6f314e3a8392f77 100644 (file)
@@ -10878,7 +10878,7 @@ static int btrfs_trim_free_extents(struct btrfs_device *device,
        *trimmed = 0;
 
        /* Not writeable = nothing to do. */
-       if (!device->writeable)
+       if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state))
                return 0;
 
        /* No free space = nothing to do. */
index ef72efef8b39c6b166071e5c93ccd62d30323189..16ae832bdb5d912cebc04c5c2d7d7aabb57994ab 100644 (file)
@@ -2026,7 +2026,8 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
        bio->bi_iter.bi_sector = sector;
        dev = bbio->stripes[bbio->mirror_num - 1].dev;
        btrfs_put_bbio(bbio);
-       if (!dev || !dev->bdev || !dev->writeable) {
+       if (!dev || !dev->bdev ||
+           !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state)) {
                btrfs_bio_counter_dec(fs_info);
                bio_put(bio);
                return -EIO;
index e7f37c46d6a9f24a8b66ee276eb2f9f7feddbca4..8c75e555e3f84f5b11825cb9095dfa42c6f8e250 100644 (file)
@@ -1503,7 +1503,7 @@ static noinline int btrfs_ioctl_resize(struct file *file,
                goto out_free;
        }
 
-       if (!device->writeable) {
+       if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                btrfs_info(fs_info,
                           "resizer unable to apply on readonly device %llu",
                       devid);
index b2f871d80982f2f870f130df2f463aedc787d341..7927307652e9bf2fe5fd121a5140f4c5a94da227 100644 (file)
@@ -4117,7 +4117,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
                return -ENODEV;
        }
 
-       if (!is_dev_replace && !readonly && !dev->writeable) {
+       if (!is_dev_replace && !readonly &&
+           !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state)) {
                mutex_unlock(&fs_info->fs_devices->device_list_mutex);
                rcu_read_lock();
                name = rcu_dereference(dev->name);
index 3e348743271a0d81818cbea57278b95668e5585d..c6db1ae4ac5665aecad1559ca1c0951540f9b81a 100644 (file)
@@ -691,10 +691,13 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
        device->generation = btrfs_super_generation(disk_super);
 
        if (btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_SEEDING) {
-               device->writeable = 0;
+               clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
                fs_devices->seeding = 1;
        } else {
-               device->writeable = !bdev_read_only(bdev);
+               if (bdev_read_only(bdev))
+                       clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
+               else
+                       set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
        }
 
        q = bdev_get_queue(bdev);
@@ -706,7 +709,8 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
        device->mode = flags;
 
        fs_devices->open_devices++;
-       if (device->writeable && device->devid != BTRFS_DEV_REPLACE_DEVID) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
+           device->devid != BTRFS_DEV_REPLACE_DEVID) {
                fs_devices->rw_devices++;
                list_add(&device->dev_alloc_list, &fs_devices->alloc_list);
        }
@@ -934,9 +938,9 @@ again:
                        device->bdev = NULL;
                        fs_devices->open_devices--;
                }
-               if (device->writeable) {
+               if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                        list_del_init(&device->dev_alloc_list);
-                       device->writeable = 0;
+                       clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
                        if (!device->is_tgtdev_for_dev_replace)
                                fs_devices->rw_devices--;
                }
@@ -968,7 +972,7 @@ static void btrfs_close_bdev(struct btrfs_device *device)
        if (!device->bdev)
                return;
 
-       if (device->writeable) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                sync_blockdev(device->bdev);
                invalidate_bdev(device->bdev);
        }
@@ -985,7 +989,7 @@ static void btrfs_prepare_close_one_device(struct btrfs_device *device)
        if (device->bdev)
                fs_devices->open_devices--;
 
-       if (device->writeable &&
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
            device->devid != BTRFS_DEV_REPLACE_DEVID) {
                list_del_init(&device->dev_alloc_list);
                fs_devices->rw_devices--;
@@ -1943,12 +1947,13 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
                goto out;
        }
 
-       if (device->writeable && fs_info->fs_devices->rw_devices == 1) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
+           fs_info->fs_devices->rw_devices == 1) {
                ret = BTRFS_ERROR_DEV_ONLY_WRITABLE;
                goto out;
        }
 
-       if (device->writeable) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                mutex_lock(&fs_info->chunk_mutex);
                list_del_init(&device->dev_alloc_list);
                device->fs_devices->rw_devices--;
@@ -2010,7 +2015,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
         * the devices list.  All that's left is to zero out the old
         * supers and free the device.
         */
-       if (device->writeable)
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state))
                btrfs_scratch_superblocks(device->bdev, device->name->str);
 
        btrfs_close_bdev(device);
@@ -2037,7 +2042,7 @@ out:
        return ret;
 
 error_undo:
-       if (device->writeable) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                mutex_lock(&fs_info->chunk_mutex);
                list_add(&device->dev_alloc_list,
                         &fs_info->fs_devices->alloc_list);
@@ -2068,7 +2073,7 @@ void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_fs_info *fs_info,
        if (srcdev->missing)
                fs_devices->missing_devices--;
 
-       if (srcdev->writeable)
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &srcdev->dev_state))
                fs_devices->rw_devices--;
 
        if (srcdev->bdev)
@@ -2080,7 +2085,7 @@ void btrfs_rm_dev_replace_free_srcdev(struct btrfs_fs_info *fs_info,
 {
        struct btrfs_fs_devices *fs_devices = srcdev->fs_devices;
 
-       if (srcdev->writeable) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &srcdev->dev_state)) {
                /* zero out the old super if it is writable */
                btrfs_scratch_superblocks(srcdev->bdev, srcdev->name->str);
        }
@@ -2431,7 +2436,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
        }
 
        q = bdev_get_queue(bdev);
-       device->writeable = 1;
+       set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
        device->generation = trans->transid;
        device->io_width = fs_info->sectorsize;
        device->io_align = fs_info->sectorsize;
@@ -2638,7 +2643,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
        rcu_assign_pointer(device->name, name);
 
        mutex_lock(&fs_info->fs_devices->device_list_mutex);
-       device->writeable = 1;
+       set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
        device->generation = 0;
        device->io_width = fs_info->sectorsize;
        device->io_align = fs_info->sectorsize;
@@ -2738,7 +2743,7 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans,
        u64 old_total;
        u64 diff;
 
-       if (!device->writeable)
+       if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state))
                return -EACCES;
 
        new_size = round_down(new_size, fs_info->sectorsize);
@@ -3558,7 +3563,7 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
                old_size = btrfs_device_get_total_bytes(device);
                size_to_free = div_factor(old_size, 1);
                size_to_free = min_t(u64, size_to_free, SZ_1M);
-               if (!device->writeable ||
+               if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) ||
                    btrfs_device_get_total_bytes(device) -
                    btrfs_device_get_bytes_used(device) > size_to_free ||
                    device->is_tgtdev_for_dev_replace)
@@ -4441,7 +4446,7 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)
        mutex_lock(&fs_info->chunk_mutex);
 
        btrfs_device_set_total_bytes(device, new_size);
-       if (device->writeable) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                device->fs_devices->total_rw_bytes -= diff;
                atomic64_sub(diff, &fs_info->free_chunk_space);
        }
@@ -4566,7 +4571,7 @@ done:
        if (ret) {
                mutex_lock(&fs_info->chunk_mutex);
                btrfs_device_set_total_bytes(device, old_size);
-               if (device->writeable)
+               if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state))
                        device->fs_devices->total_rw_bytes += diff;
                atomic64_add(diff, &fs_info->free_chunk_space);
                mutex_unlock(&fs_info->chunk_mutex);
@@ -4726,7 +4731,7 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
                u64 max_avail;
                u64 dev_offset;
 
-               if (!device->writeable) {
+               if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
                        WARN(1, KERN_ERR
                               "BTRFS: read-only device in alloc_list\n");
                        continue;
@@ -5085,8 +5090,8 @@ int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset)
                        miss_ndevs++;
                        continue;
                }
-
-               if (!map->stripes[i].dev->writeable) {
+               if (!test_bit(BTRFS_DEV_STATE_WRITEABLE,
+                                       &map->stripes[i].dev->dev_state)) {
                        readonly = 1;
                        goto end;
                }
@@ -6255,7 +6260,8 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
        for (dev_nr = 0; dev_nr < total_devs; dev_nr++) {
                dev = bbio->stripes[dev_nr].dev;
                if (!dev || !dev->bdev ||
-                   (bio_op(first_bio) == REQ_OP_WRITE && !dev->writeable)) {
+                   (bio_op(first_bio) == REQ_OP_WRITE &&
+                   !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))) {
                        bbio_error(bbio, first_bio, logical);
                        continue;
                }
@@ -6691,7 +6697,7 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
        }
 
        if (device->fs_devices != fs_info->fs_devices) {
-               BUG_ON(device->writeable);
+               BUG_ON(test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state));
                if (device->generation !=
                    btrfs_device_generation(leaf, dev_item))
                        return -EINVAL;
@@ -6699,7 +6705,8 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
 
        fill_device_from_item(leaf, dev_item, device);
        device->in_fs_metadata = 1;
-       if (device->writeable && !device->is_tgtdev_for_dev_replace) {
+       if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
+           !device->is_tgtdev_for_dev_replace) {
                device->fs_devices->total_rw_bytes += device->total_bytes;
                atomic64_add(device->total_bytes - device->bytes_used,
                                &fs_info->free_chunk_space);
index 60588c259665054db58468436a889931897307b0..893e283c7f152e39060cffac34068e0e34b68f3f 100644 (file)
@@ -47,6 +47,8 @@ struct btrfs_pending_bios {
 #define btrfs_device_data_ordered_init(device) do { } while (0)
 #endif
 
+#define BTRFS_DEV_STATE_WRITEABLE      (0)
+
 struct btrfs_device {
        struct list_head dev_list;
        struct list_head dev_alloc_list;
@@ -69,7 +71,7 @@ struct btrfs_device {
        /* the mode sent to blkdev_get */
        fmode_t mode;
 
-       int writeable;
+       unsigned long dev_state;
        int in_fs_metadata;
        int missing;
        int is_tgtdev_for_dev_replace;