All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] rbd: only set up Linux files for mapped devices
@ 2013-04-29 17:59 Alex Elder
  2013-04-29 18:00 ` [PATCH 1/5] rbd: drop module later Alex Elder
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Alex Elder @ 2013-04-29 17:59 UTC (permalink / raw)
  To: ceph-devel

This series does a few more things to separate the
ceph and Linux side of rbd device initialization,
and to make sure things get cleaned up in a sane
way when errors occur.  The last patch makes it so
only the rbd image getting mapped has Linux device
and sysfs stuff associated with them.  The parent
rbd devices for layered images never needed this
stuff, and things have now been rearranged such
that we can do away with that.

These patches are available in the ceph-client git
repository in the branch "review/wip-rbd-cleanup-5".

					-Alex
[PATCH 1/5] rbd: drop module later
[PATCH 2/5] rbd: don't destroy rbd_dev in device release function
[PATCH 3/5] rbd: define rbd_dev_unprobe()
[PATCH 4/5] rbd: don't have device release destroy rbd_dev
[PATCH 5/5] rbd: set up devices only for mapped images

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/5] rbd: drop module later
  2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
@ 2013-04-29 18:00 ` Alex Elder
  2013-04-29 18:00 ` [PATCH 2/5] rbd: don't destroy rbd_dev in device release function Alex Elder
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Alex Elder @ 2013-04-29 18:00 UTC (permalink / raw)
  To: ceph-devel

Drop the module reference at the end of rbd_remove() for symmetry
with adding a reference at the top of rbd_add().

Signed-off-by: Alex Elder <elder@inktank.com>
---
 drivers/block/rbd.c |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index ac94aa4..5904819 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4986,9 +4986,6 @@ static void rbd_dev_release(struct device *dev)
 	rbd_spec_put(rbd_dev->parent_spec);
 	kfree(rbd_dev->header_name);
 	rbd_dev_destroy(rbd_dev);
-
-	/* release module ref */
-	module_put(THIS_MODULE);
 }

 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)
@@ -5071,6 +5068,7 @@ static ssize_t rbd_remove(struct bus_type *bus,

 	rbd_remove_all_snaps(rbd_dev);
 	rbd_bus_del_dev(rbd_dev);
+	module_put(THIS_MODULE);
 done:
 	mutex_unlock(&ctl_mutex);

-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/5] rbd: don't destroy rbd_dev in device release function
  2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
  2013-04-29 18:00 ` [PATCH 1/5] rbd: drop module later Alex Elder
@ 2013-04-29 18:00 ` Alex Elder
  2013-04-29 18:00 ` [PATCH 3/5] rbd: define rbd_dev_unprobe() Alex Elder
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Alex Elder @ 2013-04-29 18:00 UTC (permalink / raw)
  To: ceph-devel

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>
---
 drivers/block/rbd.c |   41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 5904819..feaa2e9 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);

 static int rbd_dev_snaps_update(struct rbd_device *rbd_dev);

-static void rbd_dev_release(struct device *dev);
+static void rbd_dev_device_release(struct device *dev);
 static void rbd_snap_destroy(struct rbd_snap *snap);

 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)
 	rbd_dev->mapping.read_only = true;
 }

+static void rbd_dev_clear_mapping(struct rbd_device *rbd_dev)
+{
+	rbd_dev->mapping.size = 0;
+	rbd_dev->mapping.features = 0;
+	rbd_dev->mapping.read_only = true;
+}
+
 static void rbd_header_free(struct rbd_image_header *header)
 {
 	kfree(header->object_prefix);
@@ -4182,7 +4189,7 @@ static int rbd_bus_add_dev(struct rbd_device *rbd_dev)
 	dev->bus = &rbd_bus_type;
 	dev->type = &rbd_device_type;
 	dev->parent = &rbd_root_dev;
-	dev->release = rbd_dev_release;
+	dev->release = rbd_dev_device_release;
 	dev_set_name(dev, "%d", rbd_dev->dev_id);
 	ret = device_register(dev);

@@ -4718,7 +4725,7 @@ out_err:
 	return ret;
 }

