aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-07-12 11:46:35 -0400
committerSage Weil <sage@inktank.com>2012-07-30 12:30:01 -0400
commitd22f76e703040c2cc4ad13dd7747845b9844d360 (patch)
tree04ba194b517ed79350dffc461a93a98591f98998 /drivers/block/rbd.c
parent9bb2f334b9b5f2eb6030b7988b7f2302c3115bbb (diff)
rbd: dynamically allocate pool name
There is no need to impose a small limit the length of the pool name recorded for an rbd image in a struct rbd_device. Remove the limitation by allocating space for the pool name ynamically. 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.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 80320fd1c621..61ce29d268a6 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -56,7 +56,6 @@
56#define RBD_MINORS_PER_MAJOR 256 /* max minors per blkdev */ 56#define RBD_MINORS_PER_MAJOR 256 /* max minors per blkdev */
57 57
58#define RBD_MAX_MD_NAME_LEN (RBD_MAX_OBJ_NAME_LEN + sizeof(RBD_SUFFIX)) 58#define RBD_MAX_MD_NAME_LEN (RBD_MAX_OBJ_NAME_LEN + sizeof(RBD_SUFFIX))
59#define RBD_MAX_POOL_NAME_LEN 64
60#define RBD_MAX_SNAP_NAME_LEN 32 59#define RBD_MAX_SNAP_NAME_LEN 32
61#define RBD_MAX_OPT_LEN 1024 60#define RBD_MAX_OPT_LEN 1024
62 61
@@ -166,7 +165,7 @@ struct rbd_device {
166 char obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */ 165 char obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */
167 int obj_len; 166 int obj_len;
168 char obj_md_name[RBD_MAX_MD_NAME_LEN]; /* hdr nm. */ 167 char obj_md_name[RBD_MAX_MD_NAME_LEN]; /* hdr nm. */
169 char pool_name[RBD_MAX_POOL_NAME_LEN]; 168 char *pool_name;
170 int pool_id; 169 int pool_id;
171 170
172 struct ceph_osd_event *watch_event; 171 struct ceph_osd_event *watch_event;
@@ -2331,6 +2330,8 @@ static inline char *dup_token(const char **buf, size_t *lenp)
2331 * rbd_dev, rbd_md_name, and name fields of the given rbd_dev, based 2330 * rbd_dev, rbd_md_name, and name fields of the given rbd_dev, based
2332 * on the list of monitor addresses and other options provided via 2331 * on the list of monitor addresses and other options provided via
2333 * /sys/bus/rbd/add. 2332 * /sys/bus/rbd/add.
2333 *
2334 * Note: rbd_dev is assumed to have been initially zero-filled.
2334 */ 2335 */
2335static int rbd_add_parse_args(struct rbd_device *rbd_dev, 2336static int rbd_add_parse_args(struct rbd_device *rbd_dev,
2336 const char *buf, 2337 const char *buf,
@@ -2339,7 +2340,8 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev,
2339 char *options, 2340 char *options,
2340 size_t options_size) 2341 size_t options_size)
2341{ 2342{
2342 size_t len; 2343 size_t len;
2344 int ret;
2343 2345
2344 /* The first four tokens are required */ 2346 /* The first four tokens are required */
2345 2347
@@ -2355,13 +2357,14 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev,
2355 if (!len || len >= options_size) 2357 if (!len || len >= options_size)
2356 return -EINVAL; 2358 return -EINVAL;
2357 2359
2358 len = copy_token(&buf, rbd_dev->pool_name, sizeof (rbd_dev->pool_name)); 2360 rbd_dev->pool_name = dup_token(&buf, NULL);
2359 if (!len || len >= sizeof (rbd_dev->pool_name)) 2361 if (!rbd_dev->pool_name)
2360 return -EINVAL; 2362 return -ENOMEM;
2361 2363
2364 ret = -EINVAL;
2362 len = copy_token(&buf, rbd_dev->obj, sizeof (rbd_dev->obj)); 2365 len = copy_token(&buf, rbd_dev->obj, sizeof (rbd_dev->obj));
2363 if (!len || len >= sizeof (rbd_dev->obj)) 2366 if (!len || len >= sizeof (rbd_dev->obj))
2364 return -EINVAL; 2367 goto out_err;
2365 2368
2366 /* We have the object length in hand, save it. */ 2369 /* We have the object length in hand, save it. */
2367 2370
@@ -2380,9 +2383,15 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev,
2380 memcpy(rbd_dev->snap_name, RBD_SNAP_HEAD_NAME, 2383 memcpy(rbd_dev->snap_name, RBD_SNAP_HEAD_NAME,
2381 sizeof (RBD_SNAP_HEAD_NAME)); 2384 sizeof (RBD_SNAP_HEAD_NAME));
2382 else if (len >= sizeof (rbd_dev->snap_name)) 2385 else if (len >= sizeof (rbd_dev->snap_name))
2383 return -EINVAL; 2386 goto out_err;
2384 2387
2385 return 0; 2388 return 0;
2389
2390out_err:
2391 kfree(rbd_dev->pool_name);
2392 rbd_dev->pool_name = NULL;
2393
2394 return ret;
2386} 2395}
2387 2396
2388static ssize_t rbd_add(struct bus_type *bus, 2397static ssize_t rbd_add(struct bus_type *bus,
@@ -2480,6 +2489,7 @@ err_out_blkdev:
2480err_out_client: 2489err_out_client:
2481 rbd_put_client(rbd_dev); 2490 rbd_put_client(rbd_dev);
2482err_put_id: 2491err_put_id:
2492 kfree(rbd_dev->pool_name);
2483 rbd_id_put(rbd_dev); 2493 rbd_id_put(rbd_dev);
2484err_nomem: 2494err_nomem:
2485 kfree(options); 2495 kfree(options);
@@ -2528,6 +2538,7 @@ static void rbd_dev_release(struct device *dev)
2528 unregister_blkdev(rbd_dev->major, rbd_dev->name); 2538 unregister_blkdev(rbd_dev->major, rbd_dev->name);
2529 2539
2530 /* done with the id, and with the rbd_dev */ 2540 /* done with the id, and with the rbd_dev */
2541 kfree(rbd_dev->pool_name);
2531 rbd_id_put(rbd_dev); 2542 rbd_id_put(rbd_dev);
2532 kfree(rbd_dev); 2543 kfree(rbd_dev);
2533 2544