diff options
| -rw-r--r-- | drivers/block/rbd.c | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 46b8f8e536be..6e735a754b5f 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -1652,8 +1652,6 @@ static void rbd_free_disk(struct rbd_device *rbd_dev) | |||
| 1652 | if (!disk) | 1652 | if (!disk) |
| 1653 | return; | 1653 | return; |
| 1654 | 1654 | ||
| 1655 | rbd_header_free(&rbd_dev->header); | ||
| 1656 | |||
| 1657 | if (disk->flags & GENHD_FL_UP) | 1655 | if (disk->flags & GENHD_FL_UP) |
| 1658 | del_gendisk(disk); | 1656 | del_gendisk(disk); |
| 1659 | if (disk->queue) | 1657 | if (disk->queue) |
| @@ -1875,20 +1873,6 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) | |||
| 1875 | int rc; | 1873 | int rc; |
| 1876 | u64 segment_size; | 1874 | u64 segment_size; |
| 1877 | 1875 | ||
| 1878 | /* contact OSD, request size info about the object being mapped */ | ||
| 1879 | rc = rbd_read_header(rbd_dev, &rbd_dev->header); | ||
| 1880 | if (rc) | ||
| 1881 | return rc; | ||
| 1882 | |||
| 1883 | /* no need to lock here, as rbd_dev is not registered yet */ | ||
| 1884 | rc = rbd_dev_snap_devs_update(rbd_dev); | ||
| 1885 | if (rc) | ||
| 1886 | return rc; | ||
| 1887 | |||
| 1888 | rc = rbd_header_set_snap(rbd_dev, snap_name); | ||
| 1889 | if (rc) | ||
| 1890 | return rc; | ||
| 1891 | |||
| 1892 | /* create gendisk info */ | 1876 | /* create gendisk info */ |
| 1893 | rc = -ENOMEM; | 1877 | rc = -ENOMEM; |
| 1894 | disk = alloc_disk(RBD_MINORS_PER_MAJOR); | 1878 | disk = alloc_disk(RBD_MINORS_PER_MAJOR); |
| @@ -1925,12 +1909,6 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) | |||
| 1925 | 1909 | ||
| 1926 | rbd_dev->disk = disk; | 1910 | rbd_dev->disk = disk; |
| 1927 | 1911 | ||
| 1928 | /* finally, announce the disk to the world */ | ||
| 1929 | set_capacity(disk, (sector_t) rbd_dev->mapping.size / SECTOR_SIZE); | ||
| 1930 | add_disk(disk); | ||
| 1931 | |||
| 1932 | pr_info("%s: added with size 0x%llx\n", | ||
| 1933 | disk->disk_name, (unsigned long long) rbd_dev->mapping.size); | ||
| 1934 | return 0; | 1912 | return 0; |
| 1935 | 1913 | ||
| 1936 | out_disk: | 1914 | out_disk: |
| @@ -2622,13 +2600,35 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
| 2622 | /* | 2600 | /* |
| 2623 | * At this point cleanup in the event of an error is the job | 2601 | * At this point cleanup in the event of an error is the job |
| 2624 | * of the sysfs code (initiated by rbd_bus_del_dev()). | 2602 | * of the sysfs code (initiated by rbd_bus_del_dev()). |
| 2625 | * | ||
| 2626 | * Set up and announce blkdev mapping. | ||
| 2627 | */ | 2603 | */ |
| 2604 | |||
| 2605 | /* contact OSD, request size info about the object being mapped */ | ||
| 2606 | rc = rbd_read_header(rbd_dev, &rbd_dev->header); | ||
| 2607 | if (rc) | ||
| 2608 | goto err_out_bus; | ||
| 2609 | |||
| 2610 | /* no need to lock here, as rbd_dev is not registered yet */ | ||
| 2611 | rc = rbd_dev_snap_devs_update(rbd_dev); | ||
| 2612 | if (rc) | ||
| 2613 | goto err_out_bus; | ||
| 2614 | |||
| 2615 | rc = rbd_header_set_snap(rbd_dev, snap_name); | ||
| 2616 | if (rc) | ||
| 2617 | goto err_out_bus; | ||
| 2618 | |||
| 2619 | /* Set up the blkdev mapping. */ | ||
| 2620 | |||
| 2628 | rc = rbd_init_disk(rbd_dev); | 2621 | rc = rbd_init_disk(rbd_dev); |
| 2629 | if (rc) | 2622 | if (rc) |
| 2630 | goto err_out_bus; | 2623 | goto err_out_bus; |
| 2631 | 2624 | ||
| 2625 | /* Everything's ready. Announce the disk to the world. */ | ||
| 2626 | |||
| 2627 | set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); | ||
| 2628 | add_disk(rbd_dev->disk); | ||
| 2629 | pr_info("%s: added with size 0x%llx\n", rbd_dev->disk->disk_name, | ||
| 2630 | (unsigned long long) rbd_dev->mapping.size); | ||
| 2631 | |||
| 2632 | rc = rbd_init_watch_dev(rbd_dev); | 2632 | rc = rbd_init_watch_dev(rbd_dev); |
| 2633 | if (rc) | 2633 | if (rc) |
| 2634 | goto err_out_bus; | 2634 | goto err_out_bus; |
| @@ -2700,6 +2700,9 @@ static void rbd_dev_release(struct device *dev) | |||
| 2700 | rbd_free_disk(rbd_dev); | 2700 | rbd_free_disk(rbd_dev); |
| 2701 | unregister_blkdev(rbd_dev->major, rbd_dev->name); | 2701 | unregister_blkdev(rbd_dev->major, rbd_dev->name); |
| 2702 | 2702 | ||
| 2703 | /* release allocated disk header fields */ | ||
| 2704 | rbd_header_free(&rbd_dev->header); | ||
| 2705 | |||
| 2703 | /* done with the id, and with the rbd_dev */ | 2706 | /* done with the id, and with the rbd_dev */ |
| 2704 | kfree(rbd_dev->mapping.snap_name); | 2707 | kfree(rbd_dev->mapping.snap_name); |
| 2705 | kfree(rbd_dev->header_name); | 2708 | kfree(rbd_dev->header_name); |
