diff options
author | Alex Elder <elder@inktank.com> | 2012-08-31 18:29:52 -0400 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2012-10-01 15:30:51 -0400 |
commit | 3feeb8946739d980fb0922bf68363552a493a49c (patch) | |
tree | 5ba7c35caaf7a28ebe8bad9bad7e210a93df030b /drivers | |
parent | 99c1f08f6459cfa6fe1f5fb68706b437e006be2e (diff) |
rbd: return snap name from rbd_add_parse_args()
This is the first of two patches aimed at isolating the code that
sets the mapping information into a single spot.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/rbd.c | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 4377a8302fc3..1a64ba294a76 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -2477,28 +2477,31 @@ static inline char *dup_token(const char **buf, size_t *lenp) | |||
2477 | } | 2477 | } |
2478 | 2478 | ||
2479 | /* | 2479 | /* |
2480 | * This fills in the pool_name, image_name, image_name_len, snap_name, | 2480 | * This fills in the pool_name, image_name, image_name_len, rbd_dev, |
2481 | * rbd_dev, rbd_md_name, and name fields of the given rbd_dev, based | 2481 | * rbd_md_name, and name fields of the given rbd_dev, based on the |
2482 | * on the list of monitor addresses and other options provided via | 2482 | * list of monitor addresses and other options provided via |
2483 | * /sys/bus/rbd/add. | 2483 | * /sys/bus/rbd/add. Returns a pointer to a dynamically-allocated |
2484 | * copy of the snapshot name to map if successful, or a | ||
2485 | * pointer-coded error otherwise. | ||
2484 | * | 2486 | * |
2485 | * Note: rbd_dev is assumed to have been initially zero-filled. | 2487 | * Note: rbd_dev is assumed to have been initially zero-filled. |
2486 | */ | 2488 | */ |
2487 | static int rbd_add_parse_args(struct rbd_device *rbd_dev, | 2489 | static char *rbd_add_parse_args(struct rbd_device *rbd_dev, |
2488 | const char *buf, | 2490 | const char *buf, |
2489 | const char **mon_addrs, | 2491 | const char **mon_addrs, |
2490 | size_t *mon_addrs_size, | 2492 | size_t *mon_addrs_size, |
2491 | char *options, | 2493 | char *options, |
2492 | size_t options_size) | 2494 | size_t options_size) |
2493 | { | 2495 | { |
2494 | size_t len; | 2496 | size_t len; |
2495 | int ret; | 2497 | char *err_ptr = ERR_PTR(-EINVAL); |
2498 | char *snap_name; | ||
2496 | 2499 | ||
2497 | /* The first four tokens are required */ | 2500 | /* The first four tokens are required */ |
2498 | 2501 | ||
2499 | len = next_token(&buf); | 2502 | len = next_token(&buf); |
2500 | if (!len) | 2503 | if (!len) |
2501 | return -EINVAL; | 2504 | return err_ptr; |
2502 | *mon_addrs_size = len + 1; | 2505 | *mon_addrs_size = len + 1; |
2503 | *mon_addrs = buf; | 2506 | *mon_addrs = buf; |
2504 | 2507 | ||
@@ -2506,9 +2509,9 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev, | |||
2506 | 2509 | ||
2507 | len = copy_token(&buf, options, options_size); | 2510 | len = copy_token(&buf, options, options_size); |
2508 | if (!len || len >= options_size) | 2511 | if (!len || len >= options_size) |
2509 | return -EINVAL; | 2512 | return err_ptr; |
2510 | 2513 | ||
2511 | ret = -ENOMEM; | 2514 | err_ptr = ERR_PTR(-ENOMEM); |
2512 | rbd_dev->pool_name = dup_token(&buf, NULL); | 2515 | rbd_dev->pool_name = dup_token(&buf, NULL); |
2513 | if (!rbd_dev->pool_name) | 2516 | if (!rbd_dev->pool_name) |
2514 | goto out_err; | 2517 | goto out_err; |
@@ -2526,26 +2529,21 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev, | |||
2526 | goto out_err; | 2529 | goto out_err; |
2527 | sprintf(rbd_dev->header_name, "%s%s", rbd_dev->image_name, RBD_SUFFIX); | 2530 | sprintf(rbd_dev->header_name, "%s%s", rbd_dev->image_name, RBD_SUFFIX); |
2528 | 2531 | ||
2529 | /* | 2532 | /* Snapshot name is optional */ |
2530 | * The snapshot name is optional. If none is is supplied, | 2533 | len = next_token(&buf); |
2531 | * we use the default value. | ||
2532 | */ | ||
2533 | rbd_dev->mapping.snap_name = dup_token(&buf, &len); | ||
2534 | if (!rbd_dev->mapping.snap_name) | ||
2535 | goto out_err; | ||
2536 | if (!len) { | 2534 | if (!len) { |
2537 | /* Replace the empty name with the default */ | 2535 | buf = RBD_SNAP_HEAD_NAME; /* No snapshot supplied */ |
2538 | kfree(rbd_dev->mapping.snap_name); | 2536 | len = sizeof (RBD_SNAP_HEAD_NAME) - 1; |
2539 | rbd_dev->mapping.snap_name | ||
2540 | = kmalloc(sizeof (RBD_SNAP_HEAD_NAME), GFP_KERNEL); | ||
2541 | if (!rbd_dev->mapping.snap_name) | ||
2542 | goto out_err; | ||
2543 | |||
2544 | memcpy(rbd_dev->mapping.snap_name, RBD_SNAP_HEAD_NAME, | ||
2545 | sizeof (RBD_SNAP_HEAD_NAME)); | ||
2546 | } | 2537 | } |
2538 | snap_name = kmalloc(len + 1, GFP_KERNEL); | ||
2539 | if (!snap_name) | ||
2540 | goto out_err; | ||
2541 | memcpy(snap_name, buf, len); | ||
2542 | *(snap_name + len) = '\0'; | ||
2547 | 2543 | ||
2548 | return 0; | 2544 | dout(" SNAP_NAME is <%s>, len is %zd\n", snap_name, len); |
2545 | |||
2546 | return snap_name; | ||
2549 | 2547 | ||
2550 | out_err: | 2548 | out_err: |
2551 | kfree(rbd_dev->header_name); | 2549 | kfree(rbd_dev->header_name); |
@@ -2556,7 +2554,7 @@ out_err: | |||
2556 | kfree(rbd_dev->pool_name); | 2554 | kfree(rbd_dev->pool_name); |
2557 | rbd_dev->pool_name = NULL; | 2555 | rbd_dev->pool_name = NULL; |
2558 | 2556 | ||
2559 | return ret; | 2557 | return err_ptr; |
2560 | } | 2558 | } |
2561 | 2559 | ||
2562 | static ssize_t rbd_add(struct bus_type *bus, | 2560 | static ssize_t rbd_add(struct bus_type *bus, |
@@ -2569,6 +2567,7 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
2569 | size_t mon_addrs_size = 0; | 2567 | size_t mon_addrs_size = 0; |
2570 | struct ceph_osd_client *osdc; | 2568 | struct ceph_osd_client *osdc; |
2571 | int rc = -ENOMEM; | 2569 | int rc = -ENOMEM; |
2570 | char *snap_name; | ||
2572 | 2571 | ||
2573 | if (!try_module_get(THIS_MODULE)) | 2572 | if (!try_module_get(THIS_MODULE)) |
2574 | return -ENODEV; | 2573 | return -ENODEV; |
@@ -2595,10 +2594,13 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
2595 | sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->dev_id); | 2594 | sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->dev_id); |
2596 | 2595 | ||
2597 | /* parse add command */ | 2596 | /* parse add command */ |
2598 | rc = rbd_add_parse_args(rbd_dev, buf, &mon_addrs, &mon_addrs_size, | 2597 | snap_name = rbd_add_parse_args(rbd_dev, buf, |
2599 | options, count); | 2598 | &mon_addrs, &mon_addrs_size, options, count); |
2600 | if (rc) | 2599 | if (IS_ERR(snap_name)) { |
2600 | rc = PTR_ERR(snap_name); | ||
2601 | goto err_put_id; | 2601 | goto err_put_id; |
2602 | } | ||
2603 | rbd_dev->mapping.snap_name = snap_name; | ||
2602 | 2604 | ||
2603 | rc = rbd_get_client(rbd_dev, mon_addrs, mon_addrs_size - 1, options); | 2605 | rc = rbd_get_client(rbd_dev, mon_addrs, mon_addrs_size - 1, options); |
2604 | if (rc < 0) | 2606 | if (rc < 0) |