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:58 -0400 |
commit | 332bb12db9459d52dfcdb278e7607351d2eff6ab (patch) | |
tree | 02d9744f73467499cfa30f5685663fd076fd0f04 /drivers/block | |
parent | 9bb81c9be90c1ad265547f0a40f543548d263fb4 (diff) |
rbd: define rbd_header_name()
Define a new function rbd_header_name(), which allocates and formats
the name of the header object for the rbd device.
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 | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index ebf4d470e13f..44739640d94f 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -4592,18 +4592,6 @@ out: | |||
4592 | static int rbd_dev_v1_probe(struct rbd_device *rbd_dev) | 4592 | static int rbd_dev_v1_probe(struct rbd_device *rbd_dev) |
4593 | { | 4593 | { |
4594 | int ret; | 4594 | int ret; |
4595 | size_t size; | ||
4596 | |||
4597 | /* Record the header object name for this rbd image. */ | ||
4598 | |||
4599 | size = strlen(rbd_dev->spec->image_name) + sizeof (RBD_SUFFIX); | ||
4600 | rbd_dev->header_name = kmalloc(size, GFP_KERNEL); | ||
4601 | if (!rbd_dev->header_name) { | ||
4602 | ret = -ENOMEM; | ||
4603 | goto out_err; | ||
4604 | } | ||
4605 | sprintf(rbd_dev->header_name, "%s%s", | ||
4606 | rbd_dev->spec->image_name, RBD_SUFFIX); | ||
4607 | 4595 | ||
4608 | /* Populate rbd image metadata */ | 4596 | /* Populate rbd image metadata */ |
4609 | 4597 | ||
@@ -4632,22 +4620,9 @@ out_err: | |||
4632 | 4620 | ||
4633 | static int rbd_dev_v2_probe(struct rbd_device *rbd_dev) | 4621 | static int rbd_dev_v2_probe(struct rbd_device *rbd_dev) |
4634 | { | 4622 | { |
4635 | size_t size; | ||
4636 | int ret; | 4623 | int ret; |
4637 | u64 ver = 0; | 4624 | u64 ver = 0; |
4638 | 4625 | ||
4639 | /* | ||
4640 | * Image id was filled in by the caller. Record the header | ||
4641 | * object name for this rbd image. | ||
4642 | */ | ||
4643 | size = sizeof (RBD_HEADER_PREFIX) + strlen(rbd_dev->spec->image_id); | ||
4644 | rbd_dev->header_name = kmalloc(size, GFP_KERNEL); | ||
4645 | if (!rbd_dev->header_name) | ||
4646 | return -ENOMEM; | ||
4647 | sprintf(rbd_dev->header_name, "%s%s", | ||
4648 | RBD_HEADER_PREFIX, rbd_dev->spec->image_id); | ||
4649 | |||
4650 | /* Get the size and object order for the image */ | ||
4651 | ret = rbd_dev_v2_image_size(rbd_dev); | 4626 | ret = rbd_dev_v2_image_size(rbd_dev); |
4652 | if (ret) | 4627 | if (ret) |
4653 | goto out_err; | 4628 | goto out_err; |
@@ -4810,6 +4785,33 @@ err_out_id: | |||
4810 | return ret; | 4785 | return ret; |
4811 | } | 4786 | } |
4812 | 4787 | ||
4788 | static int rbd_dev_header_name(struct rbd_device *rbd_dev) | ||
4789 | { | ||
4790 | struct rbd_spec *spec = rbd_dev->spec; | ||
4791 | size_t size; | ||
4792 | |||
4793 | /* Record the header object name for this rbd image. */ | ||
4794 | |||
4795 | rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); | ||
4796 | |||
4797 | if (rbd_dev->image_format == 1) | ||
4798 | size = strlen(spec->image_name) + sizeof (RBD_SUFFIX); | ||
4799 | else | ||
4800 | size = sizeof (RBD_HEADER_PREFIX) + strlen(spec->image_id); | ||
4801 | |||
4802 | rbd_dev->header_name = kmalloc(size, GFP_KERNEL); | ||
4803 | if (!rbd_dev->header_name) | ||
4804 | return -ENOMEM; | ||
4805 | |||
4806 | if (rbd_dev->image_format == 1) | ||
4807 | sprintf(rbd_dev->header_name, "%s%s", | ||
4808 | spec->image_name, RBD_SUFFIX); | ||
4809 | else | ||
4810 | sprintf(rbd_dev->header_name, "%s%s", | ||
4811 | RBD_HEADER_PREFIX, spec->image_id); | ||
4812 | return 0; | ||
4813 | } | ||
4814 | |||
4813 | /* | 4815 | /* |
4814 | * Probe for the existence of the header object for the given rbd | 4816 | * Probe for the existence of the header object for the given rbd |
4815 | * device. For format 2 images this includes determining the image | 4817 | * device. For format 2 images this includes determining the image |
@@ -4830,16 +4832,20 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev) | |||
4830 | rbd_assert(rbd_dev->spec->image_id); | 4832 | rbd_assert(rbd_dev->spec->image_id); |
4831 | rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); | 4833 | rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); |
4832 | 4834 | ||
4835 | ret = rbd_dev_header_name(rbd_dev); | ||
4836 | if (ret) | ||
4837 | goto err_out_format; | ||
4838 | |||
4833 | if (rbd_dev->image_format == 1) | 4839 | if (rbd_dev->image_format == 1) |
4834 | ret = rbd_dev_v1_probe(rbd_dev); | 4840 | ret = rbd_dev_v1_probe(rbd_dev); |
4835 | else | 4841 | else |
4836 | ret = rbd_dev_v2_probe(rbd_dev); | 4842 | ret = rbd_dev_v2_probe(rbd_dev); |
4837 | if (ret) | 4843 | if (ret) |
4838 | goto out_err; | 4844 | goto out_header_name; |
4839 | 4845 | ||
4840 | ret = rbd_dev_snaps_update(rbd_dev); | 4846 | ret = rbd_dev_snaps_update(rbd_dev); |
4841 | if (ret) | 4847 | if (ret) |
4842 | goto out_err; | 4848 | goto out_header_name; |
4843 | 4849 | ||
4844 | ret = rbd_dev_spec_update(rbd_dev); | 4850 | ret = rbd_dev_spec_update(rbd_dev); |
4845 | if (ret) | 4851 | if (ret) |
@@ -4859,7 +4865,11 @@ err_out_parent: | |||
4859 | rbd_header_free(&rbd_dev->header); | 4865 | rbd_header_free(&rbd_dev->header); |
4860 | err_out_snaps: | 4866 | err_out_snaps: |
4861 | rbd_remove_all_snaps(rbd_dev); | 4867 | rbd_remove_all_snaps(rbd_dev); |
4862 | out_err: | 4868 | out_header_name: |
4869 | kfree(rbd_dev->header_name); | ||
4870 | rbd_dev->header_name = NULL; | ||
4871 | err_out_format: | ||
4872 | rbd_dev->image_format = 0; | ||
4863 | kfree(rbd_dev->spec->image_id); | 4873 | kfree(rbd_dev->spec->image_id); |
4864 | rbd_dev->spec->image_id = NULL; | 4874 | rbd_dev->spec->image_id = NULL; |
4865 | 4875 | ||