rbd: set up devices only for mapped images
authorAlex Elder <elder@inktank.com>
Mon, 29 Apr 2013 04:32:34 +0000 (23:32 -0500)
committerSage Weil <sage@inktank.com>
Thu, 2 May 2013 04:20:07 +0000 (21:20 -0700)
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>
drivers/block/rbd.c

index 57e56617e45ff043c468e0203561c7bf03393c1e..d41f976903432ca2457b9a4c8c5068b640e943a3 100644 (file)
@@ -4879,10 +4879,6 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev)
                goto err_out_snaps;
 
        ret = rbd_dev_probe_parent(rbd_dev);
-       if (ret)
-               goto err_out_snaps;
-
-       ret = rbd_dev_device_setup(rbd_dev);
        if (!ret)
                return 0;
 
@@ -4964,9 +4960,12 @@ static ssize_t rbd_add(struct bus_type *bus,
        if (rc < 0)
                goto err_out_rbd_dev;
 
-       return count;
+       rc = rbd_dev_device_setup(rbd_dev);
+       if (!rc)
+               return count;
+
+       rbd_dev_image_release(rbd_dev);
 err_out_rbd_dev:
-       kfree(rbd_dev->header_name);
        rbd_dev_destroy(rbd_dev);
 err_out_client:
        rbd_put_client(rbdc);
@@ -5029,7 +5028,6 @@ static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)
                        second = third;
                }
                rbd_assert(second);
-               rbd_bus_del_dev(second);
                rbd_dev_image_release(second);
                first->parent = NULL;
                first->parent_overlap = 0;