-static int rbd_dev_probe_finish(struct rbd_device *rbd_dev)
+static int rbd_dev_device_setup(struct rbd_device *rbd_dev)
 {
 	int ret;

@@ -4800,6 +4807,15 @@ static int rbd_dev_header_name(struct rbd_device
*rbd_dev)
 	return 0;
 }

+static void rbd_dev_image_release(struct rbd_device *rbd_dev)
+{
+	rbd_header_free(&rbd_dev->header);
+	rbd_assert(rbd_dev->rbd_client != NULL);
+	rbd_spec_put(rbd_dev->parent_spec);
+	kfree(rbd_dev->header_name);
+	rbd_dev_destroy(rbd_dev);
+}
+
 /*
  * Probe for the existence of the header object for the given rbd
  * 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)
 	if (ret)
 		goto err_out_snaps;

-	ret = rbd_dev_probe_finish(rbd_dev);
+	ret = rbd_dev_device_setup(rbd_dev);
 	if (ret)
 		goto err_out_parent;

@@ -4968,24 +4984,19 @@ static struct rbd_device *__rbd_get_dev(unsigned
long dev_id)
 	return NULL;
 }

-static void rbd_dev_release(struct device *dev)
+static void rbd_dev_device_release(struct device *dev)
 {
 	struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);

-	/* clean up and free blkdev */
 	rbd_free_disk(rbd_dev);
+	clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags);
+	rbd_dev_clear_mapping(rbd_dev);
 	unregister_blkdev(rbd_dev->major, rbd_dev->name);
-
-	/* release allocated disk header fields */
-	rbd_header_free(&rbd_dev->header);
-
-	/* done with the id, and with the rbd_dev */
+	rbd_dev->major = 0;
 	rbd_dev_id_put(rbd_dev);
 	rbd_dev_mapping_clear(rbd_dev);
-	rbd_assert(rbd_dev->rbd_client != NULL);
-	rbd_spec_put(rbd_dev->parent_spec);
-	kfree(rbd_dev->header_name);
-	rbd_dev_destroy(rbd_dev);
+
+	rbd_dev_image_release(rbd_dev);
 }

 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/5] rbd: define rbd_dev_unprobe()
  2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
  2013-04-29 18:00 ` [PATCH 1/5] rbd: drop module later Alex Elder
  2013-04-29 18:00 ` [PATCH 2/5] rbd: don't destroy rbd_dev in device release function Alex Elder
