aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/rbd.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index a9f5de2706ec..aa4752d9d9fa 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2601,10 +2601,25 @@ static ssize_t rbd_add(struct bus_type *bus,
2601 goto err_out_client; 2601 goto err_out_client;
2602 sprintf(rbd_dev->header_name, "%s%s", rbd_dev->image_name, RBD_SUFFIX); 2602 sprintf(rbd_dev->header_name, "%s%s", rbd_dev->image_name, RBD_SUFFIX);
2603 2603
2604 /* Get information about the image being mapped */
2605
2606 rc = rbd_read_header(rbd_dev, &rbd_dev->header);
2607 if (rc)
2608 goto err_out_client;
2609
2610 /* no need to lock here, as rbd_dev is not registered yet */
2611 rc = rbd_dev_snaps_update(rbd_dev);
2612 if (rc)
2613 goto err_out_header;
2614
2615 rc = rbd_dev_set_mapping(rbd_dev, snap_name);
2616 if (rc)
2617 goto err_out_header;
2618
2604 /* register our block device */ 2619 /* register our block device */
2605 rc = register_blkdev(0, rbd_dev->name); 2620 rc = register_blkdev(0, rbd_dev->name);
2606 if (rc < 0) 2621 if (rc < 0)
2607 goto err_out_client; 2622 goto err_out_header;
2608 rbd_dev->major = rc; 2623 rbd_dev->major = rc;
2609 2624
2610 rc = rbd_bus_add_dev(rbd_dev); 2625 rc = rbd_bus_add_dev(rbd_dev);
@@ -2616,20 +2631,6 @@ static ssize_t rbd_add(struct bus_type *bus,
2616 * of the sysfs code (initiated by rbd_bus_del_dev()). 2631 * of the sysfs code (initiated by rbd_bus_del_dev()).
2617 */ 2632 */
2618 2633
2619 /* contact OSD, request size info about the object being mapped */
2620 rc = rbd_read_header(rbd_dev, &rbd_dev->header);
2621 if (rc)
2622 goto err_out_bus;
2623
2624 /* no need to lock here, as rbd_dev is not registered yet */
2625 rc = rbd_dev_snaps_update(rbd_dev);
2626 if (rc)
2627 goto err_out_bus;
2628
2629 rc = rbd_dev_set_mapping(rbd_dev, snap_name);
2630 if (rc)
2631 goto err_out_bus;
2632
2633 down_write(&rbd_dev->header_rwsem); 2634 down_write(&rbd_dev->header_rwsem);
2634 rc = rbd_dev_snaps_register(rbd_dev); 2635 rc = rbd_dev_snaps_register(rbd_dev);
2635 up_write(&rbd_dev->header_rwsem); 2636 up_write(&rbd_dev->header_rwsem);
@@ -2664,6 +2665,8 @@ err_out_bus:
2664 2665
2665err_out_blkdev: 2666err_out_blkdev:
2666 unregister_blkdev(rbd_dev->major, rbd_dev->name); 2667 unregister_blkdev(rbd_dev->major, rbd_dev->name);
2668err_out_header:
2669 rbd_header_free(&rbd_dev->header);
2667err_out_client: 2670err_out_client:
2668 kfree(rbd_dev->header_name); 2671 kfree(rbd_dev->header_name);
2669 rbd_put_client(rbd_dev); 2672 rbd_put_client(rbd_dev);