All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] define BTRFS_DEV_STATE
@ 2017-11-29  4:45 Anand Jain
  2017-11-29  4:45 ` [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE Anand Jain
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Anand Jain @ 2017-11-29  4:45 UTC (permalink / raw)
  To: linux-btrfs; +Cc: bo.li.liu

As of now device properties and states are being represented as int
variable. Patches in the ML such as device failed state needs this
cleanup as well.

Anand Jain (4):
  btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE
  btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA
  btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING
  btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD

 fs/btrfs/dev-replace.c |   3 +-
 fs/btrfs/disk-io.c     |  23 ++++++---
 fs/btrfs/extent-tree.c |   5 +-
 fs/btrfs/extent_io.c   |   3 +-
 fs/btrfs/ioctl.c       |   2 +-
 fs/btrfs/scrub.c       |  13 +++--
 fs/btrfs/super.c       |   7 +--
 fs/btrfs/volumes.c     | 129 ++++++++++++++++++++++++++++---------------------
 fs/btrfs/volumes.h     |  10 ++--
 9 files changed, 118 insertions(+), 77 deletions(-)

-- 
2.15.0


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE
  2017-11-29  4:45 [PATCH 0/4] define BTRFS_DEV_STATE Anand Jain
@ 2017-11-29  4:45 ` Anand Jain
  2017-11-29  9:14   ` Nikolay Borisov
  2017-11-29  4:45 ` [PATCH 2/4] btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA Anand Jain
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: Anand Jain @ 2017-11-29  4:45 UTC (permalink / raw)
  To: linux-btrfs; +Cc: bo.li.liu

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>
---
 fs/btrfs/disk-io.c     | 12 ++++++----
 fs/btrfs/extent-tree.c |  2 +-
 fs/btrfs/extent_io.c   |  3 ++-
 fs/btrfs/ioctl.c       |  2 +-
 fs/btrfs/scrub.c       |  3 ++-
 fs/btrfs/volumes.c     | 63 +++++++++++++++++++++++++++++---------------------
 fs/btrfs/volumes.h     |  4 +++-
 7 files changed, 54 insertions(+), 35 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index dfdab849037b..0d361b6713e1 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3563,7 +3563,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);
@@ -3578,7 +3579,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);
@@ -3675,7 +3677,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);
@@ -3714,7 +3717,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
 	list_for_each_entry_rcu(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);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index e2d7e86b51d1..f81d928754e1 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -10935,7 +10935,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. */
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 7fa50e12f18e..f51c797847c7 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2028,7 +2028,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;
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 6c7a49faf4e0..8a74c83503d6 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -1518,7 +1518,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);
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index e3f6c49e5c4d..e027e0de66a5 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -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);
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 397b335d108c..0f5be1808c6e 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -634,10 +634,15 @@ 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);
@@ -651,7 +656,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
 	device->mode = flags;
 
 	fs_devices->open_devices++;
-	if (device->writeable &&
+	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,
@@ -881,9 +886,10 @@ void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step)
 			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--;
 		}
@@ -925,7 +931,8 @@ static void free_device(struct rcu_head *head)
 
 static void btrfs_close_bdev(struct btrfs_device *device)
 {
-	if (device->bdev && device->writeable) {
+	if (device->bdev &&
+		test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
 		sync_blockdev(device->bdev);
 		invalidate_bdev(device->bdev);
 	}
@@ -943,7 +950,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--;
@@ -1901,12 +1908,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--;
@@ -1968,7 +1976,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);
@@ -1994,7 +2002,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
 	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);
@@ -2025,7 +2033,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)
@@ -2037,7 +2045,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);
 	}
@@ -2391,7 +2399,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
 	q = bdev_get_queue(bdev);
 	if (blk_queue_discard(q))
 		device->can_discard = 1;
-	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;
@@ -2592,7 +2600,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
 	if (blk_queue_discard(q))
 		device->can_discard = 1;
 	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;
@@ -2692,7 +2700,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);
@@ -3512,7 +3520,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)
@@ -4395,7 +4403,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);
 	}
@@ -4520,7 +4528,7 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)
 	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);
