summaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorAlex Elder2012-07-27 06:37:14 +0200
committerAlex Elder2012-10-01 21:30:52 +0200
commit85ae8926751db5e09b9a12ee44609ee9e74b7aad (patch)
treec25795bfa1c0d0fe08a950a2a6f79cb4ed9ab29f /drivers/block
parentrbd: read the header before registering device (diff)
downloadkernel-qcow2-linux-85ae8926751db5e09b9a12ee44609ee9e74b7aad.tar.gz
kernel-qcow2-linux-85ae8926751db5e09b9a12ee44609ee9e74b7aad.tar.xz
kernel-qcow2-linux-85ae8926751db5e09b9a12ee44609ee9e74b7aad.zip
rbd: defer setting device id
Hold off setting the device id and formatting the device name in rbd_add() until just before it's needed. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/rbd.c44
1 files changed, 22 insertions, 22 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index aa4752d9d9fa..7a600ca2dbcf 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2554,10 +2554,10 @@ static ssize_t rbd_add(struct bus_type *bus,
options = kmalloc(count, GFP_KERNEL);
if (!options)
- goto err_nomem;
+ goto err_out_mem;
rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
if (!rbd_dev)
- goto err_nomem;
+ goto err_out_mem;
/* static rbd_device initialization */
spin_lock_init(&rbd_dev->lock);
@@ -2565,25 +2565,17 @@ static ssize_t rbd_add(struct bus_type *bus,
INIT_LIST_HEAD(&rbd_dev->snaps);
init_rwsem(&rbd_dev->header_rwsem);
- /* generate unique id: find highest unique id, add one */
- rbd_dev_id_get(rbd_dev);
-
- /* Fill in the device name, now that we have its id. */
- BUILD_BUG_ON(DEV_NAME_LEN
- < sizeof (RBD_DRV_NAME) + MAX_INT_FORMAT_WIDTH);
- sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->dev_id);
-
/* parse add command */
snap_name = rbd_add_parse_args(rbd_dev, buf,
&mon_addrs, &mon_addrs_size, options, count);
if (IS_ERR(snap_name)) {
rc = PTR_ERR(snap_name);
- goto err_put_id;
+ goto err_out_mem;
}
rc = rbd_get_client(rbd_dev, mon_addrs, mon_addrs_size - 1, options);
if (rc < 0)
- goto err_put_id;
+ goto err_out_args;
/* pick the pool */
osdc = &rbd_dev->rbd_client->client->osdc;
@@ -2616,10 +2608,19 @@ static ssize_t rbd_add(struct bus_type *bus,
if (rc)
goto err_out_header;
- /* register our block device */
+ /* generate unique id: find highest unique id, add one */
+ rbd_dev_id_get(rbd_dev);
+
+ /* Fill in the device name, now that we have its id. */
+ BUILD_BUG_ON(DEV_NAME_LEN
+ < sizeof (RBD_DRV_NAME) + MAX_INT_FORMAT_WIDTH);
+ sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->dev_id);
+
+ /* Get our block major device number. */
+
rc = register_blkdev(0, rbd_dev->name);
if (rc < 0)
- goto err_out_header;
+ goto err_out_id;
rbd_dev->major = rc;
rc = rbd_bus_add_dev(rbd_dev);
@@ -2665,19 +2666,18 @@ err_out_bus:
err_out_blkdev:
unregister_blkdev(rbd_dev->major, rbd_dev->name);
+err_out_id:
+ rbd_dev_id_put(rbd_dev);
err_out_header:
rbd_header_free(&rbd_dev->header);
err_out_client:
kfree(rbd_dev->header_name);
rbd_put_client(rbd_dev);
-err_put_id:
- if (rbd_dev->pool_name) {
- kfree(rbd_dev->mapping.snap_name);
- kfree(rbd_dev->image_name);
- kfree(rbd_dev->pool_name);
- }
- rbd_dev_id_put(rbd_dev);
-err_nomem:
+err_out_args:
+ kfree(rbd_dev->mapping.snap_name);
+ kfree(rbd_dev->image_name);
+ kfree(rbd_dev->pool_name);
+err_out_mem:
kfree(rbd_dev);
kfree(options);