aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-29 00:32:34 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:20:03 -0400
commit200a6a8be5dba96df121f3d2363964dd77ee7e1b (patch)
tree0d09fb591b8a54cb67d3c11544d6e36337667b74 /drivers/block/rbd.c
parent79ab7558aac7622109e9d9b089cac2c5f06aca20 (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.c41
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
359static int rbd_dev_snaps_update(struct rbd_device *rbd_dev); 359static int rbd_dev_snaps_update(struct rbd_device *rbd_dev);
360 360
361static void rbd_dev_release(struct device *dev); 361static void rbd_dev_device_release(struct device *dev);
362static void rbd_snap_destroy(struct rbd_snap *snap); 362static void rbd_snap_destroy(struct rbd_snap *snap);
363 363
364static ssize_t rbd_add(struct bus_type *bus, const char *buf, 364static 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
896static 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
896static void rbd_header_free(struct rbd_image_header *header) 903static 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
4721static int rbd_dev_probe_finish(struct rbd_device *rbd_dev) 4728static 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
4810static 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
4971static void rbd_dev_release(struct device *dev) 4987static 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
4991static void rbd_dev_remove_parent(struct rbd_device *rbd_dev) 5002static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)