diff options
author | Alex Elder <elder@inktank.com> | 2012-07-09 21:04:23 -0500 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-07-30 09:30:04 -0700 |
commit | bf3e5ae1129ef18a702c14fbaac27aeb2fe25e62 (patch) | |
tree | 80475b9c9994f4c1316db2497d0428fe462a702d /drivers/block/rbd.c | |
parent | cb8627c76db699e3a085596aa80503fb0973c041 (diff) | |
download | op-kernel-dev-bf3e5ae1129ef18a702c14fbaac27aeb2fe25e62.zip op-kernel-dev-bf3e5ae1129ef18a702c14fbaac27aeb2fe25e62.tar.gz |
rbd: dynamically allocate image name
There is no need to impose a small limit the length of the rbd image
name recorded in a struct rbd_dev. Remove the limitation by
allocating space for the image name dynamically.
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 | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 9b676b3..7d4735c 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -161,8 +161,8 @@ struct rbd_device { spinlock_t lock; /* queue lock */ struct rbd_image_header header; - char obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */ - int obj_len; + char *obj; /* rbd image name */ + size_t obj_len; char *obj_md_name; /* hdr nm. */ char *pool_name; int pool_id; @@ -2371,27 +2371,22 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev, if (!len || len >= options_size) return -EINVAL; + ret = -ENOMEM; rbd_dev->pool_name = dup_token(&buf, NULL); if (!rbd_dev->pool_name) - return -ENOMEM; - - len = copy_token(&buf, rbd_dev->obj, sizeof (rbd_dev->obj)); - if (!len || len >= sizeof (rbd_dev->obj)) { - ret = -EINVAL; goto out_err; - } - /* We have the object length in hand, save it. */ - - rbd_dev->obj_len = len; + rbd_dev->obj = dup_token(&buf, &rbd_dev->obj_len); + if (!rbd_dev->obj) + goto out_err; /* Create the name of the header object */ - rbd_dev->obj_md_name = kmalloc(len + sizeof (RBD_SUFFIX), GFP_KERNEL); - if (!rbd_dev->obj_md_name) { - ret = -ENOMEM; + rbd_dev->obj_md_name = kmalloc(rbd_dev->obj_len + + sizeof (RBD_SUFFIX), + GFP_KERNEL); + if (!rbd_dev->obj_md_name) goto out_err; - } sprintf(rbd_dev->obj_md_name, "%s%s", rbd_dev->obj, RBD_SUFFIX); /* @@ -2411,6 +2406,7 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev, out_err: kfree(rbd_dev->obj_md_name); + kfree(rbd_dev->obj); kfree(rbd_dev->pool_name); rbd_dev->pool_name = NULL; @@ -2514,6 +2510,7 @@ err_out_client: err_put_id: if (rbd_dev->pool_name) { kfree(rbd_dev->obj_md_name); + kfree(rbd_dev->obj); kfree(rbd_dev->pool_name); } rbd_id_put(rbd_dev); @@ -2566,6 +2563,7 @@ static void rbd_dev_release(struct device *dev) /* done with the id, and with the rbd_dev */ kfree(rbd_dev->obj_md_name); kfree(rbd_dev->pool_name); + kfree(rbd_dev->obj); rbd_id_put(rbd_dev); kfree(rbd_dev); |