rbd: dynamically allocate image name
authorAlex Elder <elder@inktank.com>
Tue, 10 Jul 2012 02:04:23 +0000 (21:04 -0500)
committerSage Weil <sage@inktank.com>
Mon, 30 Jul 2012 16:30:04 +0000 (09:30 -0700)
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>
drivers/block/rbd.c
drivers/block/rbd_types.h

index 9b676b3b9ba0f798588da9be2e60ea4a874deb4f..7d4735c9dba59231ffe570c2425977a153a17c35 100644 (file)
@@ -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);
 
index 950708688f1719109962e86b450186c845f89cf7..0924e9e41a60ce4b297f8fb62a17ca6d81c90cf1 100644 (file)
@@ -31,7 +31,6 @@
 #define RBD_MIN_OBJ_ORDER       16
 #define RBD_MAX_OBJ_ORDER       30
 
-#define RBD_MAX_OBJ_NAME_LEN   96
 #define RBD_MAX_SEG_NAME_LEN   128
 
 #define RBD_COMP_NONE          0