aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-29 00:32:34 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:20:07 -0400
commitb536f69a3a589113992c32982bf2981c8225c9da (patch)
tree389599582a07f0e268a0ad4a755027aa1c8319fa
parent8ad42cd0c002fa278f6d0135e22fcb188e400a28 (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.c12
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);
4968err_out_rbd_dev: 4968err_out_rbd_dev:
4969 kfree(rbd_dev->header_name);
4970 rbd_dev_destroy(rbd_dev); 4969 rbd_dev_destroy(rbd_dev);
4971err_out_client: 4970err_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;