The stale device list removal needs to be protected by device_list_mutex
too as this could delete from the list and could race with another list
modification and cause crash.
The device needs to be fully initialized before it's added to the list
so the fs_devices also need to be set under the mutex.
Signed-off-by: David Sterba <dsterba@xxxxxxxx>
---
fs/btrfs/volumes.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 1da162928d1a..02246f9af0a3 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -791,12 +791,11 @@ static noinline struct btrfs_device *device_list_add(const char *path,
rcu_assign_pointer(device->name, name);
mutex_lock(&fs_devices->device_list_mutex);
+ device->fs_devices = fs_devices;
list_add_rcu(&device->dev_list, &fs_devices->devices);
fs_devices->num_devices++;
- mutex_unlock(&fs_devices->device_list_mutex);
-
- device->fs_devices = fs_devices;
btrfs_free_stale_devices(path, device);
+ mutex_unlock(&fs_devices->device_list_mutex);
if (disk_super->label[0])
pr_info("BTRFS: device label %s devid %llu transid %llu %s\n",
--
2.17.0
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html