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:57 -0400 |
commit | 9bb81c9be90c1ad265547f0a40f543548d263fb4 (patch) | |
tree | 8e2f0bb0b5bd523b9591a7cf3db12eb6ef145f69 /drivers/block/rbd.c | |
parent | 5de10f3b0c99983e3f9ec19baa1eb691685d9b8f (diff) |
rbd: move more initialization into rbd_dev_image_probe()
Move a block of initialization related to the "ceph-side" of an rbd
image out of rbd_dev_probe_finish() and into rbd_dev_image_probe().
Add appropriate error handling to clean things up in the event any
of these new functions return an error.
We know that rbd_dev_snaps_update(), rbd_dev_spec_update(), and
rbd_dev_probe_parent() all clean up after themselves before they
return an error, so no special cleanup is required except when an
earlier call succeeds. Since rbd_dev_spec_update() only updates the
spec field (whose cleanup will be handled by dropping the last
reference to the spec) there is no cleanup action associatied with
that.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index e86238c90677..ebf4d470e13f 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -4755,26 +4755,13 @@ static int rbd_dev_probe_finish(struct rbd_device *rbd_dev) | |||
4755 | { | 4755 | { |
4756 | int ret; | 4756 | int ret; |
4757 | 4757 | ||
4758 | /* no need to lock here, as rbd_dev is not registered yet */ | ||
4759 | ret = rbd_dev_snaps_update(rbd_dev); | ||
4760 | if (ret) | ||
4761 | return ret; | ||
4762 | |||
4763 | ret = rbd_dev_spec_update(rbd_dev); | ||
4764 | if (ret) | ||
4765 | goto err_out_snaps; | ||
4766 | |||
4767 | ret = rbd_dev_header_watch_sync(rbd_dev, 1); | 4758 | ret = rbd_dev_header_watch_sync(rbd_dev, 1); |
4768 | if (ret) | 4759 | if (ret) |
4769 | goto err_out_snaps; | 4760 | return ret; |
4770 | 4761 | ||
4771 | ret = rbd_dev_mapping_set(rbd_dev); | 4762 | ret = rbd_dev_mapping_set(rbd_dev); |
4772 | if (ret) | 4763 | if (ret) |
4773 | goto err_out_snaps; | 4764 | return ret; |
4774 | |||
4775 | ret = rbd_dev_probe_parent(rbd_dev); | ||
4776 | if (ret) | ||
4777 | goto err_out_mapping; | ||
4778 | 4765 | ||
4779 | /* generate unique id: find highest unique id, add one */ | 4766 | /* generate unique id: find highest unique id, add one */ |
4780 | rbd_dev_id_get(rbd_dev); | 4767 | rbd_dev_id_get(rbd_dev); |
@@ -4818,11 +4805,7 @@ err_out_blkdev: | |||
4818 | unregister_blkdev(rbd_dev->major, rbd_dev->name); | 4805 | unregister_blkdev(rbd_dev->major, rbd_dev->name); |
4819 | err_out_id: | 4806 | err_out_id: |
4820 | rbd_dev_id_put(rbd_dev); | 4807 | rbd_dev_id_put(rbd_dev); |
4821 | rbd_dev_remove_parent(rbd_dev); | ||
4822 | err_out_mapping: | ||
4823 | rbd_dev_mapping_clear(rbd_dev); | 4808 | rbd_dev_mapping_clear(rbd_dev); |
4824 | err_out_snaps: | ||
4825 | rbd_remove_all_snaps(rbd_dev); | ||
4826 | 4809 | ||
4827 | return ret; | 4810 | return ret; |
4828 | } | 4811 | } |
@@ -4854,11 +4837,28 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev) | |||
4854 | if (ret) | 4837 | if (ret) |
4855 | goto out_err; | 4838 | goto out_err; |
4856 | 4839 | ||
4840 | ret = rbd_dev_snaps_update(rbd_dev); | ||
4841 | if (ret) | ||
4842 | goto out_err; | ||
4843 | |||
4844 | ret = rbd_dev_spec_update(rbd_dev); | ||
4845 | if (ret) | ||
4846 | goto err_out_snaps; | ||
4847 | |||
4848 | ret = rbd_dev_probe_parent(rbd_dev); | ||
4849 | if (ret) | ||
4850 | goto err_out_snaps; | ||
4851 | |||
4857 | ret = rbd_dev_probe_finish(rbd_dev); | 4852 | ret = rbd_dev_probe_finish(rbd_dev); |
4858 | if (ret) | 4853 | if (ret) |
4859 | rbd_header_free(&rbd_dev->header); | 4854 | goto err_out_parent; |
4860 | 4855 | ||
4861 | return ret; | 4856 | return ret; |
4857 | err_out_parent: | ||
4858 | rbd_dev_remove_parent(rbd_dev); | ||
4859 | rbd_header_free(&rbd_dev->header); | ||
4860 | err_out_snaps: | ||
4861 | rbd_remove_all_snaps(rbd_dev); | ||
4862 | out_err: | 4862 | out_err: |
4863 | kfree(rbd_dev->spec->image_id); | 4863 | kfree(rbd_dev->spec->image_id); |
4864 | rbd_dev->spec->image_id = NULL; | 4864 | rbd_dev->spec->image_id = NULL; |