diff options
author | Alex Elder <elder@inktank.com> | 2013-04-29 00:32:34 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:20:07 -0400 |
commit | b536f69a3a589113992c32982bf2981c8225c9da (patch) | |
tree | 389599582a07f0e268a0ad4a755027aa1c8319fa | |
parent | 8ad42cd0c002fa278f6d0135e22fcb188e400a28 (diff) |
rbd: set up devices only for mapped images
Stop setting up Linux devices during the image probe operation.
Instead, set up the devices as a separate step after the image
probe, in rbd_add().
A consequence of this is that only mapped images get devices
assigned to them, which is pretty sweet.
This resolves:
http://tracker.ceph.com/issues/4774
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r-- | drivers/block/rbd.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 57e56617e45f..d41f97690343 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -4879,10 +4879,6 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev) | |||
4879 | goto err_out_snaps; | 4879 | goto err_out_snaps; |
4880 | 4880 | ||
4881 | ret = rbd_dev_probe_parent(rbd_dev); | 4881 | ret = rbd_dev_probe_parent(rbd_dev); |
4882 | if (ret) | ||
4883 | goto err_out_snaps; | ||
4884 | |||
4885 | ret = rbd_dev_device_setup(rbd_dev); | ||
4886 | if (!ret) | 4882 | if (!ret) |
4887 | return 0; | 4883 | return 0; |
4888 | 4884 | ||
@@ -4964,9 +4960,12 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
4964 | if (rc < 0) | 4960 | if (rc < 0) |
4965 | goto err_out_rbd_dev; | 4961 | goto err_out_rbd_dev; |
4966 | 4962 | ||
4967 | return count; | 4963 | rc = rbd_dev_device_setup(rbd_dev); |
4964 | if (!rc) | ||
4965 | return count; | ||
4966 | |||
4967 | rbd_dev_image_release(rbd_dev); | ||
4968 | err_out_rbd_dev: | 4968 | err_out_rbd_dev: |
4969 | kfree(rbd_dev->header_name); | ||
4970 | rbd_dev_destroy(rbd_dev); | 4969 | rbd_dev_destroy(rbd_dev); |
4971 | err_out_client: | 4970 | err_out_client: |
4972 | rbd_put_client(rbdc); | 4971 | rbd_put_client(rbdc); |
@@ -5029,7 +5028,6 @@ static void rbd_dev_remove_parent(struct rbd_device *rbd_dev) | |||
5029 | second = third; | 5028 | second = third; |
5030 | } | 5029 | } |
5031 | rbd_assert(second); | 5030 | rbd_assert(second); |
5032 | rbd_bus_del_dev(second); | ||
5033 | rbd_dev_image_release(second); | 5031 | rbd_dev_image_release(second); |
5034 | first->parent = NULL; | 5032 | first->parent = NULL; |
5035 | first->parent_overlap = 0; | 5033 | first->parent_overlap = 0; |