@ 2013-04-29 18:00 ` Alex Elder
  2013-05-01  1:11   ` Josh Durgin
  2013-04-29 18:00 ` [PATCH 4/5] rbd: don't have device release destroy rbd_dev Alex Elder
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 9+ messages in thread
From: Alex Elder @ 2013-04-29 18:00 UTC (permalink / raw)
  To: ceph-devel

Define a new function rbd_dev_unprobe() which undoes state changes
that occur from calling rbd_dev_v1_probe() or rbd_dev_v2_probe().
Note that this is a superset of rbd_header_free(), which is now
getting removed (it seems to have been used improperly anyway).

Flesh out rbd_dev_image_release() so it undoes exactly what
rbd_dev_image_probe() does.

This means that:
    - rbd_dev_device_release() gets called when the last device
      reference gets dropped;
    - that undoes everything done by the rbd_dev_device_setup() call
      at the end of rbd_dev_image_probe() (and nothing more), ending
      by calling rbd_dev_image_release(); and
    - rbd_dev_image_release() undoes everything else done by
      rbd_dev_image_probe() (and this includes a call to
      rbd_dev_unprobe().

This means the image and device portions of an rbd device are fairly
cleanly separated now, so error paths should be a little easier to
verify than they used to be.

Signed-off-by: Alex Elder <elder@inktank.com>
---
 drivers/block/rbd.c |   78
+++++++++++++++++++++++++--------------------------
 1 file changed, 39 insertions(+), 39 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index feaa2e9..595d7b3 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -900,18 +900,6 @@ static void rbd_dev_clear_mapping(struct rbd_device
*rbd_dev)
 	rbd_dev->mapping.read_only = true;
 }

-static void rbd_header_free(struct rbd_image_header *header)
-{
-	kfree(header->object_prefix);
-	header->object_prefix = NULL;
-	kfree(header->snap_sizes);
-	header->snap_sizes = NULL;
-	kfree(header->snap_names);
-	header->snap_names = NULL;
-	rbd_snap_context_put(header->snapc);
-	header->snapc = NULL;
-}
-
 static const char *rbd_segment_name(struct rbd_device *rbd_dev, u64 offset)
 {
 	char *name;
@@ -4588,6 +4576,27 @@ out:
 	return ret;
 }

+/* Undo whatever state changes are made by v1 or v2 image probe */
+
+static void rbd_dev_unprobe(struct rbd_device *rbd_dev)
+{
+	struct rbd_image_header	*header;
+
+	rbd_dev_remove_parent(rbd_dev);
+	rbd_spec_put(rbd_dev->parent_spec);
+	rbd_dev->parent_spec = NULL;
+	rbd_dev->parent_overlap = 0;
+
+	/* Free dynamic fields from the header, then zero it out */
+
+	header = &rbd_dev->header;
+	rbd_snap_context_put(header->snapc);
+	kfree(header->snap_sizes);
+	kfree(header->snap_names);
+	kfree(header->object_prefix);
+	memset(header, 0, sizeof (*header));
+}
+
 static int rbd_dev_v1_probe(struct rbd_device *rbd_dev)
 {
 	int ret;
@@ -4809,10 +4818,20 @@ static int rbd_dev_header_name(struct rbd_device
*rbd_dev)

 static void rbd_dev_image_release(struct rbd_device *rbd_dev)
 {
-	rbd_header_free(&rbd_dev->header);
-	rbd_assert(rbd_dev->rbd_client != NULL);
-	rbd_spec_put(rbd_dev->parent_spec);
+	int ret;
+
+	rbd_dev_remove_parent(rbd_dev);
+	rbd_remove_all_snaps(rbd_dev);
+	rbd_dev_unprobe(rbd_dev);
+	ret = rbd_dev_header_watch_sync(rbd_dev, 0);
+	if (ret)
+		rbd_warn(rbd_dev, "failed to cancel watch event (%d)\n", ret);
 	kfree(rbd_dev->header_name);
+	rbd_dev->header_name = NULL;
+	rbd_dev->image_format = 0;
+	kfree(rbd_dev->spec->image_id);
+	rbd_dev->spec->image_id = NULL;
+
 	rbd_dev_destroy(rbd_dev);
 }

@@ -4854,7 +4873,7 @@ static int rbd_dev_image_probe(struct rbd_device
*rbd_dev)

 	ret = rbd_dev_snaps_update(rbd_dev);
 	if (ret)
-		goto err_out_watch;
+		goto err_out_probe;

 	ret = rbd_dev_spec_update(rbd_dev);
 	if (ret)
@@ -4865,15 +4884,14 @@ static int rbd_dev_image_probe(struct rbd_device
*rbd_dev)
 		goto err_out_snaps;

 	ret = rbd_dev_device_setup(rbd_dev);
-	if (ret)
-		goto err_out_parent;
+	if (!ret)
+		return 0;

-	return ret;
-err_out_parent:
 	rbd_dev_remove_parent(rbd_dev);
-	rbd_header_free(&rbd_dev->header);
 err_out_snaps:
 	rbd_remove_all_snaps(rbd_dev);
+err_out_probe:
+	rbd_dev_unprobe(rbd_dev);
 err_out_watch:
 	tmp = rbd_dev_header_watch_sync(rbd_dev, 0);
 	if (tmp)
@@ -5005,7 +5023,6 @@ static void rbd_dev_remove_parent(struct
rbd_device *rbd_dev)
 		struct rbd_device *first = rbd_dev;
 		struct rbd_device *second = first->parent;
 		struct rbd_device *third;
-		int ret;

 		/*
 		 * Follow to the parent with no grandparent and
@@ -5016,11 +5033,6 @@ static void rbd_dev_remove_parent(struct
rbd_device *rbd_dev)
 			second = third;
 		}
 		rbd_assert(second);
-		ret = rbd_dev_header_watch_sync(rbd_dev, 0);
-		if (ret)
-			rbd_warn(rbd_dev,
-				"failed to cancel watch event (%d)\n", ret);
-		rbd_remove_all_snaps(second);
 		rbd_bus_del_dev(second);
 		first->parent = NULL;
 		first->parent_overlap = 0;
@@ -5065,19 +5077,7 @@ static ssize_t rbd_remove(struct bus_type *bus,
 	spin_unlock_irq(&rbd_dev->lock);
 	if (ret < 0)
 		goto done;
-
-	ret = rbd_dev_header_watch_sync(rbd_dev, 0);
-	if (ret) {
-		rbd_warn(rbd_dev, "failed to cancel watch event (%d)\n", ret);
-		clear_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags);
-		smp_mb();
-		return ret;
-	}
 	ret = count;
-
-	rbd_dev_remove_parent(rbd_dev);
-
-	rbd_remove_all_snaps(rbd_dev);
 	rbd_bus_del_dev(rbd_dev);
 	module_put(THIS_MODULE);
 done:
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/5] rbd: don't have device release destroy rbd_dev
  2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
                   ` (2 preceding siblings ...)
  2013-04-29 18:00 ` [PATCH 3/5] rbd: define rbd_dev_unprobe() Alex Elder
@ 2013-04-29 18:00 ` Alex Elder
  2013-04-29 18:01 ` [PATCH 5/5] rbd: set up devices only for mapped images Alex Elder
  2013-05-01  1:15 ` [PATCH 0/5] rbd: only set up Linux files for mapped devices Josh Durgin
  5 siblings, 0 replies; 9+ messages in thread
