Commit d8367db3 authored by Anand Jain's avatar Anand Jain Committed by David Sterba

btrfs: make btrfs_free_stale_devices() to match the path

The btrfs_free_stale_devices() is updated to match for the given device
path and delete it. (It searches for only unmounted list of devices.)
Also drop the comment about different path being used for the same
device, since now we will have cli to clean any device that's not a
concern any more.
Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0d34097f
...@@ -604,8 +604,16 @@ static void pending_bios_fn(struct btrfs_work *work) ...@@ -604,8 +604,16 @@ static void pending_bios_fn(struct btrfs_work *work)
run_scheduled_bios(device); run_scheduled_bios(device);
} }
/*
static void btrfs_free_stale_devices(struct btrfs_device *skip_dev) * Search and remove all stale (devices which are not mounted) devices.
* When both inputs are NULL, it will search and release all stale devices.
* path: Optional. When provided will it release all unmounted devices
* matching this path only.
* skip_dev: Optional. Will skip this device when searching for the stale
* devices.
*/
static void btrfs_free_stale_devices(const char *path,
struct btrfs_device *skip_dev)
{ {
struct btrfs_fs_devices *fs_devs, *tmp_fs_devs; struct btrfs_fs_devices *fs_devs, *tmp_fs_devs;
struct btrfs_device *dev, *tmp_dev; struct btrfs_device *dev, *tmp_dev;
...@@ -619,19 +627,15 @@ static void btrfs_free_stale_devices(struct btrfs_device *skip_dev) ...@@ -619,19 +627,15 @@ static void btrfs_free_stale_devices(struct btrfs_device *skip_dev)
&fs_devs->devices, dev_list) { &fs_devs->devices, dev_list) {
int not_found = 0; int not_found = 0;
if (skip_dev && (skip_dev == dev || !dev->name)) if (skip_dev && skip_dev == dev)
continue;
if (path && !dev->name)
continue; continue;
/*
* Todo: This won't be enough. What if the same device
* comes back (with new uuid and) with its mapper path?
* But for now, this does help as mostly an admin will
* either use mapper or non mapper path throughout.
*/
rcu_read_lock(); rcu_read_lock();
if (skip_dev) if (path)
not_found = strcmp(rcu_str_deref(dev->name), not_found = strcmp(rcu_str_deref(dev->name),
rcu_str_deref(skip_dev->name)); path);
rcu_read_unlock(); rcu_read_unlock();
if (not_found) if (not_found)
continue; continue;
...@@ -773,7 +777,7 @@ static noinline int device_list_add(const char *path, ...@@ -773,7 +777,7 @@ static noinline int device_list_add(const char *path,
ret = 1; ret = 1;
device->fs_devices = fs_devices; device->fs_devices = fs_devices;
btrfs_free_stale_devices(device); btrfs_free_stale_devices(path, device);
} else if (!device->name || strcmp(device->name->str, path)) { } else if (!device->name || strcmp(device->name->str, path)) {
/* /*
* When FS is already mounted. * When FS is already mounted.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment