diff options
| author | Alex Elder <elder@inktank.com> | 2012-07-12 11:46:35 -0400 |
|---|---|---|
| committer | Sage Weil <sage@inktank.com> | 2012-07-30 12:30:01 -0400 |
| commit | d22f76e703040c2cc4ad13dd7747845b9844d360 (patch) | |
| tree | 04ba194b517ed79350dffc461a93a98591f98998 /drivers/block/rbd.c | |
| parent | 9bb2f334b9b5f2eb6030b7988b7f2302c3115bbb (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.c | 27 |
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 | */ |
| 2335 | static int rbd_add_parse_args(struct rbd_device *rbd_dev, | 2336 | static 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 | |||
| 2390 | out_err: | ||
| 2391 | kfree(rbd_dev->pool_name); | ||
| 2392 | rbd_dev->pool_name = NULL; | ||
| 2393 | |||
| 2394 | return ret; | ||
| 2386 | } | 2395 | } |
| 2387 | 2396 | ||
| 2388 | static ssize_t rbd_add(struct bus_type *bus, | 2397 | static ssize_t rbd_add(struct bus_type *bus, |
| @@ -2480,6 +2489,7 @@ err_out_blkdev: | |||
| 2480 | err_out_client: | 2489 | err_out_client: |
| 2481 | rbd_put_client(rbd_dev); | 2490 | rbd_put_client(rbd_dev); |
| 2482 | err_put_id: | 2491 | err_put_id: |
| 2492 | kfree(rbd_dev->pool_name); | ||
| 2483 | rbd_id_put(rbd_dev); | 2493 | rbd_id_put(rbd_dev); |
| 2484 | err_nomem: | 2494 | err_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 | ||