From: Alex Elder @ 2013-04-29 18:00 UTC (permalink / raw)
  To: ceph-devel

Currently an rbd_device structure gets destroyed from the release
routine for the device embedded within it.  Stop doing that, instead
calling rbd_dev_image_release() right after rbd_bus_del_dev()
wherever the latter is called.

Signed-off-by: Alex Elder <elder@inktank.com>
---
 drivers/block/rbd.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 595d7b3..ff850e9 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -5013,8 +5013,6 @@ static void rbd_dev_device_release(struct device *dev)
 	rbd_dev->major = 0;
 	rbd_dev_id_put(rbd_dev);
 	rbd_dev_mapping_clear(rbd_dev);
-
-	rbd_dev_image_release(rbd_dev);
 }

 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)
@@ -5034,6 +5032,7 @@ static void rbd_dev_remove_parent(struct
rbd_device *rbd_dev)
 		}
 		rbd_assert(second);
 		rbd_bus_del_dev(second);
+		rbd_dev_image_release(second);
 		first->parent = NULL;
 		first->parent_overlap = 0;

@@ -5079,6 +5078,7 @@ static ssize_t rbd_remove(struct bus_type *bus,
 		goto done;
 	ret = count;
 	rbd_bus_del_dev(rbd_dev);
+	rbd_dev_image_release(rbd_dev);
 	module_put(THIS_MODULE);
 done:
 	mutex_unlock(&ctl_mutex);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 5/5] rbd: set up devices only for mapped images
  2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
                   ` (3 preceding siblings ...)
  2013-04-29 18:00 ` [PATCH 4/5] rbd: don't have device release destroy rbd_dev Alex Elder
@ 2013-04-29 18:01 ` Alex Elder
  2013-05-01  1:15 ` [PATCH 0/5] rbd: only set up Linux files for mapped devices Josh Durgin
  5 siblings, 0 replies; 9+ messages in thread
From: Alex Elder @ 2013-04-29 18:01 UTC (permalink / raw)
  To: ceph-devel

Stop setting up Linux devices during the image probe operation.
Instead, set up the devices as a separate step after the image
probe, in rbd_add().

A consequence of this is that only mapped images get devices
assigned to them, which is pretty sweet.

This resolves:
    http://tracker.ceph.com/issues/4774

Signed-off-by: Alex Elder <elder@inktank.com>
---
 drivers/block/rbd.c |   13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index ff850e9..8b680ad 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -4880,14 +4880,9 @@ static int rbd_dev_image_probe(struct rbd_device
*rbd_dev)
 		goto err_out_snaps;

 	ret = rbd_dev_probe_parent(rbd_dev);
