All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Durgin <josh.durgin@inktank.com>
To: Alex Elder <elder@inktank.com>
Cc: ceph-devel@vger.kernel.org
Subject: Re: [PATCH 3/4] rbd: define rbd_dev_{create,destroy}() helpers
Date: Wed, 31 Oct 2012 13:56:01 -0700	[thread overview]
Message-ID: <50919061.3000602@inktank.com> (raw)
In-Reply-To: <50904337.5090509@inktank.com>

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

On 10/30/2012 02:14 PM, Alex Elder wrote:
> Encapsulate the creation/initialization and destruction of rbd
> device structures.  The rbd_client and the rbd_spec structures
> provided on creation hold references whose ownership is transferred
> to the new rbd_device structure.
>
> Signed-off-by: Alex Elder <elder@inktank.com>
> ---
>   drivers/block/rbd.c |   62
> ++++++++++++++++++++++++++++++++++-----------------
>   1 file changed, 41 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 4771de2..a8ad8f8 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -504,7 +504,8 @@ static void rbd_client_release(struct kref *kref)
>    */
>   static void rbd_put_client(struct rbd_client *rbdc)
>   {
> -	kref_put(&rbdc->kref, rbd_client_release);
> +	if (rbdc)
> +		kref_put(&rbdc->kref, rbd_client_release);
>   }
>
>   /*
> @@ -2166,6 +2167,34 @@ static void rbd_spec_free(struct kref *kref)
>   	kfree(spec);
>   }
>
> +struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
> +				struct rbd_spec *spec)
> +{
> +	struct rbd_device *rbd_dev;
> +
> +	rbd_dev = kzalloc(sizeof (*rbd_dev), GFP_KERNEL);
> +	if (!rbd_dev)
> +		return NULL;
> +
> +	spin_lock_init(&rbd_dev->lock);
> +	INIT_LIST_HEAD(&rbd_dev->node);
> +	INIT_LIST_HEAD(&rbd_dev->snaps);
> +	init_rwsem(&rbd_dev->header_rwsem);
> +
> +	rbd_dev->spec = spec;
> +	rbd_dev->rbd_client = rbdc;
> +
> +	return rbd_dev;
> +}
> +
> +static void rbd_dev_destroy(struct rbd_device *rbd_dev)
> +{
> +	kfree(rbd_dev->header_name);
> +	rbd_put_client(rbd_dev->rbd_client);
> +	rbd_spec_put(rbd_dev->spec);
> +	kfree(rbd_dev);
> +}
> +
>   static bool rbd_snap_registered(struct rbd_snap *snap)
>   {
>   	bool ret = snap->dev.type == &rbd_snap_device_type;
> @@ -3242,7 +3271,7 @@ static ssize_t rbd_add(struct bus_type *bus,
>   		rc = PTR_ERR(rbdc);
>   		goto err_out_args;
>   	}
> -	ceph_opts = NULL;	/* ceph_opts now owned by rbd_dev client */
> +	ceph_opts = NULL;	/* rbd_dev client now owns this */
>
>   	/* pick the pool */
>   	osdc = &rbdc->client->osdc;
> @@ -3251,22 +3280,19 @@ static ssize_t rbd_add(struct bus_type *bus,
>   		goto err_out_client;
>   	spec->pool_id = (u64) rc;
>
> -	rbd_dev = kzalloc(sizeof (*rbd_dev), GFP_KERNEL);
> +	rbd_dev = rbd_dev_create(rbdc, spec);
>   	if (!rbd_dev)
>   		goto err_out_client;
> -
> -	spin_lock_init(&rbd_dev->lock);
> -	INIT_LIST_HEAD(&rbd_dev->node);
> -	INIT_LIST_HEAD(&rbd_dev->snaps);
> -	init_rwsem(&rbd_dev->header_rwsem);
> -	rbd_dev->rbd_client = rbdc;
> -	rbd_dev->spec = spec;
> +	rbdc = NULL;		/* rbd_dev now owns this */
> +	spec = NULL;		/* rbd_dev now owns this */
>
>   	rbd_dev->mapping.read_only = rbd_opts->read_only;
> +	kfree(rbd_opts);
> +	rbd_opts = NULL;	/* done with this */
>
>   	rc = rbd_dev_probe(rbd_dev);
>   	if (rc < 0)
> -		goto err_out_mem;
> +		goto err_out_rbd_dev;
>
>   	/* no need to lock here, as rbd_dev is not registered yet */
>   	rc = rbd_dev_snaps_update(rbd_dev);
> @@ -3317,8 +3343,6 @@ static ssize_t rbd_add(struct bus_type *bus,
>   	if (rc)
>   		goto err_out_bus;
>
> -	kfree(rbd_opts);
> -
>   	/* Everything's ready.  Announce the disk to the world. */
>
>   	add_disk(rbd_dev->disk);
> @@ -3332,7 +3356,6 @@ err_out_bus:
>   	/* this will also clean up rest of rbd_dev stuff */
>
>   	rbd_bus_del_dev(rbd_dev);
> -	kfree(rbd_opts);
>
>   	return rc;
>
> @@ -3346,9 +3369,8 @@ err_out_snaps:
>   	rbd_remove_all_snaps(rbd_dev);
>   err_out_probe:
>   	rbd_header_free(&rbd_dev->header);
> -	kfree(rbd_dev->header_name);
> -err_out_mem:
> -	kfree(rbd_dev);
> +err_out_rbd_dev:
> +	rbd_dev_destroy(rbd_dev);
>   err_out_client:
>   	rbd_put_client(rbdc);
>   err_out_args:
> @@ -3394,7 +3416,6 @@ static void rbd_dev_release(struct device *dev)
>   	if (rbd_dev->watch_event)
>   		rbd_req_sync_unwatch(rbd_dev);
>
> -	rbd_put_client(rbd_dev->rbd_client);
>
>   	/* clean up and free blkdev */
>   	rbd_free_disk(rbd_dev);
> @@ -3404,10 +3425,9 @@ static void rbd_dev_release(struct device *dev)
>   	rbd_header_free(&rbd_dev->header);
>
>   	/* done with the id, and with the rbd_dev */
> -	kfree(rbd_dev->header_name);
>   	rbd_dev_id_put(rbd_dev);
> -	rbd_spec_put(rbd_dev->spec);
> -	kfree(rbd_dev);
> +	rbd_assert(rbd_dev->rbd_client != NULL);
> +	rbd_dev_destroy(rbd_dev);
>
>   	/* release module ref */
>   	module_put(THIS_MODULE);
>


  reply	other threads:[~2012-10-31 20:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-30 21:11 rbd: wrap up of initialization rework Alex Elder
2012-10-30 21:14 ` [PATCH 1/4] rbd: don't pass rbd_dev to rbd_get_client() Alex Elder
2012-10-31 18:49   ` Josh Durgin
2012-10-30 21:14 ` [PATCH 2/4] rbd: consolidate rbd_dev init in rbd_add() Alex Elder
2012-10-31 20:53   ` Josh Durgin
2012-10-30 21:14 ` [PATCH 3/4] rbd: define rbd_dev_{create,destroy}() helpers Alex Elder
2012-10-31 20:56   ` Josh Durgin [this message]
2012-10-30 21:14 ` [PATCH 4/4] rbd: encapsulate last part of probe Alex Elder
2012-10-31 21:01   ` Josh Durgin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50919061.3000602@inktank.com \
    --to=josh.durgin@inktank.com \
    --cc=ceph-devel@vger.kernel.org \
    --cc=elder@inktank.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.