aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-27 10:59:30 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:19:51 -0400
commitd1cf5788450e1781f63a0626a854fe8309b32cb1 (patch)
tree78fc5c0297b73cd684f62513ad330636b3b8e75b /drivers/block
parent05a46afdc7f0f73d42dcecd8ee80f9558b4c38f7 (diff)
rbd: set mapping info earlier
Set the mapping size and features earlier in rbd_dev_probe_finish(). Define rbd_dev_mapping_clear() as an inverse for setting those fields, and use it both in error handling in rbd_dev_image_probe() and in the final cleanup in rbd_dev_release(). Change the name of rbd_dev_set_mapping() to of rbd_dev_mapping_set(). 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.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 87ef01189b83..98e0b8c3def8 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -866,7 +866,7 @@ static struct rbd_snap *snap_by_name(struct rbd_device *rbd_dev,
866 return NULL; 866 return NULL;
867} 867}
868 868
869static int rbd_dev_set_mapping(struct rbd_device *rbd_dev) 869static int rbd_dev_mapping_set(struct rbd_device *rbd_dev)
870{ 870{
871 if (!memcmp(rbd_dev->spec->snap_name, RBD_SNAP_HEAD_NAME, 871 if (!memcmp(rbd_dev->spec->snap_name, RBD_SNAP_HEAD_NAME,
872 sizeof (RBD_SNAP_HEAD_NAME))) { 872 sizeof (RBD_SNAP_HEAD_NAME))) {
@@ -886,6 +886,13 @@ static int rbd_dev_set_mapping(struct rbd_device *rbd_dev)
886 return 0; 886 return 0;
887} 887}
888 888
889static void rbd_dev_mapping_clear(struct rbd_device *rbd_dev)
890{
891 rbd_dev->mapping.size = 0;
892 rbd_dev->mapping.features = 0;
893 rbd_dev->mapping.read_only = true;
894}
895
889static void rbd_header_free(struct rbd_image_header *header) 896static void rbd_header_free(struct rbd_image_header *header)
890{ 897{
891 kfree(header->object_prefix); 898 kfree(header->object_prefix);
@@ -4757,7 +4764,11 @@ static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
4757 if (ret) 4764 if (ret)
4758 goto err_out_snaps; 4765 goto err_out_snaps;
4759 4766
4760 ret = rbd_dev_set_mapping(rbd_dev); 4767 ret = rbd_dev_header_watch_sync(rbd_dev, 1);
4768 if (ret)
4769 goto err_out_snaps;
4770
4771 ret = rbd_dev_mapping_set(rbd_dev);
4761 if (ret) 4772 if (ret)
4762 goto err_out_snaps; 4773 goto err_out_snaps;
4763 4774
@@ -4790,10 +4801,6 @@ static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
4790 if (ret) 4801 if (ret)
4791 goto err_out_bus; 4802 goto err_out_bus;
4792 4803
4793 ret = rbd_dev_header_watch_sync(rbd_dev, 1);
4794 if (ret)
4795 goto err_out_bus;
4796
4797 /* Everything's ready. Announce the disk to the world. */ 4804 /* Everything's ready. Announce the disk to the world. */
4798 4805
4799 set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); 4806 set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE);
@@ -4817,6 +4824,7 @@ err_out_blkdev:
4817 unregister_blkdev(rbd_dev->major, rbd_dev->name); 4824 unregister_blkdev(rbd_dev->major, rbd_dev->name);
4818err_out_id: 4825err_out_id:
4819 rbd_dev_id_put(rbd_dev); 4826 rbd_dev_id_put(rbd_dev);
4827 rbd_dev_mapping_clear(rbd_dev);
4820err_out_snaps: 4828err_out_snaps:
4821 rbd_remove_all_snaps(rbd_dev); 4829 rbd_remove_all_snaps(rbd_dev);
4822 4830
@@ -4974,6 +4982,7 @@ static void rbd_dev_release(struct device *dev)
4974 4982
4975 /* done with the id, and with the rbd_dev */ 4983 /* done with the id, and with the rbd_dev */
4976 rbd_dev_id_put(rbd_dev); 4984 rbd_dev_id_put(rbd_dev);
4985 rbd_dev_mapping_clear(rbd_dev);
4977 rbd_assert(rbd_dev->rbd_client != NULL); 4986 rbd_assert(rbd_dev->rbd_client != NULL);
4978 rbd_spec_put(rbd_dev->parent_spec); 4987 rbd_spec_put(rbd_dev->parent_spec);
4979 kfree(rbd_dev->header_name); 4988 kfree(rbd_dev->header_name);