diff options
author | Alex Elder <elder@inktank.com> | 2012-07-09 22:04:23 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-07-30 12:30:03 -0400 |
commit | cb8627c76db699e3a085596aa80503fb0973c041 (patch) | |
tree | f9c7006c709a114686500d8601beb02a169e9f0c | |
parent | 849b4260d482f7d4be5565b2044901a25f80e2c6 (diff) |
rbd: dynamically allocate image header name
There is no need to impose a small limit the length of the header
name recorded for an rbd image in a struct rbd_dev. Remove the
limitation by allocating space for the header name dynamically.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-rw-r--r-- | drivers/block/rbd.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 92867f3e945c..9b676b3b9ba0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -55,7 +55,6 @@ | |||
55 | 55 | ||
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)) | ||
59 | #define RBD_MAX_SNAP_NAME_LEN 32 | 58 | #define RBD_MAX_SNAP_NAME_LEN 32 |
60 | #define RBD_MAX_OPT_LEN 1024 | 59 | #define RBD_MAX_OPT_LEN 1024 |
61 | 60 | ||
@@ -164,7 +163,7 @@ struct rbd_device { | |||
164 | struct rbd_image_header header; | 163 | struct rbd_image_header header; |
165 | char obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */ | 164 | char obj[RBD_MAX_OBJ_NAME_LEN]; /* rbd image name */ |
166 | int obj_len; | 165 | int obj_len; |
167 | char obj_md_name[RBD_MAX_MD_NAME_LEN]; /* hdr nm. */ | 166 | char *obj_md_name; /* hdr nm. */ |
168 | char *pool_name; | 167 | char *pool_name; |
169 | int pool_id; | 168 | int pool_id; |
170 | 169 | ||
@@ -2386,8 +2385,13 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev, | |||
2386 | 2385 | ||
2387 | rbd_dev->obj_len = len; | 2386 | rbd_dev->obj_len = len; |
2388 | 2387 | ||
2389 | BUILD_BUG_ON(RBD_MAX_MD_NAME_LEN | 2388 | /* Create the name of the header object */ |
2390 | < RBD_MAX_OBJ_NAME_LEN + sizeof (RBD_SUFFIX)); | 2389 | |
2390 | rbd_dev->obj_md_name = kmalloc(len + sizeof (RBD_SUFFIX), GFP_KERNEL); | ||
2391 | if (!rbd_dev->obj_md_name) { | ||
2392 | ret = -ENOMEM; | ||
2393 | goto out_err; | ||
2394 | } | ||
2391 | sprintf(rbd_dev->obj_md_name, "%s%s", rbd_dev->obj, RBD_SUFFIX); | 2395 | sprintf(rbd_dev->obj_md_name, "%s%s", rbd_dev->obj, RBD_SUFFIX); |
2392 | 2396 | ||
2393 | /* | 2397 | /* |
@@ -2406,6 +2410,7 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev, | |||
2406 | return 0; | 2410 | return 0; |
2407 | 2411 | ||
2408 | out_err: | 2412 | out_err: |
2413 | kfree(rbd_dev->obj_md_name); | ||
2409 | kfree(rbd_dev->pool_name); | 2414 | kfree(rbd_dev->pool_name); |
2410 | rbd_dev->pool_name = NULL; | 2415 | rbd_dev->pool_name = NULL; |
2411 | 2416 | ||
@@ -2416,22 +2421,22 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
2416 | const char *buf, | 2421 | const char *buf, |
2417 | size_t count) | 2422 | size_t count) |
2418 | { | 2423 | { |
2419 | struct rbd_device *rbd_dev; | 2424 | char *options; |
2425 | struct rbd_device *rbd_dev = NULL; | ||
2420 | const char *mon_addrs = NULL; | 2426 | const char *mon_addrs = NULL; |
2421 | size_t mon_addrs_size = 0; | 2427 | size_t mon_addrs_size = 0; |
2422 | char *options = NULL; | ||
2423 | struct ceph_osd_client *osdc; | 2428 | struct ceph_osd_client *osdc; |
2424 | int rc = -ENOMEM; | 2429 | int rc = -ENOMEM; |
2425 | 2430 | ||
2426 | if (!try_module_get(THIS_MODULE)) | 2431 | if (!try_module_get(THIS_MODULE)) |
2427 | return -ENODEV; | 2432 | return -ENODEV; |
2428 | 2433 | ||
2429 | rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL); | ||
2430 | if (!rbd_dev) | ||
2431 | goto err_nomem; | ||
2432 | options = kmalloc(count, GFP_KERNEL); | 2434 | options = kmalloc(count, GFP_KERNEL); |
2433 | if (!options) | 2435 | if (!options) |
2434 | goto err_nomem; | 2436 | goto err_nomem; |
2437 | rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL); | ||
2438 | if (!rbd_dev) | ||
2439 | goto err_nomem; | ||
2435 | 2440 | ||
2436 | /* static rbd_device initialization */ | 2441 | /* static rbd_device initialization */ |
2437 | spin_lock_init(&rbd_dev->lock); | 2442 | spin_lock_init(&rbd_dev->lock); |
@@ -2507,11 +2512,14 @@ err_out_blkdev: | |||
2507 | err_out_client: | 2512 | err_out_client: |
2508 | rbd_put_client(rbd_dev); | 2513 | rbd_put_client(rbd_dev); |
2509 | err_put_id: | 2514 | err_put_id: |
2510 | kfree(rbd_dev->pool_name); | 2515 | if (rbd_dev->pool_name) { |
2516 | kfree(rbd_dev->obj_md_name); | ||
2517 | kfree(rbd_dev->pool_name); | ||
2518 | } | ||
2511 | rbd_id_put(rbd_dev); | 2519 | rbd_id_put(rbd_dev); |
2512 | err_nomem: | 2520 | err_nomem: |
2513 | kfree(options); | ||
2514 | kfree(rbd_dev); | 2521 | kfree(rbd_dev); |
2522 | kfree(options); | ||
2515 | 2523 | ||
2516 | dout("Error adding device %s\n", buf); | 2524 | dout("Error adding device %s\n", buf); |
2517 | module_put(THIS_MODULE); | 2525 | module_put(THIS_MODULE); |
@@ -2556,6 +2564,7 @@ static void rbd_dev_release(struct device *dev) | |||
2556 | unregister_blkdev(rbd_dev->major, rbd_dev->name); | 2564 | unregister_blkdev(rbd_dev->major, rbd_dev->name); |
2557 | 2565 | ||
2558 | /* done with the id, and with the rbd_dev */ | 2566 | /* done with the id, and with the rbd_dev */ |
2567 | kfree(rbd_dev->obj_md_name); | ||
2559 | kfree(rbd_dev->pool_name); | 2568 | kfree(rbd_dev->pool_name); |
2560 | rbd_id_put(rbd_dev); | 2569 | rbd_id_put(rbd_dev); |
2561 | kfree(rbd_dev); | 2570 | kfree(rbd_dev); |