-	if (ret)
-		goto err_out_snaps;
-
-	ret = rbd_dev_device_setup(rbd_dev);
 	if (!ret)
 		return 0;

-	rbd_dev_remove_parent(rbd_dev);
 err_out_snaps:
 	rbd_remove_all_snaps(rbd_dev);
 err_out_probe:
@@ -4966,9 +4961,12 @@ static ssize_t rbd_add(struct bus_type *bus,
 	if (rc < 0)
 		goto err_out_rbd_dev;

-	return count;
+	rc = rbd_dev_device_setup(rbd_dev);
+	if (!rc)
+		return count;
+
+	rbd_dev_image_release(rbd_dev);
 err_out_rbd_dev:
-	kfree(rbd_dev->header_name);
 	rbd_dev_destroy(rbd_dev);
 err_out_client:
 	rbd_put_client(rbdc);
@@ -5031,7 +5029,6 @@ static void rbd_dev_remove_parent(struct
rbd_device *rbd_dev)
 			second = third;
 		}
 		rbd_assert(second);
-		rbd_bus_del_dev(second);
 		rbd_dev_image_release(second);
 		first->parent = NULL;
 		first->parent_overlap = 0;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/5] rbd: define rbd_dev_unprobe()
  2013-04-29 18:00 ` [PATCH 3/5] rbd: define rbd_dev_unprobe() Alex Elder
@ 2013-05-01  1:11   ` Josh Durgin
  2013-05-01  4:57     ` Alex Elder
  0 siblings, 1 reply; 9+ messages in thread
From: Josh Durgin @ 2013-05-01  1:11 UTC (permalink / raw)
  To: Alex Elder; +Cc: ceph-devel

There are a couple calls that look unnecessary noted below.
Other than that:

Reviewed-by: Josh Durgin <josh.durgin@inktank.com>

On 04/29/2013 11:00 AM, Alex Elder wrote:
> Define a new function rbd_dev_unprobe() which undoes state changes
> that occur from calling rbd_dev_v1_probe() or rbd_dev_v2_probe().
> Note that this is a superset of rbd_header_free(), which is now
> getting removed (it seems to have been used improperly anyway).
>
> Flesh out rbd_dev_image_release() so it undoes exactly what
> rbd_dev_image_probe() does.
>
> This means that:
>      - rbd_dev_device_release() gets called when the last device
>        reference gets dropped;
>      - that undoes everything done by the rbd_dev_device_setup() call
>        at the end of rbd_dev_image_probe() (and nothing more), ending
>        by calling rbd_dev_image_release(); and
>      - rbd_dev_image_release() undoes everything else done by
>        rbd_dev_image_probe() (and this includes a call to
>        rbd_dev_unprobe().
>
> This means the image and device portions of an rbd device are fairly
> cleanly separated now, so error paths should be a little easier to
> verify than they used to be.
>
> Signed-off-by: Alex Elder <elder@inktank.com>
> ---
>   drivers/block/rbd.c |   78
> +++++++++++++++++++++++++--------------------------
>   1 file changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index feaa2e9..595d7b3 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -900,18 +900,6 @@ static void rbd_dev_clear_mapping(struct rbd_device
> *rbd_dev)
>   	rbd_dev->mapping.read_only = true;
>   }
>
> -static void rbd_header_free(struct rbd_image_header *header)
> -{
> -	kfree(header->object_prefix);
> -	header->object_prefix = NULL;
> -	kfree(header->snap_sizes);
> -	header->snap_sizes = NULL;
> -	kfree(header->snap_names);
> -	header->snap_names = NULL;
> -	rbd_snap_context_put(header->snapc);
> -	header->snapc = NULL;
> -}
> -
>   static const char *rbd_segment_name(struct rbd_device *rbd_dev, u64 offset)
>   {
>   	char *name;
> @@ -4588,6 +4576,27 @@ out:
>   	return ret;
>   }
>
> +/* Undo whatever state changes are made by v1 or v2 image probe */
> +
> +static void rbd_dev_unprobe(struct rbd_device *rbd_dev)
> +{
> +	struct rbd_image_header	*header;
> +
> +	rbd_dev_remove_parent(rbd_dev);
> +	rbd_spec_put(rbd_dev->parent_spec);
> +	rbd_dev->parent_spec = NULL;
> +	rbd_dev->parent_overlap = 0;
> +
> +	/* Free dynamic fields from the header, then zero it out */
> +
> +	header = &rbd_dev->header;
> +	rbd_snap_context_put(header->snapc);
> +	kfree(header->snap_sizes);
> +	kfree(header->snap_names);
> +	kfree(header->object_prefix);
> +	memset(header, 0, sizeof (*header));
> +}
> +
>   static int rbd_dev_v1_probe(struct rbd_device *rbd_dev)
>   {
>   	int ret;
> @@ -4809,10 +4818,20 @@ static int rbd_dev_header_name(struct rbd_device
> *rbd_dev)
>
>   static void rbd_dev_image_release(struct rbd_device *rbd_dev)
>   {
> -	rbd_header_free(&rbd_dev->header);
> -	rbd_assert(rbd_dev->rbd_client != NULL);
> -	rbd_spec_put(rbd_dev->parent_spec);
> +	int ret;
> +
> +	rbd_dev_remove_parent(rbd_dev);

This was just moved to rbd_dev_unprobe(), which is called in two lines.
It seems like this call should go away, since rbd_dev_unprobe() is also
used in an error path.

> +	rbd_remove_all_snaps(rbd_dev);
> +	rbd_dev_unprobe(rbd_dev);
> +	ret = rbd_dev_header_watch_sync(rbd_dev, 0);
> +	if (ret)
> +		rbd_warn(rbd_dev, "failed to cancel watch event (%d)\n", ret);
>   	kfree(rbd_dev->header_name);
> +	rbd_dev->header_name = NULL;
> +	rbd_dev->image_format = 0;
> +	kfree(rbd_dev->spec->image_id);
> +	rbd_dev->spec->image_id = NULL;
> +
>   	rbd_dev_destroy(rbd_dev);
>   }
>
> @@ -4854,7 +4873,7 @@ static int rbd_dev_image_probe(struct rbd_device
> *rbd_dev)
>
>   	ret = rbd_dev_snaps_update(rbd_dev);
>   	if (ret)
> -		goto err_out_watch;
> +		goto err_out_probe;
>
>   	ret = rbd_dev_spec_update(rbd_dev);
>   	if (ret)
> @@ -4865,15 +4884,14 @@ static int rbd_dev_image_probe(struct rbd_device
> *rbd_dev)
>   		goto err_out_snaps;
>
>   	ret = rbd_dev_device_setup(rbd_dev);
> -	if (ret)
> -		goto err_out_parent;
> +	if (!ret)
> +		return 0;
>
> -	return ret;
> -err_out_parent:
>   	rbd_dev_remove_parent(rbd_dev);

This call is removed in the next patch, but should probably be removed
here, since rbd_dev_unprobe() calls it now.

> -	rbd_header_free(&rbd_dev->header);
>   err_out_snaps:
>   	rbd_remove_all_snaps(rbd_dev);
> +err_out_probe:
> +	rbd_dev_unprobe(rbd_dev);
>   err_out_watch:
>   	tmp = rbd_dev_header_watch_sync(rbd_dev, 0);
>   	if (tmp)
> @@ -5005,7 +5023,6 @@ static void rbd_dev_remove_parent(struct
> rbd_device *rbd_dev)
>   		struct rbd_device *first = rbd_dev;
>   		struct rbd_device *second = first->parent;
>   		struct rbd_device *third;
> -		int ret;
>
>   		/*
>   		 * Follow to the parent with no grandparent and
> @@ -5016,11 +5033,6 @@ static void rbd_dev_remove_parent(struct
> rbd_device *rbd_dev)
>   			second = third;
>   		}
>   		rbd_assert(second);
> -		ret = rbd_dev_header_watch_sync(rbd_dev, 0);
> -		if (ret)
> -			rbd_warn(rbd_dev,
> -				"failed to cancel watch event (%d)\n", ret);
> -		rbd_remove_all_snaps(second);
>   		rbd_bus_del_dev(second);
>   		first->parent = NULL;
>   		first->parent_overlap = 0;
> @@ -5065,19 +5077,7 @@ static ssize_t rbd_remove(struct bus_type *bus,
>   	spin_unlock_irq(&rbd_dev->lock);
>   	if (ret < 0)
>   		goto done;
> -
> -	ret = rbd_dev_header_watch_sync(rbd_dev, 0);
> -	if (ret) {
> -		rbd_warn(rbd_dev, "failed to cancel watch event (%d)\n", ret);
> -		clear_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags);
> -		smp_mb();
> -		return ret;
> -	}
>   	ret = count;
> -
> -	rbd_dev_remove_parent(rbd_dev);
> -
> -	rbd_remove_all_snaps(rbd_dev);
>   	rbd_bus_del_dev(rbd_dev);
>   	module_put(THIS_MODULE);
>   done:
>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/5] rbd: only set up Linux files for mapped devices
  2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
                   ` (4 preceding siblings ...)
  2013-04-29 18:01 ` [PATCH 5/5] rbd: set up devices only for mapped images Alex Elder
@ 2013-05-01  1:15 ` Josh Durgin
  5 siblings, 0 replies; 9+ messages in thread
