From: Alex Elder <elder@ieee.org>
To: Ilya Dryomov <ilya.dryomov@inktank.com>, ceph-devel@vger.kernel.org
Subject: Re: [PATCH 4/8] rbd: split rbd_dev_spec_update() into two functions
Date: Thu, 24 Jul 2014 07:55:43 -0500 [thread overview]
Message-ID: <53D1024F.6000500@ieee.org> (raw)
In-Reply-To: <1406191369-6746-5-git-send-email-ilya.dryomov@inktank.com>
On 07/24/2014 03:42 AM, Ilya Dryomov wrote:
> rbd_dev_spec_update() has two modes of operation, with nothing in
> common between them. Split it into two functions, one for each mode
> and make our expectations more clear.
>
> Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Looks good.
Reviewed-by: Alex Elder <elder@linaro.org>
> ---
> drivers/block/rbd.c | 79 +++++++++++++++++++++++++++++++--------------------
> 1 file changed, 48 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 4541f6027e4a..23df1773ef77 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -3798,6 +3798,9 @@ static struct rbd_spec *rbd_spec_alloc(void)
> spec = kzalloc(sizeof (*spec), GFP_KERNEL);
> if (!spec)
> return NULL;
> +
> + spec->pool_id = CEPH_NOPOOL;
> + spec->snap_id = CEPH_NOSNAP;
> kref_init(&spec->kref);
>
> return spec;
> @@ -4257,18 +4260,38 @@ static u64 rbd_snap_id_by_name(struct rbd_device *rbd_dev, const char *name)
> }
>
> /*
> - * When an rbd image has a parent image, it is identified by the
> - * pool, image, and snapshot ids (not names). This function fills
> - * in the names for those ids. (It's OK if we can't figure out the
> - * name for an image id, but the pool and snapshot ids should always
> - * exist and have names.) All names in an rbd spec are dynamically
> - * allocated.
> + * An image being mapped will have everything but the snap id.
> + */
> +static int rbd_spec_fill_snap_id(struct rbd_device *rbd_dev)
> +{
> + struct rbd_spec *spec = rbd_dev->spec;
> +
> + rbd_assert(spec->pool_id != CEPH_NOPOOL && spec->pool_name);
> + rbd_assert(spec->image_id && spec->image_name);
> + rbd_assert(spec->snap_name);
> +
> + if (strcmp(spec->snap_name, RBD_SNAP_HEAD_NAME)) {
> + u64 snap_id;
> +
> + snap_id = rbd_snap_id_by_name(rbd_dev, spec->snap_name);
> + if (snap_id == CEPH_NOSNAP)
> + return -ENOENT;
> +
> + spec->snap_id = snap_id;
> + } else {
> + spec->snap_id = CEPH_NOSNAP;
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * A parent image will have all ids but none of the names.
> *
> - * When an image being mapped (not a parent) is probed, we have the
> - * pool name and pool id, image name and image id, and the snapshot
> - * name. The only thing we're missing is the snapshot id.
> + * All names in an rbd spec are dynamically allocated. It's OK if we
> + * can't figure out the name for an image id.
> */
> -static int rbd_dev_spec_update(struct rbd_device *rbd_dev)
> +static int rbd_spec_fill_names(struct rbd_device *rbd_dev)
> {
> struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
> struct rbd_spec *spec = rbd_dev->spec;
> @@ -4277,24 +4300,9 @@ static int rbd_dev_spec_update(struct rbd_device *rbd_dev)
> const char *snap_name;
> int ret;
>
> - /*
> - * An image being mapped will have the pool name (etc.), but
> - * we need to look up the snapshot id.
> - */
> - if (spec->pool_name) {
> - if (strcmp(spec->snap_name, RBD_SNAP_HEAD_NAME)) {
> - u64 snap_id;
> -
> - snap_id = rbd_snap_id_by_name(rbd_dev, spec->snap_name);
> - if (snap_id == CEPH_NOSNAP)
> - return -ENOENT;
> - spec->snap_id = snap_id;
> - } else {
> - spec->snap_id = CEPH_NOSNAP;
> - }
> -
> - return 0;
> - }
> + rbd_assert(spec->pool_id != CEPH_NOPOOL);
> + rbd_assert(spec->image_id);
> + rbd_assert(spec->snap_id != CEPH_NOSNAP);
>
> /* Get the pool name; we have to make our own copy of this */
>
> @@ -4313,7 +4321,7 @@ static int rbd_dev_spec_update(struct rbd_device *rbd_dev)
> if (!image_name)
> rbd_warn(rbd_dev, "unable to get image name");
>
> - /* Look up the snapshot name, and make a copy */
> + /* Fetch the snapshot name */
>
> snap_name = rbd_snap_name(rbd_dev, spec->snap_id);
> if (IS_ERR(snap_name)) {
> @@ -4326,10 +4334,10 @@ static int rbd_dev_spec_update(struct rbd_device *rbd_dev)
> spec->snap_name = snap_name;
>
> return 0;
> +
> out_err:
> kfree(image_name);
> kfree(pool_name);
> -
> return ret;
> }
>
> @@ -5158,7 +5166,16 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
> if (ret)
> goto err_out_watch;
>
> - ret = rbd_dev_spec_update(rbd_dev);
> + /*
> + * If this image is the one being mapped, we have pool name and
> + * id, image name and id, and snap name - need to fill snap id.
> + * Otherwise this is a parent image, identified by pool, image
> + * and snap ids - need to fill in names for those ids.
> + */
> + if (mapping)
> + ret = rbd_spec_fill_snap_id(rbd_dev);
> + else
> + ret = rbd_spec_fill_names(rbd_dev);
> if (ret)
> goto err_out_probe;
>
>
next prev parent reply other threads:[~2014-07-24 12:55 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-24 8:42 [PATCH 0/8] wip-overlap Ilya Dryomov
2014-07-24 8:42 ` [PATCH 1/8] rbd: show the entire chain of parent images Ilya Dryomov
2014-07-24 12:31 ` Alex Elder
2014-07-24 12:45 ` Ilya Dryomov
2014-07-24 8:42 ` [PATCH 2/8] rbd: introduce rbd_dev_header_info() Ilya Dryomov
2014-07-24 12:34 ` Alex Elder
2014-07-24 8:42 ` [PATCH 3/8] rbd: remove unnecessary asserts in rbd_dev_image_probe() Ilya Dryomov
2014-07-24 12:40 ` Alex Elder
2014-07-24 8:42 ` [PATCH 4/8] rbd: split rbd_dev_spec_update() into two functions Ilya Dryomov
2014-07-24 12:55 ` Alex Elder [this message]
2014-07-24 8:42 ` [PATCH 5/8] rbd: harden rbd_dev_refresh() caller Ilya Dryomov
2014-07-24 13:09 ` Alex Elder
2014-07-24 8:42 ` [PATCH 6/8] rbd: update mapping size only on refresh Ilya Dryomov
2014-07-24 13:25 ` Alex Elder
2014-07-24 13:46 ` Ilya Dryomov
2014-07-24 15:10 ` Ilya Dryomov
2014-07-25 13:31 ` Alex Elder
2014-07-24 17:59 ` Alex Elder
2014-07-24 8:42 ` [PATCH 7/8] rbd: do not read in parent info before snap context Ilya Dryomov
2014-07-25 8:14 ` Alex Elder
2014-07-25 8:36 ` Ilya Dryomov
2014-07-25 12:46 ` Alex Elder
2014-07-24 8:42 ` [PATCH 8/8] rbd: take snap_id into account when reading in parent info Ilya Dryomov
2014-07-24 18:43 ` Alex Elder
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=53D1024F.6000500@ieee.org \
--to=elder@ieee.org \
--cc=ceph-devel@vger.kernel.org \
--cc=ilya.dryomov@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.