diff options
author | Alex Elder <elder@inktank.com> | 2013-04-27 10:59:30 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:19:51 -0400 |
commit | d1cf5788450e1781f63a0626a854fe8309b32cb1 (patch) | |
tree | 78fc5c0297b73cd684f62513ad330636b3b8e75b /drivers/block | |
parent | 05a46afdc7f0f73d42dcecd8ee80f9558b4c38f7 (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.c | 21 |
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 | ||
869 | static int rbd_dev_set_mapping(struct rbd_device *rbd_dev) | 869 | static 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 | ||
889 | static 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 | |||
889 | static void rbd_header_free(struct rbd_image_header *header) | 896 | static 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); |
4818 | err_out_id: | 4825 | err_out_id: |
4819 | rbd_dev_id_put(rbd_dev); | 4826 | rbd_dev_id_put(rbd_dev); |
4827 | rbd_dev_mapping_clear(rbd_dev); | ||
4820 | err_out_snaps: | 4828 | err_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); |