if (IS_ERR(fs_devices))
                        return ERR_CAST(fs_devices);
 
+               mutex_lock(&fs_devices->device_list_mutex);
                list_add(&fs_devices->fs_list, &fs_uuids);
 
                device = NULL;
        } else {
+               mutex_lock(&fs_devices->device_list_mutex);
                device = find_device(fs_devices, devid,
                                disk_super->dev_item.uuid);
        }
 
        if (!device) {
-               if (fs_devices->opened)
+               if (fs_devices->opened) {
+                       mutex_unlock(&fs_devices->device_list_mutex);
                        return ERR_PTR(-EBUSY);
+               }
 
                device = btrfs_alloc_device(NULL, &devid,
                                            disk_super->dev_item.uuid);
                if (IS_ERR(device)) {
+                       mutex_unlock(&fs_devices->device_list_mutex);
                        /* we can safely leave the fs_devices entry around */
                        return device;
                }
                name = rcu_string_strdup(path, GFP_NOFS);
                if (!name) {
                        btrfs_free_device(device);
+                       mutex_unlock(&fs_devices->device_list_mutex);
                        return ERR_PTR(-ENOMEM);
                }
                rcu_assign_pointer(device->name, name);
 
-               mutex_lock(&fs_devices->device_list_mutex);
                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;
                *new_device_added = true;
                         * with larger generation number or the last-in if
                         * generation are equal.
                         */
+                       mutex_unlock(&fs_devices->device_list_mutex);
                        return ERR_PTR(-EEXIST);
                }
 
                name = rcu_string_strdup(path, GFP_NOFS);
-               if (!name)
+               if (!name) {
+                       mutex_unlock(&fs_devices->device_list_mutex);
                        return ERR_PTR(-ENOMEM);
+               }
                rcu_string_free(device->name);
                rcu_assign_pointer(device->name, name);
                if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) {
 
        fs_devices->total_devices = btrfs_super_num_devices(disk_super);
 
+       mutex_unlock(&fs_devices->device_list_mutex);
        return device;
 }