* [PATCH] btrfs: delete function btrfs_close_extra_devices()
@ 2018-01-26 3:02 Anand Jain
2018-02-08 7:31 ` Anand Jain
0 siblings, 1 reply; 2+ messages in thread
From: Anand Jain @ 2018-01-26 3:02 UTC (permalink / raw)
To: linux-btrfs
btrfs_close_extra_devices() is not exactly about just closing the opened
devices, but its about free-ing the stale devices which may have scanned
into the given fsid which is being mounted.
The way it picks devices to be freeed is by going through the
btrfs_fs_devices::dev_list and finding devices which aren't set with the
BTRFS_DEV_STATE_IN_FS_METADATA flag and also not part of the replace
target. Also do the samething with seed devices as well.
However the devices are added to the btrfs_fs_devices::dev_list is
by fsid+uuid+devid, so only those devices which belong to the respective
fsid will be added to the btrfs_fs_devices::dev_list.
If there are devices with the matching fsid+uuid+devid but with lower
generation number (such as a replace src device) then it gets
overwritten by the device with higher generation number in the list.
So there isn't any opportunity that btrfs_close_extra_devices() can free
the stale device for a given fsid.
The stale devices are actually outside of the given fsid which are in
fact are handled by btrfs_free_stale_devices() well before
btrfs_close_extra_devices() is called.
The btrfs_fs_devices::latest_bdev is also assigned by the
__btrfs_open_devices() and is based on the generation number again.
So this patch deletes btrfs_close_extra_devices() function and its calls
as there is no use of it.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/disk-io.c | 13 -----------
fs/btrfs/volumes.c | 63 ------------------------------------------------------
fs/btrfs/volumes.h | 1 -
3 files changed, 77 deletions(-)
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index ed095202942f..d36b5e41875c 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2766,17 +2766,6 @@ int open_ctree(struct super_block *sb,
goto fail_tree_roots;
}
- /*
- * keep the device that is marked to be the target device for the
- * dev_replace procedure
- */
- btrfs_close_extra_devices(fs_devices, 0);
-
- if (!fs_devices->latest_bdev) {
- btrfs_err(fs_info, "failed to read devices");
- goto fail_tree_roots;
- }
-
retry_root_backup:
generation = btrfs_super_generation(disk_super);
@@ -2833,8 +2822,6 @@ int open_ctree(struct super_block *sb,
goto fail_block_groups;
}
- btrfs_close_extra_devices(fs_devices, 1);
-
ret = btrfs_sysfs_add_fsid(fs_devices, NULL);
if (ret) {
btrfs_err(fs_info, "failed to init sysfs fsid interface: %d",
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 64071db7d8ab..4d090d2897c0 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -894,69 +894,6 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
return ERR_PTR(-ENOMEM);
}
-void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step)
-{
- struct btrfs_device *device, *next;
- struct btrfs_device *latest_dev = NULL;
-
- mutex_lock(&uuid_mutex);
-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 (test_bit(BTRFS_DEV_STATE_IN_FS_METADATA,
- &device->dev_state)) {
- if (!test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
- &device->dev_state) &&
- (!latest_dev ||
- device->generation > latest_dev->generation)) {
- latest_dev = device;
- }
- continue;
- }
-
- if (device->devid == BTRFS_DEV_REPLACE_DEVID) {
- /*
- * In the first step, keep the device which has
- * the correct fsid and the devid that is used
- * for the dev_replace procedure.
- * In the second step, the dev_replace state is
- * read from the device tree and it is known
- * whether the procedure is really active or
- * not, which means whether this device is
- * used or whether it should be removed.
- */
- if (step == 0 || test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
- &device->dev_state)) {
- continue;
- }
- }
- if (device->bdev) {
- blkdev_put(device->bdev, device->mode);
- device->bdev = NULL;
- fs_devices->open_devices--;
- }
- if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
- list_del_init(&device->dev_alloc_list);
- clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
- if (!test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
- &device->dev_state))
- fs_devices->rw_devices--;
- }
- list_del_init(&device->dev_list);
- fs_devices->num_devices--;
- free_device(device);
- }
-
- if (fs_devices->seed) {
- fs_devices = fs_devices->seed;
- goto again;
- }
-
- fs_devices->latest_bdev = latest_dev->bdev;
-
- mutex_unlock(&uuid_mutex);
-}
-
static void free_device_rcu(struct rcu_head *head)
{
struct btrfs_device *device;
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index d473a7fc328d..8d6384d1fa83 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -431,7 +431,6 @@ int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
struct btrfs_fs_devices **fs_devices_ret);
int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
-void btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices, int step);
void btrfs_assign_next_active_device(struct btrfs_fs_info *fs_info,
struct btrfs_device *device, struct btrfs_device *this_dev);
int btrfs_find_device_missing_or_by_path(struct btrfs_fs_info *fs_info,
--
2.15.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] btrfs: delete function btrfs_close_extra_devices()
2018-01-26 3:02 [PATCH] btrfs: delete function btrfs_close_extra_devices() Anand Jain
@ 2018-02-08 7:31 ` Anand Jain
0 siblings, 0 replies; 2+ messages in thread
From: Anand Jain @ 2018-02-08 7:31 UTC (permalink / raw)
To: linux-btrfs
ping ?
Thanks, Anand
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-02-08 7:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-26 3:02 [PATCH] btrfs: delete function btrfs_close_extra_devices() Anand Jain
2018-02-08 7:31 ` Anand Jain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).