@@ -4680,7 +4688,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;
@@ -5035,12 +5043,13 @@ int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset)
 
 	map = em->map_lookup;
 	for (i = 0; i < map->num_stripes; i++) {
-		if (map->stripes[i].dev->missing) {
+		struct btrfs_device *device = map->stripes[i].dev;
+
+		if (device->missing) {
 			miss_ndevs++;
 			continue;
 		}
-
-		if (!map->stripes[i].dev->writeable) {
+		if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
 			readonly = 1;
 			goto end;
 		}
@@ -6220,7 +6229,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;
 		}
@@ -6656,7 +6666,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;
@@ -6664,7 +6674,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);
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index ff15208344a7..2e376a422626 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -47,6 +47,8 @@ struct btrfs_pending_bios {
 #define btrfs_device_data_ordered_init(device) do { } while (0)
 #endif
 
+#define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
+
 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 can_discard;
-- 
2.15.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA
  2017-11-29  4:45 [PATCH 0/4] define BTRFS_DEV_STATE Anand Jain
  2017-11-29  4:45 ` [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE Anand Jain
@ 2017-11-29  4:45 ` Anand Jain
  2017-11-29  9:20   ` Nikolay Borisov
  2017-11-29  4:45 ` [PATCH 3/4] btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING Anand Jain
  2017-11-29  4:45 ` [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD Anand Jain
  3 siblings, 1 reply; 11+ messages in thread
From: Anand Jain @ 2017-11-29  4:45 UTC (permalink / raw)
  To: linux-btrfs; +Cc: bo.li.liu

Currently device state is being managed by each individual int
variable such as struct btrfs_device::in_fs_metadata. Instead of
that declare device state BTRFS_DEV_STATE_IN_FS_METADATA and use
the bit operations.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 fs/btrfs/disk-io.c | 21 ++++++++++++++-------
 fs/btrfs/scrub.c   |  3 ++-
 fs/btrfs/super.c   |  5 +++--
 fs/btrfs/volumes.c | 29 +++++++++++++++++------------
 fs/btrfs/volumes.h |  2 +-
 5 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 0d361b6713e1..ab1a514e5c8d 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3563,8 +3563,10 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
 			continue;
 		if (!dev->bdev)
 			continue;
-		if (!dev->in_fs_metadata ||
-			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
+		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+						&dev->dev_state) ||
+			!test_bit(BTRFS_DEV_STATE_WRITEABLE,
+						&dev->dev_state))
 			continue;
 
 		write_dev_flush(dev);
@@ -3579,8 +3581,10 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
 			errors_wait++;
 			continue;
 		}
-		if (!dev->in_fs_metadata ||
-			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
+		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+						&dev->dev_state) ||
+			!test_bit(BTRFS_DEV_STATE_WRITEABLE,
+						&dev->dev_state))
 			continue;
 
 		ret = wait_dev_flush(dev);
@@ -3677,7 +3681,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
 			total_errors++;
 			continue;
 		}
-		if (!dev->in_fs_metadata ||
+		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+						&dev->dev_state) ||
 			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
 			continue;
 
@@ -3717,8 +3722,10 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
 	list_for_each_entry_rcu(dev, head, dev_list) {
 		if (!dev->bdev)
 			continue;
-		if (!dev->in_fs_metadata ||
-			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
+		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+						&dev->dev_state) ||
+			!test_bit(BTRFS_DEV_STATE_WRITEABLE,
+						&dev->dev_state))
 			continue;
 
 		ret = wait_dev_supers(dev, max_mirrors);
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index e027e0de66a5..060fa93731e5 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -4129,7 +4129,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
 	}
 
 	mutex_lock(&fs_info->scrub_lock);
-	if (!dev->in_fs_metadata || dev->is_tgtdev_for_dev_replace) {
+	if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &dev->dev_state) ||
+					dev->is_tgtdev_for_dev_replace) {
 		mutex_unlock(&fs_info->scrub_lock);
 		mutex_unlock(&fs_info->fs_devices->device_list_mutex);
 		return -EIO;
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 161694b66038..9089aad2f3aa 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -1945,8 +1945,9 @@ static int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
 
 	rcu_read_lock();
 	list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) {
-		if (!device->in_fs_metadata || !device->bdev ||
-		    device->is_tgtdev_for_dev_replace)
+		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+						&device->dev_state) ||
+			!device->bdev || device->is_tgtdev_for_dev_replace)
 			continue;
 
 		if (i >= nr_devices)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 0f5be1808c6e..13a6ae80bee1 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -652,7 +652,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
 		fs_devices->rotating = 1;
 
 	device->bdev = bdev;
-	device->in_fs_metadata = 0;
+	clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
 	device->mode = flags;
 
 	fs_devices->open_devices++;
@@ -857,7 +857,8 @@ void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step)
 again:
 	/* This is the initialized path, it is safe to release the devices. */
 	list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) {
-		if (device->in_fs_metadata) {
+		if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+							&device->dev_state)) {
 			if (!device->is_tgtdev_for_dev_replace &&
 			    (!latest_dev ||
 			     device->generation > latest_dev->generation)) {
@@ -1600,7 +1601,7 @@ static int btrfs_alloc_dev_extent(struct btrfs_trans_handle *trans,
 	struct extent_buffer *leaf;
 	struct btrfs_key key;
 
-	WARN_ON(!device->in_fs_metadata);
+	WARN_ON(!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state));
 	WARN_ON(device->is_tgtdev_for_dev_replace);
 	path = btrfs_alloc_path();
 	if (!path)
@@ -1936,7 +1937,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
 	if (ret)
 		goto error_undo;
 
-	device->in_fs_metadata = 0;
+	clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
 	btrfs_scrub_cancel_dev(fs_info, device);
 
 	/*
@@ -2154,7 +2155,8 @@ int btrfs_find_device_missing_or_by_path(struct btrfs_fs_info *fs_info,
 		 * is held by the caller.
 		 */
 		list_for_each_entry(tmp, devices, dev_list) {
-			if (tmp->in_fs_metadata && !tmp->bdev) {
+			if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+					&tmp->dev_state) && !tmp->bdev) {
 				*device = tmp;
 				break;
 			}
@@ -2410,7 +2412,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
 	device->commit_total_bytes = device->total_bytes;
 	device->fs_info = fs_info;
 	device->bdev = bdev;
-	device->in_fs_metadata = 1;
+	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
 	device->is_tgtdev_for_dev_replace = 0;
 	device->mode = FMODE_EXCL;
 	device->dev_stats_valid = 1;
@@ -2613,7 +2615,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
 	device->commit_bytes_used = device->bytes_used;
 	device->fs_info = fs_info;
 	device->bdev = bdev;
-	device->in_fs_metadata = 1;
+	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
 	device->is_tgtdev_for_dev_replace = 1;
 	device->mode = FMODE_EXCL;
 	device->dev_stats_valid = 1;
@@ -2642,7 +2644,7 @@ void btrfs_init_dev_replace_tgtdev_for_resume(struct btrfs_fs_info *fs_info,
 	tgtdev->io_align = sectorsize;
 	tgtdev->sector_size = sectorsize;
 	tgtdev->fs_info = fs_info;
-	tgtdev->in_fs_metadata = 1;
+	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &tgtdev->dev_state);
 }
 
 static noinline int btrfs_update_device(struct btrfs_trans_handle *trans,
@@ -4694,8 +4696,9 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
 			continue;
 		}
 
-		if (!device->in_fs_metadata ||
-		    device->is_tgtdev_for_dev_replace)
+		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+					&device->dev_state) ||
+					device->is_tgtdev_for_dev_replace)
 			continue;
 
 		if (device->total_bytes > device->bytes_used)
@@ -6498,7 +6501,9 @@ static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
 			}
 			btrfs_report_missing_device(fs_info, devid, uuid, false);
 		}
-		map->stripes[i].dev->in_fs_metadata = 1;
+		set_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
+				&(map->stripes[i].dev->dev_state));
+
 	}
 
 	write_lock(&map_tree->map_tree.lock);
@@ -6673,7 +6678,7 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
 	}
 
 	fill_device_from_item(leaf, dev_item, device);
-	device->in_fs_metadata = 1;
+	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
 	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;
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 2e376a422626..f73b78f26a61 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -48,6 +48,7 @@ struct btrfs_pending_bios {
 #endif
 
 #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
+#define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
 
 struct btrfs_device {
 	struct list_head dev_list;
@@ -72,7 +73,6 @@ struct btrfs_device {
 	fmode_t mode;
 
 	unsigned long dev_state;
-	int in_fs_metadata;
 	int missing;
 	int can_discard;
 	int is_tgtdev_for_dev_replace;
-- 
2.15.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING
  2017-11-29  4:45 [PATCH 0/4] define BTRFS_DEV_STATE Anand Jain
  2017-11-29  4:45 ` [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE Anand Jain
  2017-11-29  4:45 ` [PATCH 2/4] btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA Anand Jain
@ 2017-11-29  4:45 ` Anand Jain
  2017-11-29  9:35   ` Nikolay Borisov
  2017-11-29  4:45 ` [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD Anand Jain
  3 siblings, 1 reply; 11+ messages in thread
From: Anand Jain @ 2017-11-29  4:45 UTC (permalink / raw)
  To: linux-btrfs; +Cc: bo.li.liu

Currently device state is being managed by each individual int
variable such as struct btrfs_device::missing. Instead of that
declare btrfs_device::dev_state BTRFS_DEV_STATE_MISSING and use
the bit operations.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 fs/btrfs/dev-replace.c |  3 ++-
 fs/btrfs/disk-io.c     |  4 ++--
 fs/btrfs/scrub.c       |  7 ++++---
 fs/btrfs/super.c       |  2 +-
 fs/btrfs/volumes.c     | 33 +++++++++++++++++++--------------
 fs/btrfs/volumes.h     |  2 +-
 6 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 4b6ceb38cb5f..559db7667f38 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -306,7 +306,8 @@ void btrfs_after_dev_replace_commit(struct btrfs_fs_info *fs_info)
 
 static inline char *dev_missing_or_rcu_str(struct btrfs_device *device)
 {
-	return device->missing ? "<missing disk>" : rcu_str_deref(device->name);
+	return test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ?
+				"<missing disk>" : rcu_str_deref(device->name);
 }
 
 int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info,
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index ab1a514e5c8d..ac1079fc9382 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3559,7 +3559,7 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
 	/* send down all the barriers */
 	head = &info->fs_devices->devices;
 	list_for_each_entry_rcu(dev, head, dev_list) {
-		if (dev->missing)
+		if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
 			continue;
 		if (!dev->bdev)
 			continue;
@@ -3575,7 +3575,7 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
 
 	/* wait for all the barriers */
 	list_for_each_entry_rcu(dev, head, dev_list) {
-		if (dev->missing)
+		if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
 			continue;
 		if (!dev->bdev) {
 			errors_wait++;
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index 060fa93731e5..666c00cbee03 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -2535,7 +2535,7 @@ static int scrub_pages(struct scrub_ctx *sctx, u64 logical, u64 len,
 	}
 
 	WARN_ON(sblock->page_count == 0);
-	if (dev->missing) {
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state)) {
 		/*
 		 * This case should only be hit for RAID 5/6 device replace. See
 		 * the comment in scrub_missing_raid56_pages() for details.
@@ -2870,7 +2870,7 @@ static int scrub_extent_for_parity(struct scrub_parity *sparity,
 	u8 csum[BTRFS_CSUM_SIZE];
 	u32 blocksize;
 
-	if (dev->missing) {
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state)) {
 		scrub_parity_mark_sectors_error(sparity, logical, len);
 		return 0;
 	}
@@ -4112,7 +4112,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
 
 	mutex_lock(&fs_info->fs_devices->device_list_mutex);
 	dev = btrfs_find_device(fs_info, devid, NULL, NULL);
-	if (!dev || (dev->missing && !is_dev_replace)) {
+	if (!dev || (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state) &&
+						!is_dev_replace)) {
 		mutex_unlock(&fs_info->fs_devices->device_list_mutex);
 		return -ENODEV;
 	}
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 9089aad2f3aa..4b70ae6f0245 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -2243,7 +2243,7 @@ static int btrfs_show_devname(struct seq_file *m, struct dentry *root)
 	while (cur_devices) {
 		head = &cur_devices->devices;
 		list_for_each_entry(dev, head, dev_list) {
-			if (dev->missing)
+			if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
 				continue;
 			if (!dev->name)
 				continue;
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 13a6ae80bee1..75839e07ce10 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -773,9 +773,9 @@ static noinline int device_list_add(const char *path,
 			return -ENOMEM;
 		rcu_string_free(device->name);
 		rcu_assign_pointer(device->name, name);
-		if (device->missing) {
+		if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) {
 			fs_devices->missing_devices--;
-			device->missing = 0;
+			clear_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
 		}
 	}
 
@@ -957,7 +957,7 @@ static void btrfs_prepare_close_one_device(struct btrfs_device *device)
 		fs_devices->rw_devices--;
 	}
 
-	if (device->missing)
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state))
 		fs_devices->missing_devices--;
 
 	new_device = btrfs_alloc_device(NULL, &device->devid,
@@ -1844,7 +1844,8 @@ struct btrfs_device *btrfs_find_next_active_device(struct btrfs_fs_devices *fs_d
 
 	list_for_each_entry(next_device, &fs_devs->devices, dev_list) {
 		if (next_device != device &&
-			!next_device->missing && next_device->bdev)
+			!test_bit(BTRFS_DEV_STATE_MISSING,
+				&next_device->dev_state) && next_device->bdev)
 			return next_device;
 	}
 
@@ -1957,7 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
 	device->fs_devices->num_devices--;
 	device->fs_devices->total_devices--;
 
-	if (device->missing)
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state))
 		device->fs_devices->missing_devices--;
 
 	btrfs_assign_next_active_device(fs_info, device, NULL);
@@ -2031,7 +2032,7 @@ void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_fs_info *fs_info,
 	list_del_rcu(&srcdev->dev_list);
 	list_del_rcu(&srcdev->dev_alloc_list);
 	fs_devices->num_devices--;
-	if (srcdev->missing)
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &srcdev->dev_state))
 		fs_devices->missing_devices--;
 
 	if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &srcdev->dev_state))
@@ -5048,7 +5049,7 @@ int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset)
 	for (i = 0; i < map->num_stripes; i++) {
 		struct btrfs_device *device = map->stripes[i].dev;
 
-		if (device->missing) {
+		if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) {
 			miss_ndevs++;
 			continue;
 		}
@@ -6079,7 +6080,8 @@ static noinline void btrfs_schedule_bio(struct btrfs_device *device,
 	int should_queue = 1;
 	struct btrfs_pending_bios *pending_bios;
 
-	if (device->missing || !device->bdev) {
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ||
+			!device->bdev) {
 		bio_io_error(bio);
 		return;
 	}
@@ -6282,7 +6284,7 @@ static struct btrfs_device *add_missing_dev(struct btrfs_fs_devices *fs_devices,
 	device->fs_devices = fs_devices;
 	fs_devices->num_devices++;
 
-	device->missing = 1;
+	set_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
 	fs_devices->missing_devices++;
 
 	return device;
@@ -6644,7 +6646,8 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
 							dev_uuid, false);
 		}
 
-		if(!device->bdev && !device->missing) {
+		if (!device->bdev && !test_bit(BTRFS_DEV_STATE_MISSING,
+							&device->dev_state)) {
 			/*
 			 * this happens when a device that was properly setup
 			 * in the device info lists suddenly goes bad.
@@ -6652,12 +6655,13 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
 			 * device->missing to one here
 			 */
 			device->fs_devices->missing_devices++;
-			device->missing = 1;
+			set_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
 		}
 
 		/* Move the device to its own fs_devices */
 		if (device->fs_devices != fs_devices) {
-			ASSERT(device->missing);
+			ASSERT(test_bit(BTRFS_DEV_STATE_MISSING,
+							&device->dev_state));
 
 			list_move(&device->dev_list, &fs_devices->devices);
 			device->fs_devices->num_devices--;
@@ -6843,8 +6847,9 @@ bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info)
 		for (i = 0; i < map->num_stripes; i++) {
 			struct btrfs_device *dev = map->stripes[i].dev;
 
-			if (!dev || !dev->bdev || dev->missing ||
-			    dev->last_flush_error)
+			if (!dev || !dev->bdev ||
+				test_bit(BTRFS_DEV_STATE_MISSING,
+				&dev->dev_state) || dev->last_flush_error)
 				missing++;
 		}
 		if (missing > max_tolerated) {
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index f73b78f26a61..2fbff6902c8d 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -49,6 +49,7 @@ struct btrfs_pending_bios {
 
 #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
 #define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
+#define BTRFS_DEV_STATE_MISSING		(1UL << 3)
 
 struct btrfs_device {
 	struct list_head dev_list;
@@ -73,7 +74,6 @@ struct btrfs_device {
 	fmode_t mode;
 
 	unsigned long dev_state;
-	int missing;
 	int can_discard;
 	int is_tgtdev_for_dev_replace;
 	blk_status_t last_flush_error;
-- 
2.15.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD
  2017-11-29  4:45 [PATCH 0/4] define BTRFS_DEV_STATE Anand Jain
                   ` (2 preceding siblings ...)
  2017-11-29  4:45 ` [PATCH 3/4] btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING Anand Jain
@ 2017-11-29  4:45 ` Anand Jain
  2017-11-29  9:39   ` Nikolay Borisov
  3 siblings, 1 reply; 11+ messages in thread
From: Anand Jain @ 2017-11-29  4:45 UTC (permalink / raw)
  To: linux-btrfs; +Cc: bo.li.liu

Currently device state is being managed by each individual int
variable such as struct btrfs_device::can_discard. Instead of that
declare btrfs_device::dev_state BTRFS_DEV_STATE_CAN_DISCARD and use
the bit operations.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 fs/btrfs/extent-tree.c | 3 ++-
 fs/btrfs/volumes.c     | 6 +++---
 fs/btrfs/volumes.h     | 2 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index f81d928754e1..ee79f7cdc543 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2155,7 +2155,8 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr,
 
 		for (i = 0; i < bbio->num_stripes; i++, stripe++) {
 			u64 bytes;
-			if (!stripe->dev->can_discard)
+			if (!test_bit(BTRFS_DEV_STATE_CAN_DISCARD,
+						&stripe->dev->dev_state))
 				continue;
 
 			ret = btrfs_issue_discard(stripe->dev->bdev,
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 75839e07ce10..a9c6486f06f4 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -647,7 +647,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
 
 	q = bdev_get_queue(bdev);
 	if (blk_queue_discard(q))
-		device->can_discard = 1;
+		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
 	if (!blk_queue_nonrot(q))
 		fs_devices->rotating = 1;
 
@@ -2401,7 +2401,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
 
 	q = bdev_get_queue(bdev);
 	if (blk_queue_discard(q))
-		device->can_discard = 1;
+		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
 	set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
 	device->generation = trans->transid;
 	device->io_width = fs_info->sectorsize;
@@ -2601,7 +2601,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
 
 	q = bdev_get_queue(bdev);
 	if (blk_queue_discard(q))
-		device->can_discard = 1;
+		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
 	mutex_lock(&fs_info->fs_devices->device_list_mutex);
 	set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
 	device->generation = 0;
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 2fbff6902c8d..85e4b2dcc071 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -50,6 +50,7 @@ struct btrfs_pending_bios {
 #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
 #define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
 #define BTRFS_DEV_STATE_MISSING		(1UL << 3)
+#define BTRFS_DEV_STATE_CAN_DISCARD	(1UL << 4)
 
 struct btrfs_device {
 	struct list_head dev_list;
@@ -74,7 +75,6 @@ struct btrfs_device {
 	fmode_t mode;
 
 	unsigned long dev_state;
-	int can_discard;
 	int is_tgtdev_for_dev_replace;
 	blk_status_t last_flush_error;
 	int flush_bio_sent;
-- 
2.15.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE
  2017-11-29  4:45 ` [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE Anand Jain
@ 2017-11-29  9:14   ` Nikolay Borisov
  2017-11-29  9:59     ` Anand Jain
  0 siblings, 1 reply; 11+ messages in thread
From: Nikolay Borisov @ 2017-11-29  9:14 UTC (permalink / raw)
  To: Anand Jain, linux-btrfs; +Cc: bo.li.liu



On 29.11.2017 06:45, Anand Jain wrote:
> 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>
> ---
>  fs/btrfs/disk-io.c     | 12 ++++++----
>  fs/btrfs/extent-tree.c |  2 +-
>  fs/btrfs/extent_io.c   |  3 ++-
>  fs/btrfs/ioctl.c       |  2 +-
>  fs/btrfs/scrub.c       |  3 ++-
>  fs/btrfs/volumes.c     | 63 +++++++++++++++++++++++++++++---------------------
>  fs/btrfs/volumes.h     |  4 +++-
>  7 files changed, 54 insertions(+), 35 deletions(-)
> 
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index dfdab849037b..0d361b6713e1 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -3563,7 +3563,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);
> @@ -3578,7 +3579,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);
> @@ -3675,7 +3677,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);
> @@ -3714,7 +3717,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
>  	list_for_each_entry_rcu(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);
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index e2d7e86b51d1..f81d928754e1 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -10935,7 +10935,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. */
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 7fa50e12f18e..f51c797847c7 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2028,7 +2028,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;
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index 6c7a49faf4e0..8a74c83503d6 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -1518,7 +1518,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);
> diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
> index e3f6c49e5c4d..e027e0de66a5 100644
> --- a/fs/btrfs/scrub.c
> +++ b/fs/btrfs/scrub.c
> @@ -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);
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 397b335d108c..0f5be1808c6e 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -634,10 +634,15 @@ 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);
> @@ -651,7 +656,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>  	device->mode = flags;
>  
>  	fs_devices->open_devices++;
> -	if (device->writeable &&
> +	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,
> @@ -881,9 +886,10 @@ void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step)
>  			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--;
>  		}
> @@ -925,7 +931,8 @@ static void free_device(struct rcu_head *head)
>  
>  static void btrfs_close_bdev(struct btrfs_device *device)
>  {
> -	if (device->bdev && device->writeable) {
> +	if (device->bdev &&
> +		test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
>  		sync_blockdev(device->bdev);
>  		invalidate_bdev(device->bdev);
>  	}
> @@ -943,7 +950,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--;
> @@ -1901,12 +1908,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--;
> @@ -1968,7 +1976,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);
> @@ -1994,7 +2002,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>  	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);
> @@ -2025,7 +2033,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)
> @@ -2037,7 +2045,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);
>  	}
> @@ -2391,7 +2399,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
>  	q = bdev_get_queue(bdev);
>  	if (blk_queue_discard(q))
>  		device->can_discard = 1;
> -	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;
> @@ -2592,7 +2600,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
>  	if (blk_queue_discard(q))
>  		device->can_discard = 1;
>  	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;
> @@ -2692,7 +2700,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);
> @@ -3512,7 +3520,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)
> @@ -4395,7 +4403,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);
>  	}
> @@ -4520,7 +4528,7 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)
>  	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);
> @@ -4680,7 +4688,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;
> @@ -5035,12 +5043,13 @@ int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset)
>  
>  	map = em->map_lookup;
>  	for (i = 0; i < map->num_stripes; i++) {
> -		if (map->stripes[i].dev->missing) {
> +		struct btrfs_device *device = map->stripes[i].dev;
> +
> +		if (device->missing) {

nit: This is unrelated change.

>  			miss_ndevs++;
>  			continue;
>  		}
> -
> -		if (!map->stripes[i].dev->writeable) {
> +		if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
>  			readonly = 1;
>  			goto end;
>  		}
> @@ -6220,7 +6229,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;
>  		}
> @@ -6656,7 +6666,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;
> @@ -6664,7 +6674,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);
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index ff15208344a7..2e376a422626 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -47,6 +47,8 @@ struct btrfs_pending_bios {
>  #define btrfs_device_data_ordered_init(device) do { } while (0)
>  #endif
>  
> +#define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)

Any reason why you start at bit position 1 and not 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 can_discard;
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/4] btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA
  2017-11-29  4:45 ` [PATCH 2/4] btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA Anand Jain
@ 2017-11-29  9:20   ` Nikolay Borisov
  0 siblings, 0 replies; 11+ messages in thread
From: Nikolay Borisov @ 2017-11-29  9:20 UTC (permalink / raw)
  To: Anand Jain, linux-btrfs; +Cc: bo.li.liu



On 29.11.2017 06:45, Anand Jain wrote:
> Currently device state is being managed by each individual int
> variable such as struct btrfs_device::in_fs_metadata. Instead of
> that declare device state BTRFS_DEV_STATE_IN_FS_METADATA and use
> the bit operations.
> 
> Signed-off-by: Anand Jain <anand.jain@oracle.com>

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
> ---
>  fs/btrfs/disk-io.c | 21 ++++++++++++++-------
>  fs/btrfs/scrub.c   |  3 ++-
>  fs/btrfs/super.c   |  5 +++--
>  fs/btrfs/volumes.c | 29 +++++++++++++++++------------
>  fs/btrfs/volumes.h |  2 +-
>  5 files changed, 37 insertions(+), 23 deletions(-)
> 
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 0d361b6713e1..ab1a514e5c8d 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -3563,8 +3563,10 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
>  			continue;
>  		if (!dev->bdev)
>  			continue;
> -		if (!dev->in_fs_metadata ||
> -			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
> +		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +						&dev->dev_state) ||
> +			!test_bit(BTRFS_DEV_STATE_WRITEABLE,
> +						&dev->dev_state))
>  			continue;
>  
>  		write_dev_flush(dev);
> @@ -3579,8 +3581,10 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
>  			errors_wait++;
>  			continue;
>  		}
> -		if (!dev->in_fs_metadata ||
> -			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
> +		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +						&dev->dev_state) ||
> +			!test_bit(BTRFS_DEV_STATE_WRITEABLE,
> +						&dev->dev_state))
>  			continue;
>  
>  		ret = wait_dev_flush(dev);
> @@ -3677,7 +3681,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
>  			total_errors++;
>  			continue;
>  		}
> -		if (!dev->in_fs_metadata ||
> +		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +						&dev->dev_state) ||
>  			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
>  			continue;
>  
> @@ -3717,8 +3722,10 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
>  	list_for_each_entry_rcu(dev, head, dev_list) {
>  		if (!dev->bdev)
>  			continue;
> -		if (!dev->in_fs_metadata ||
> -			!test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))
> +		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +						&dev->dev_state) ||
> +			!test_bit(BTRFS_DEV_STATE_WRITEABLE,
> +						&dev->dev_state))
>  			continue;
>  
>  		ret = wait_dev_supers(dev, max_mirrors);
> diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
> index e027e0de66a5..060fa93731e5 100644
> --- a/fs/btrfs/scrub.c
> +++ b/fs/btrfs/scrub.c
> @@ -4129,7 +4129,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
>  	}
>  
>  	mutex_lock(&fs_info->scrub_lock);
> -	if (!dev->in_fs_metadata || dev->is_tgtdev_for_dev_replace) {
> +	if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &dev->dev_state) ||
> +					dev->is_tgtdev_for_dev_replace) {
>  		mutex_unlock(&fs_info->scrub_lock);
>  		mutex_unlock(&fs_info->fs_devices->device_list_mutex);
>  		return -EIO;
> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> index 161694b66038..9089aad2f3aa 100644
> --- a/fs/btrfs/super.c
> +++ b/fs/btrfs/super.c
> @@ -1945,8 +1945,9 @@ static int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
>  
>  	rcu_read_lock();
>  	list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) {
> -		if (!device->in_fs_metadata || !device->bdev ||
> -		    device->is_tgtdev_for_dev_replace)
> +		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +						&device->dev_state) ||
> +			!device->bdev || device->is_tgtdev_for_dev_replace)
>  			continue;
>  
>  		if (i >= nr_devices)
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 0f5be1808c6e..13a6ae80bee1 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -652,7 +652,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>  		fs_devices->rotating = 1;
>  
>  	device->bdev = bdev;
> -	device->in_fs_metadata = 0;
> +	clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
>  	device->mode = flags;
>  
>  	fs_devices->open_devices++;
> @@ -857,7 +857,8 @@ void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step)
>  again:
>  	/* This is the initialized path, it is safe to release the devices. */
>  	list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) {
> -		if (device->in_fs_metadata) {
> +		if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +							&device->dev_state)) {
>  			if (!device->is_tgtdev_for_dev_replace &&
>  			    (!latest_dev ||
>  			     device->generation > latest_dev->generation)) {
> @@ -1600,7 +1601,7 @@ static int btrfs_alloc_dev_extent(struct btrfs_trans_handle *trans,
>  	struct extent_buffer *leaf;
>  	struct btrfs_key key;
>  
> -	WARN_ON(!device->in_fs_metadata);
> +	WARN_ON(!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state));
>  	WARN_ON(device->is_tgtdev_for_dev_replace);
>  	path = btrfs_alloc_path();
>  	if (!path)
> @@ -1936,7 +1937,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>  	if (ret)
>  		goto error_undo;
>  
> -	device->in_fs_metadata = 0;
> +	clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
>  	btrfs_scrub_cancel_dev(fs_info, device);
>  
>  	/*
> @@ -2154,7 +2155,8 @@ int btrfs_find_device_missing_or_by_path(struct btrfs_fs_info *fs_info,
>  		 * is held by the caller.
>  		 */
>  		list_for_each_entry(tmp, devices, dev_list) {
> -			if (tmp->in_fs_metadata && !tmp->bdev) {
> +			if (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +					&tmp->dev_state) && !tmp->bdev) {
>  				*device = tmp;
>  				break;
>  			}
> @@ -2410,7 +2412,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
>  	device->commit_total_bytes = device->total_bytes;
>  	device->fs_info = fs_info;
>  	device->bdev = bdev;
> -	device->in_fs_metadata = 1;
> +	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
>  	device->is_tgtdev_for_dev_replace = 0;
>  	device->mode = FMODE_EXCL;
>  	device->dev_stats_valid = 1;
> @@ -2613,7 +2615,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
>  	device->commit_bytes_used = device->bytes_used;
>  	device->fs_info = fs_info;
>  	device->bdev = bdev;
> -	device->in_fs_metadata = 1;
> +	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
>  	device->is_tgtdev_for_dev_replace = 1;
>  	device->mode = FMODE_EXCL;
>  	device->dev_stats_valid = 1;
> @@ -2642,7 +2644,7 @@ void btrfs_init_dev_replace_tgtdev_for_resume(struct btrfs_fs_info *fs_info,
>  	tgtdev->io_align = sectorsize;
>  	tgtdev->sector_size = sectorsize;
>  	tgtdev->fs_info = fs_info;
> -	tgtdev->in_fs_metadata = 1;
> +	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &tgtdev->dev_state);
>  }
>  
>  static noinline int btrfs_update_device(struct btrfs_trans_handle *trans,
> @@ -4694,8 +4696,9 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
>  			continue;
>  		}
>  
> -		if (!device->in_fs_metadata ||
> -		    device->is_tgtdev_for_dev_replace)
> +		if (!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +					&device->dev_state) ||
> +					device->is_tgtdev_for_dev_replace)
>  			continue;
>  
>  		if (device->total_bytes > device->bytes_used)
> @@ -6498,7 +6501,9 @@ static int read_one_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
>  			}
>  			btrfs_report_missing_device(fs_info, devid, uuid, false);
>  		}
> -		map->stripes[i].dev->in_fs_metadata = 1;
> +		set_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
> +				&(map->stripes[i].dev->dev_state));
> +
>  	}
>  
>  	write_lock(&map_tree->map_tree.lock);
> @@ -6673,7 +6678,7 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
>  	}
>  
>  	fill_device_from_item(leaf, dev_item, device);
> -	device->in_fs_metadata = 1;
> +	set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
>  	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;
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index 2e376a422626..f73b78f26a61 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -48,6 +48,7 @@ struct btrfs_pending_bios {
>  #endif
>  
>  #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
> +#define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
>  
>  struct btrfs_device {
>  	struct list_head dev_list;
> @@ -72,7 +73,6 @@ struct btrfs_device {
>  	fmode_t mode;
>  
>  	unsigned long dev_state;
> -	int in_fs_metadata;
>  	int missing;
>  	int can_discard;
>  	int is_tgtdev_for_dev_replace;
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING
  2017-11-29  4:45 ` [PATCH 3/4] btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING Anand Jain
@ 2017-11-29  9:35   ` Nikolay Borisov
  0 siblings, 0 replies; 11+ messages in thread
From: Nikolay Borisov @ 2017-11-29  9:35 UTC (permalink / raw)
  To: Anand Jain, linux-btrfs; +Cc: bo.li.liu



On 29.11.2017 06:45, Anand Jain wrote:
> Currently device state is being managed by each individual int
> variable such as struct btrfs_device::missing. Instead of that
> declare btrfs_device::dev_state BTRFS_DEV_STATE_MISSING and use
> the bit operations.
> 
> Signed-off-by: Anand Jain <anand.jain@oracle.com>

Reviewed-by : Nikolay Borisov <nborisov@suse.com>
> ---
>  fs/btrfs/dev-replace.c |  3 ++-
>  fs/btrfs/disk-io.c     |  4 ++--
>  fs/btrfs/scrub.c       |  7 ++++---
>  fs/btrfs/super.c       |  2 +-
>  fs/btrfs/volumes.c     | 33 +++++++++++++++++++--------------
>  fs/btrfs/volumes.h     |  2 +-
>  6 files changed, 29 insertions(+), 22 deletions(-)
> 
> diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
> index 4b6ceb38cb5f..559db7667f38 100644
> --- a/fs/btrfs/dev-replace.c
> +++ b/fs/btrfs/dev-replace.c
> @@ -306,7 +306,8 @@ void btrfs_after_dev_replace_commit(struct btrfs_fs_info *fs_info)
>  
>  static inline char *dev_missing_or_rcu_str(struct btrfs_device *device)
>  {
> -	return device->missing ? "<missing disk>" : rcu_str_deref(device->name);
> +	return test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ?
> +				"<missing disk>" : rcu_str_deref(device->name);
>  }
>  
>  int btrfs_dev_replace_start(struct btrfs_fs_info *fs_info,
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index ab1a514e5c8d..ac1079fc9382 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -3559,7 +3559,7 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
>  	/* send down all the barriers */
>  	head = &info->fs_devices->devices;
>  	list_for_each_entry_rcu(dev, head, dev_list) {
> -		if (dev->missing)
> +		if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
>  			continue;
>  		if (!dev->bdev)
>  			continue;
> @@ -3575,7 +3575,7 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
>  
>  	/* wait for all the barriers */
>  	list_for_each_entry_rcu(dev, head, dev_list) {
> -		if (dev->missing)
> +		if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
>  			continue;
>  		if (!dev->bdev) {
>  			errors_wait++;
> diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
> index 060fa93731e5..666c00cbee03 100644
> --- a/fs/btrfs/scrub.c
> +++ b/fs/btrfs/scrub.c
> @@ -2535,7 +2535,7 @@ static int scrub_pages(struct scrub_ctx *sctx, u64 logical, u64 len,
>  	}
>  
>  	WARN_ON(sblock->page_count == 0);
> -	if (dev->missing) {
> +	if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state)) {
>  		/*
>  		 * This case should only be hit for RAID 5/6 device replace. See
>  		 * the comment in scrub_missing_raid56_pages() for details.
> @@ -2870,7 +2870,7 @@ static int scrub_extent_for_parity(struct scrub_parity *sparity,
>  	u8 csum[BTRFS_CSUM_SIZE];
>  	u32 blocksize;
>  
> -	if (dev->missing) {
> +	if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state)) {
>  		scrub_parity_mark_sectors_error(sparity, logical, len);
>  		return 0;
>  	}
> @@ -4112,7 +4112,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
>  
>  	mutex_lock(&fs_info->fs_devices->device_list_mutex);
>  	dev = btrfs_find_device(fs_info, devid, NULL, NULL);
> -	if (!dev || (dev->missing && !is_dev_replace)) {
> +	if (!dev || (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state) &&
> +						!is_dev_replace)) {
>  		mutex_unlock(&fs_info->fs_devices->device_list_mutex);
>  		return -ENODEV;
>  	}
> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> index 9089aad2f3aa..4b70ae6f0245 100644
> --- a/fs/btrfs/super.c
> +++ b/fs/btrfs/super.c
> @@ -2243,7 +2243,7 @@ static int btrfs_show_devname(struct seq_file *m, struct dentry *root)
>  	while (cur_devices) {
>  		head = &cur_devices->devices;
>  		list_for_each_entry(dev, head, dev_list) {
> -			if (dev->missing)
> +			if (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state))
>  				continue;
>  			if (!dev->name)
>  				continue;
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 13a6ae80bee1..75839e07ce10 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -773,9 +773,9 @@ static noinline int device_list_add(const char *path,
>  			return -ENOMEM;
>  		rcu_string_free(device->name);
>  		rcu_assign_pointer(device->name, name);
> -		if (device->missing) {
> +		if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) {
>  			fs_devices->missing_devices--;
> -			device->missing = 0;
> +			clear_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
>  		}
>  	}
>  
> @@ -957,7 +957,7 @@ static void btrfs_prepare_close_one_device(struct btrfs_device *device)
>  		fs_devices->rw_devices--;
>  	}
>  
> -	if (device->missing)
> +	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state))
>  		fs_devices->missing_devices--;
>  
>  	new_device = btrfs_alloc_device(NULL, &device->devid,
> @@ -1844,7 +1844,8 @@ struct btrfs_device *btrfs_find_next_active_device(struct btrfs_fs_devices *fs_d
>  
>  	list_for_each_entry(next_device, &fs_devs->devices, dev_list) {
>  		if (next_device != device &&
> -			!next_device->missing && next_device->bdev)
> +			!test_bit(BTRFS_DEV_STATE_MISSING,
> +				&next_device->dev_state) && next_device->bdev)
>  			return next_device;
>  	}
>  
> @@ -1957,7 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>  	device->fs_devices->num_devices--;
>  	device->fs_devices->total_devices--;
>  
> -	if (device->missing)
> +	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state))
>  		device->fs_devices->missing_devices--;
>  
>  	btrfs_assign_next_active_device(fs_info, device, NULL);
> @@ -2031,7 +2032,7 @@ void btrfs_rm_dev_replace_remove_srcdev(struct btrfs_fs_info *fs_info,
>  	list_del_rcu(&srcdev->dev_list);
>  	list_del_rcu(&srcdev->dev_alloc_list);
>  	fs_devices->num_devices--;
> -	if (srcdev->missing)
> +	if (test_bit(BTRFS_DEV_STATE_MISSING, &srcdev->dev_state))
>  		fs_devices->missing_devices--;
>  
>  	if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &srcdev->dev_state))
> @@ -5048,7 +5049,7 @@ int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset)
>  	for (i = 0; i < map->num_stripes; i++) {
>  		struct btrfs_device *device = map->stripes[i].dev;
>  
> -		if (device->missing) {
> +		if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) {
>  			miss_ndevs++;
>  			continue;
>  		}
> @@ -6079,7 +6080,8 @@ static noinline void btrfs_schedule_bio(struct btrfs_device *device,
>  	int should_queue = 1;
>  	struct btrfs_pending_bios *pending_bios;
>  
> -	if (device->missing || !device->bdev) {
> +	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) ||
> +			!device->bdev) {
>  		bio_io_error(bio);
>  		return;
>  	}
> @@ -6282,7 +6284,7 @@ static struct btrfs_device *add_missing_dev(struct btrfs_fs_devices *fs_devices,
>  	device->fs_devices = fs_devices;
>  	fs_devices->num_devices++;
>  
> -	device->missing = 1;
> +	set_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
>  	fs_devices->missing_devices++;
>  
>  	return device;
> @@ -6644,7 +6646,8 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
>  							dev_uuid, false);
>  		}
>  
> -		if(!device->bdev && !device->missing) {
> +		if (!device->bdev && !test_bit(BTRFS_DEV_STATE_MISSING,
> +							&device->dev_state)) {
>  			/*
>  			 * this happens when a device that was properly setup
>  			 * in the device info lists suddenly goes bad.
> @@ -6652,12 +6655,13 @@ static int read_one_dev(struct btrfs_fs_info *fs_info,
>  			 * device->missing to one here
>  			 */
>  			device->fs_devices->missing_devices++;
> -			device->missing = 1;
> +			set_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
>  		}
>  
>  		/* Move the device to its own fs_devices */
>  		if (device->fs_devices != fs_devices) {
> -			ASSERT(device->missing);
> +			ASSERT(test_bit(BTRFS_DEV_STATE_MISSING,
> +							&device->dev_state));
>  
>  			list_move(&device->dev_list, &fs_devices->devices);
>  			device->fs_devices->num_devices--;
> @@ -6843,8 +6847,9 @@ bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info)
>  		for (i = 0; i < map->num_stripes; i++) {
>  			struct btrfs_device *dev = map->stripes[i].dev;
>  
> -			if (!dev || !dev->bdev || dev->missing ||
> -			    dev->last_flush_error)
> +			if (!dev || !dev->bdev ||
> +				test_bit(BTRFS_DEV_STATE_MISSING,
> +				&dev->dev_state) || dev->last_flush_error)
>  				missing++;
>  		}
>  		if (missing > max_tolerated) {
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index f73b78f26a61..2fbff6902c8d 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -49,6 +49,7 @@ struct btrfs_pending_bios {
>  
>  #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
>  #define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
> +#define BTRFS_DEV_STATE_MISSING		(1UL << 3)
>  
>  struct btrfs_device {
>  	struct list_head dev_list;
> @@ -73,7 +74,6 @@ struct btrfs_device {
>  	fmode_t mode;
>  
>  	unsigned long dev_state;
> -	int missing;
>  	int can_discard;
>  	int is_tgtdev_for_dev_replace;
>  	blk_status_t last_flush_error;
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD
  2017-11-29  4:45 ` [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD Anand Jain
@ 2017-11-29  9:39   ` Nikolay Borisov
  2017-11-29 10:55     ` Anand Jain
  0 siblings, 1 reply; 11+ messages in thread
From: Nikolay Borisov @ 2017-11-29  9:39 UTC (permalink / raw)
  To: Anand Jain, linux-btrfs; +Cc: bo.li.liu



On 29.11.2017 06:45, Anand Jain wrote:
> Currently device state is being managed by each individual int
> variable such as struct btrfs_device::can_discard. Instead of that
> declare btrfs_device::dev_state BTRFS_DEV_STATE_CAN_DISCARD and use
> the bit operations.
> 
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
>  fs/btrfs/extent-tree.c | 3 ++-
>  fs/btrfs/volumes.c     | 6 +++---
>  fs/btrfs/volumes.h     | 2 +-
>  3 files changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index f81d928754e1..ee79f7cdc543 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -2155,7 +2155,8 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr,
>  
>  		for (i = 0; i < bbio->num_stripes; i++, stripe++) {
>  			u64 bytes;
> -			if (!stripe->dev->can_discard)
> +			if (!test_bit(BTRFS_DEV_STATE_CAN_DISCARD,
> +						&stripe->dev->dev_state))
>  				continue;

Given that we only check for discard support here I can't help but think
do we really need to duplicate the information. We already have struct
block_device in struct btrfs_device, why don't we query for discard
support directly the underlying device, rather than duplicating
information?

>  
>  			ret = btrfs_issue_discard(stripe->dev->bdev,
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 75839e07ce10..a9c6486f06f4 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -647,7 +647,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>  
>  	q = bdev_get_queue(bdev);
>  	if (blk_queue_discard(q))
> -		device->can_discard = 1;
> +		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
>  	if (!blk_queue_nonrot(q))
>  		fs_devices->rotating = 1;
>  
> @@ -2401,7 +2401,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
>  
>  	q = bdev_get_queue(bdev);
>  	if (blk_queue_discard(q))
> -		device->can_discard = 1;
> +		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
>  	set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
>  	device->generation = trans->transid;
>  	device->io_width = fs_info->sectorsize;
> @@ -2601,7 +2601,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
>  
>  	q = bdev_get_queue(bdev);
>  	if (blk_queue_discard(q))
> -		device->can_discard = 1;
> +		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
>  	mutex_lock(&fs_info->fs_devices->device_list_mutex);
>  	set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
>  	device->generation = 0;
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index 2fbff6902c8d..85e4b2dcc071 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -50,6 +50,7 @@ struct btrfs_pending_bios {
>  #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
>  #define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
>  #define BTRFS_DEV_STATE_MISSING		(1UL << 3)
> +#define BTRFS_DEV_STATE_CAN_DISCARD	(1UL << 4)
>  
>  struct btrfs_device {
>  	struct list_head dev_list;
> @@ -74,7 +75,6 @@ struct btrfs_device {
>  	fmode_t mode;
>  
>  	unsigned long dev_state;
> -	int can_discard;
>  	int is_tgtdev_for_dev_replace;
>  	blk_status_t last_flush_error;
>  	int flush_bio_sent;
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE
  2017-11-29  9:14   ` Nikolay Borisov
@ 2017-11-29  9:59     ` Anand Jain
  0 siblings, 0 replies; 11+ messages in thread
From: Anand Jain @ 2017-11-29  9:59 UTC (permalink / raw)
  To: Nikolay Borisov, linux-btrfs; +Cc: bo.li.liu



On 11/29/2017 05:14 PM, Nikolay Borisov wrote:
> 
> 
> On 29.11.2017 06:45, Anand Jain wrote:
>> 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>
>> ---
>>   fs/btrfs/disk-io.c     | 12 ++++++----
>>   fs/btrfs/extent-tree.c |  2 +-
>>   fs/btrfs/extent_io.c   |  3 ++-
>>   fs/btrfs/ioctl.c       |  2 +-
>>   fs/btrfs/scrub.c       |  3 ++-
>>   fs/btrfs/volumes.c     | 63 +++++++++++++++++++++++++++++---------------------
>>   fs/btrfs/volumes.h     |  4 +++-
>>   7 files changed, 54 insertions(+), 35 deletions(-)
>>
>> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
>> index dfdab849037b..0d361b6713e1 100644
>> --- a/fs/btrfs/disk-io.c
>> +++ b/fs/btrfs/disk-io.c
>> @@ -3563,7 +3563,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);
>> @@ -3578,7 +3579,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);
>> @@ -3675,7 +3677,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);
>> @@ -3714,7 +3717,8 @@ int write_all_supers(struct btrfs_fs_info *fs_info, int max_mirrors)
>>   	list_for_each_entry_rcu(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);
>> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
>> index e2d7e86b51d1..f81d928754e1 100644
>> --- a/fs/btrfs/extent-tree.c
>> +++ b/fs/btrfs/extent-tree.c
>> @@ -10935,7 +10935,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. */
>> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
>> index 7fa50e12f18e..f51c797847c7 100644
>> --- a/fs/btrfs/extent_io.c
>> +++ b/fs/btrfs/extent_io.c
>> @@ -2028,7 +2028,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;
>> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
>> index 6c7a49faf4e0..8a74c83503d6 100644
>> --- a/fs/btrfs/ioctl.c
>> +++ b/fs/btrfs/ioctl.c
>> @@ -1518,7 +1518,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);
>> diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
>> index e3f6c49e5c4d..e027e0de66a5 100644
>> --- a/fs/btrfs/scrub.c
>> +++ b/fs/btrfs/scrub.c
>> @@ -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);
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index 397b335d108c..0f5be1808c6e 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -634,10 +634,15 @@ 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);
>> @@ -651,7 +656,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>>   	device->mode = flags;
>>   
>>   	fs_devices->open_devices++;
>> -	if (device->writeable &&
>> +	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,
>> @@ -881,9 +886,10 @@ void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step)
>>   			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--;
>>   		}
>> @@ -925,7 +931,8 @@ static void free_device(struct rcu_head *head)
>>   
>>   static void btrfs_close_bdev(struct btrfs_device *device)
>>   {
>> -	if (device->bdev && device->writeable) {
>> +	if (device->bdev &&
>> +		test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
>>   		sync_blockdev(device->bdev);
>>   		invalidate_bdev(device->bdev);
>>   	}
>> @@ -943,7 +950,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--;
>> @@ -1901,12 +1908,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--;
>> @@ -1968,7 +1976,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);
>> @@ -1994,7 +2002,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>>   	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);
>> @@ -2025,7 +2033,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)
>> @@ -2037,7 +2045,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);
>>   	}
>> @@ -2391,7 +2399,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
>>   	q = bdev_get_queue(bdev);
>>   	if (blk_queue_discard(q))
>>   		device->can_discard = 1;
>> -	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;
>> @@ -2592,7 +2600,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
>>   	if (blk_queue_discard(q))
>>   		device->can_discard = 1;
>>   	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;
>> @@ -2692,7 +2700,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);
>> @@ -3512,7 +3520,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)
>> @@ -4395,7 +4403,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);
>>   	}
>> @@ -4520,7 +4528,7 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)
>>   	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);
>> @@ -4680,7 +4688,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;
>> @@ -5035,12 +5043,13 @@ int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset)
>>   
>>   	map = em->map_lookup;
>>   	for (i = 0; i < map->num_stripes; i++) {
>> -		if (map->stripes[i].dev->missing) {
>> +		struct btrfs_device *device = map->stripes[i].dev;
>> +
>> +		if (device->missing) {
> 
> nit: This is unrelated change.

  Actually this helped to avoid the super long code. I could revert it
  though, I am ok either ways.

>>   			miss_ndevs++;
>>   			continue;
>>   		}
>> -
>> -		if (!map->stripes[i].dev->writeable) {
>> +		if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
>>   			readonly = 1;
>>   			goto end;
>>   		}
>> @@ -6220,7 +6229,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;
>>   		}
>> @@ -6656,7 +6666,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;
>> @@ -6664,7 +6674,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);
>> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
>> index ff15208344a7..2e376a422626 100644
>> --- a/fs/btrfs/volumes.h
>> +++ b/fs/btrfs/volumes.h
>> @@ -47,6 +47,8 @@ struct btrfs_pending_bios {
>>   #define btrfs_device_data_ordered_init(device) do { } while (0)
>>   #endif
>>   
>> +#define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
> 
> Any reason why you start at bit position 1 and not 0 ?

  Right. I was wondering if we need BTRFS_DEV_STATE_ONLINE at some point.
  So thought it will be nice to reserve 0 for that, not a strong reason
  though. I am ok to start from 0 if there is any concern.

Thanks, Anand

>> +
>>   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 can_discard;
>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD
  2017-11-29  9:39   ` Nikolay Borisov
@ 2017-11-29 10:55     ` Anand Jain
  0 siblings, 0 replies; 11+ messages in thread
From: Anand Jain @ 2017-11-29 10:55 UTC (permalink / raw)
  To: Nikolay Borisov, linux-btrfs; +Cc: bo.li.liu



On 11/29/2017 05:39 PM, Nikolay Borisov wrote:
> 
> 
> On 29.11.2017 06:45, Anand Jain wrote:
>> Currently device state is being managed by each individual int
>> variable such as struct btrfs_device::can_discard. Instead of that
>> declare btrfs_device::dev_state BTRFS_DEV_STATE_CAN_DISCARD and use
>> the bit operations.
>>
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>>   fs/btrfs/extent-tree.c | 3 ++-
>>   fs/btrfs/volumes.c     | 6 +++---
>>   fs/btrfs/volumes.h     | 2 +-
>>   3 files changed, 6 insertions(+), 5 deletions(-)
>>
>> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
>> index f81d928754e1..ee79f7cdc543 100644
>> --- a/fs/btrfs/extent-tree.c
>> +++ b/fs/btrfs/extent-tree.c
>> @@ -2155,7 +2155,8 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr,
>>   
>>   		for (i = 0; i < bbio->num_stripes; i++, stripe++) {
>>   			u64 bytes;
>> -			if (!stripe->dev->can_discard)
>> +			if (!test_bit(BTRFS_DEV_STATE_CAN_DISCARD,
>> +						&stripe->dev->dev_state))
>>   				continue;
> 
> Given that we only check for discard support here I can't help but think
> do we really need to duplicate the information. We already have struct
> block_device in struct btrfs_device, why don't we query for discard
> support directly the underlying device, rather than duplicating
> information?

  I agree. bdev_get_queue(bdev) and blk_queue_discard(q) are light weight
  too.
  So I shall withdraw this patch and sent the following patch to
  remove can_discard altogether.
    [PATCH] btrfs: drop btrfs_device::can_discard to query directly

Thanks, Anand


>>   
>>   			ret = btrfs_issue_discard(stripe->dev->bdev,
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index 75839e07ce10..a9c6486f06f4 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -647,7 +647,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
>>   
>>   	q = bdev_get_queue(bdev);
>>   	if (blk_queue_discard(q))
>> -		device->can_discard = 1;
>> +		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
>>   	if (!blk_queue_nonrot(q))
>>   		fs_devices->rotating = 1;
>>   
>> @@ -2401,7 +2401,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
>>   
>>   	q = bdev_get_queue(bdev);
>>   	if (blk_queue_discard(q))
>> -		device->can_discard = 1;
>> +		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
>>   	set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
>>   	device->generation = trans->transid;
>>   	device->io_width = fs_info->sectorsize;
>> @@ -2601,7 +2601,7 @@ int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
>>   
>>   	q = bdev_get_queue(bdev);
>>   	if (blk_queue_discard(q))
>> -		device->can_discard = 1;
>> +		set_bit(BTRFS_DEV_STATE_CAN_DISCARD, &device->dev_state);
>>   	mutex_lock(&fs_info->fs_devices->device_list_mutex);
>>   	set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
>>   	device->generation = 0;
>> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
>> index 2fbff6902c8d..85e4b2dcc071 100644
>> --- a/fs/btrfs/volumes.h
>> +++ b/fs/btrfs/volumes.h
>> @@ -50,6 +50,7 @@ struct btrfs_pending_bios {
>>   #define BTRFS_DEV_STATE_WRITEABLE	(1UL << 1)
>>   #define BTRFS_DEV_STATE_IN_FS_METADATA	(1UL << 2)
>>   #define BTRFS_DEV_STATE_MISSING		(1UL << 3)
>> +#define BTRFS_DEV_STATE_CAN_DISCARD	(1UL << 4)
>>   
>>   struct btrfs_device {
>>   	struct list_head dev_list;
>> @@ -74,7 +75,6 @@ struct btrfs_device {
>>   	fmode_t mode;
>>   
>>   	unsigned long dev_state;
>> -	int can_discard;
>>   	int is_tgtdev_for_dev_replace;
>>   	blk_status_t last_flush_error;
>>   	int flush_bio_sent;
>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-11-29 10:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-29  4:45 [PATCH 0/4] define BTRFS_DEV_STATE Anand Jain
2017-11-29  4:45 ` [PATCH 1/4] btrfs: cleanup device states define BTRFS_DEV_STATE_WRITEABLE Anand Jain
2017-11-29  9:14   ` Nikolay Borisov
2017-11-29  9:59     ` Anand Jain
2017-11-29  4:45 ` [PATCH 2/4] btrfs: cleanup device states define BTRFS_DEV_STATE_IN_FS_METADATA Anand Jain
2017-11-29  9:20   ` Nikolay Borisov
2017-11-29  4:45 ` [PATCH 3/4] btrfs: cleanup device states define BTRFS_DEV_STATE_MISSING Anand Jain
2017-11-29  9:35   ` Nikolay Borisov
2017-11-29  4:45 ` [PATCH 4/4] btrfs: cleanup device states define BTRFS_DEV_STATE_CAN_DISCARD Anand Jain
2017-11-29  9:39   ` Nikolay Borisov
2017-11-29 10:55     ` Anand Jain

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.