diff options
author | Alex Elder <elder@inktank.com> | 2013-04-29 00:32:34 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:20:03 -0400 |
commit | 200a6a8be5dba96df121f3d2363964dd77ee7e1b (patch) | |
tree | 0d09fb591b8a54cb67d3c11544d6e36337667b74 /drivers/block/rbd.c | |
parent | 79ab7558aac7622109e9d9b089cac2c5f06aca20 (diff) |
rbd: don't destroy rbd_dev in device release function
Rename rbd_dev_probe_finish() to be rbd_dev_device_setup(). Its
purpose is to set up the Linux side of an rbd device mapping.
Rename rbd_dev_release() to be rbd_dev_device_release(), making
it more obvious it serves as the inverse of the setup function
(or it will).
Encapsulate some of what was done in rbd_dev_release() into a new
function rbd_dev_image_release(), which serves as the inverse of
setting up the ceph side of the mapped rbd image.
Define a new helper rbd_dev_clear_mapping() to simply zero out the
fields of a mapping structure--the inverse of rbd_dev_set_mapping().
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 | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 59048191ab17..feaa2e9192a1 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -358,7 +358,7 @@ static int rbd_img_request_submit(struct rbd_img_request *img_request); | |||
358 | 358 | ||
359 | static int rbd_dev_snaps_update(struct rbd_device *rbd_dev); | 359 | static int rbd_dev_snaps_update(struct rbd_device *rbd_dev); |
360 | 360 | ||
361 | static void rbd_dev_release(struct device *dev); | 361 | static void rbd_dev_device_release(struct device *dev); |
362 | static void rbd_snap_destroy(struct rbd_snap *snap); | 362 | static void rbd_snap_destroy(struct rbd_snap *snap); |
363 | 363 | ||
364 | static ssize_t rbd_add(struct bus_type *bus, const char *buf, | 364 | static ssize_t rbd_add(struct bus_type *bus, const char *buf, |
@@ -893,6 +893,13 @@ static void rbd_dev_mapping_clear(struct rbd_device *rbd_dev) | |||
893 | rbd_dev->mapping.read_only = true; | 893 | rbd_dev->mapping.read_only = true; |
894 | } | 894 | } |
895 | 895 | ||
896 | static void rbd_dev_clear_mapping(struct rbd_device *rbd_dev) | ||
897 | { | ||
898 | rbd_dev->mapping.size = 0; | ||
899 | rbd_dev->mapping.features = 0; | ||
900 | rbd_dev->mapping.read_only = true; | ||
901 | } | ||
902 | |||
896 | static void rbd_header_free(struct rbd_image_header *header) | 903 | static void rbd_header_free(struct rbd_image_header *header) |
897 | { | 904 | { |
898 | kfree(header->object_prefix); | 905 | kfree(header->object_prefix); |
@@ -4182,7 +4189,7 @@ static int rbd_bus_add_dev(struct rbd_device *rbd_dev) | |||
4182 | dev->bus = &rbd_bus_type; | 4189 | dev->bus = &rbd_bus_type; |
4183 | dev->type = &rbd_device_type; | 4190 | dev->type = &rbd_device_type; |
4184 | dev->parent = &rbd_root_dev; | 4191 | dev->parent = &rbd_root_dev; |
4185 | dev->release = rbd_dev_release; | 4192 | dev->release = rbd_dev_device_release; |
4186 | dev_set_name(dev, "%d", rbd_dev->dev_id); | 4193 | dev_set_name(dev, "%d", rbd_dev->dev_id); |
4187 | ret = device_register(dev); | 4194 | ret = device_register(dev); |
4188 | 4195 | ||
@@ -4718,7 +4725,7 @@ out_err: | |||
4718 | return ret; | 4725 | return ret; |
4719 | } | 4726 | } |
4720 | 4727 | ||
4721 | static int rbd_dev_probe_finish(struct rbd_device *rbd_dev) | 4728 | static int rbd_dev_device_setup(struct rbd_device *rbd_dev) |
4722 | { | 4729 | { |
4723 | int ret; | 4730 | int ret; |
4724 | 4731 | ||
@@ -4800,6 +4807,15 @@ static int rbd_dev_header_name(struct rbd_device *rbd_dev) | |||
4800 | return 0; | 4807 | return 0; |
4801 | } | 4808 | } |
4802 | 4809 | ||
4810 | static void rbd_dev_image_release(struct rbd_device *rbd_dev) | ||
4811 | { | ||
4812 | rbd_header_free(&rbd_dev->header); | ||
4813 | rbd_assert(rbd_dev->rbd_client != NULL); | ||
4814 | rbd_spec_put(rbd_dev->parent_spec); | ||
4815 | kfree(rbd_dev->header_name); | ||
4816 | rbd_dev_destroy(rbd_dev); | ||
4817 | } | ||
4818 | |||
4803 | /* | 4819 | /* |
4804 | * Probe for the existence of the header object for the given rbd | 4820 | * Probe for the existence of the header object for the given rbd |
4805 | * device. For format 2 images this includes determining the image | 4821 | * device. For format 2 images this includes determining the image |
@@ -4848,7 +4864,7 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev) | |||
4848 | if (ret) | 4864 | if (ret) |
4849 | goto err_out_snaps; | 4865 | goto err_out_snaps; |
4850 | 4866 | ||
4851 | ret = rbd_dev_probe_finish(rbd_dev); | 4867 | ret = rbd_dev_device_setup(rbd_dev); |
4852 | if (ret) | 4868 | if (ret) |
4853 | goto err_out_parent; | 4869 | goto err_out_parent; |
4854 | 4870 | ||
@@ -4968,24 +4984,19 @@ static struct rbd_device *__rbd_get_dev(unsigned long dev_id) | |||
4968 | return NULL; | 4984 | return NULL; |
4969 | } | 4985 | } |
4970 | 4986 | ||
4971 | static void rbd_dev_release(struct device *dev) | 4987 | static void rbd_dev_device_release(struct device *dev) |
4972 | { | 4988 | { |
4973 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); | 4989 | struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); |
4974 | 4990 | ||
4975 | /* clean up and free blkdev */ | ||
4976 | rbd_free_disk(rbd_dev); | 4991 | rbd_free_disk(rbd_dev); |
4992 | clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); | ||
4993 | rbd_dev_clear_mapping(rbd_dev); | ||
4977 | unregister_blkdev(rbd_dev->major, rbd_dev->name); | 4994 | unregister_blkdev(rbd_dev->major, rbd_dev->name); |
4978 | 4995 | rbd_dev->major = 0; | |
4979 | /* release allocated disk header fields */ | ||
4980 | rbd_header_free(&rbd_dev->header); | ||
4981 | |||
4982 | /* done with the id, and with the rbd_dev */ | ||
4983 | rbd_dev_id_put(rbd_dev); | 4996 | rbd_dev_id_put(rbd_dev); |
4984 | rbd_dev_mapping_clear(rbd_dev); | 4997 | rbd_dev_mapping_clear(rbd_dev); |
4985 | rbd_assert(rbd_dev->rbd_client != NULL); | 4998 | |
4986 | rbd_spec_put(rbd_dev->parent_spec); | 4999 | rbd_dev_image_release(rbd_dev); |
4987 | kfree(rbd_dev->header_name); | ||
4988 | rbd_dev_destroy(rbd_dev); | ||
4989 | } | 5000 | } |
4990 | 5001 | ||
4991 | static void rbd_dev_remove_parent(struct rbd_device *rbd_dev) | 5002 | static void rbd_dev_remove_parent(struct rbd_device *rbd_dev) |