From: Josh Durgin @ 2013-05-01  1:15 UTC (permalink / raw)
  To: Alex Elder; +Cc: ceph-devel

On 04/29/2013 10:59 AM, Alex Elder wrote:
> This series does a few more things to separate the
> ceph and Linux side of rbd device initialization,
> and to make sure things get cleaned up in a sane
> way when errors occur.  The last patch makes it so
> only the rbd image getting mapped has Linux device
> and sysfs stuff associated with them.  The parent
> rbd devices for layered images never needed this
> stuff, and things have now been rearranged such
> that we can do away with that.
>
> These patches are available in the ceph-client git
> repository in the branch "review/wip-rbd-cleanup-5".
>
> 					-Alex
> [PATCH 1/5] rbd: drop module later
> [PATCH 2/5] rbd: don't destroy rbd_dev in device release function
> [PATCH 3/5] rbd: define rbd_dev_unprobe()
> [PATCH 4/5] rbd: don't have device release destroy rbd_dev
> [PATCH 5/5] rbd: set up devices only for mapped images

A couple notes on 3/5, otherwise looks good.

Reviewed-by: Josh Durgin <josh.durgin@inktank.com>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/5] rbd: define rbd_dev_unprobe()
  2013-05-01  1:11   ` Josh Durgin
@ 2013-05-01  4:57     ` Alex Elder
  0 siblings, 0 replies; 9+ messages in thread
