Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b3517e9 authored by Ilya Dryomov's avatar Ilya Dryomov Committed by Chris Mason
Browse files

Btrfs: make btrfs_rm_device() fail gracefully



If shrinking done as part of the online device removal fails add that
device back to the allocation list and increment the rw_devices counter.
This fixes two bugs:

1) we could have a perfectly good device out of alloc list for no good
reason;

2) in the btrfs consisting of two devices, failure in btrfs_rm_device()
could lead to a situation where it was impossible to remove any of the
devices because of the "unable to remove the only writeable device"
error.

Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent ca9b688c
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -1337,11 +1337,11 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)

	ret = btrfs_shrink_device(device, 0);
	if (ret)
		goto error_brelse;
		goto error_undo;

	ret = btrfs_rm_dev_item(root->fs_info->chunk_root, device);
	if (ret)
		goto error_brelse;
		goto error_undo;

	device->in_fs_metadata = 0;

@@ -1415,6 +1415,13 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
	mutex_unlock(&root->fs_info->volume_mutex);
	mutex_unlock(&uuid_mutex);
	return ret;
error_undo:
	if (device->writeable) {
		list_add(&device->dev_alloc_list,
			 &root->fs_info->fs_devices->alloc_list);
		root->fs_info->fs_devices->rw_devices++;
	}
	goto error_brelse;
}

/*