From: Alex Elder @ 2013-05-01  4:57 UTC (permalink / raw)
  To: Josh Durgin; +Cc: ceph-devel

On 04/30/2013 08:11 PM, Josh Durgin wrote:
> There are a couple calls that look unnecessary noted below.

You were correct, in the two places that you mentioned,
rbd_parent_remove() should go away.  I'll do that before
I commit.

					-Alex

> Other than that:
> 
> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-05-01  4:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-29 17:59 [PATCH 0/5] rbd: only set up Linux files for mapped devices Alex Elder
2013-04-29 18:00 ` [PATCH 1/5] rbd: drop module later Alex Elder
2013-04-29 18:00 ` [PATCH 2/5] rbd: don't destroy rbd_dev in device release function Alex Elder
2013-04-29 18:00 ` [PATCH 3/5] rbd: define rbd_dev_unprobe() Alex Elder
2013-05-01  1:11   ` Josh Durgin
2013-05-01  4:57     ` Alex Elder
2013-04-29 18:00 ` [PATCH 4/5] rbd: don't have device release destroy rbd_dev Alex Elder
2013-04-29 18:01 ` [PATCH 5/5] rbd: set up devices only for mapped images Alex Elder
2013-05-01  1:15 ` [PATCH 0/5] rbd: only set up Linux files for mapped devices Josh Durgin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.