aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-08-31 18:29:52 -0400
committerAlex Elder <elder@inktank.com>2012-10-01 15:30:51 -0400
commit3feeb8946739d980fb0922bf68363552a493a49c (patch)
tree5ba7c35caaf7a28ebe8bad9bad7e210a93df030b /drivers
parent99c1f08f6459cfa6fe1f5fb68706b437e006be2e (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.c72
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 */
2487static int rbd_add_parse_args(struct rbd_device *rbd_dev, 2489static 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; 2544dout(" SNAP_NAME is <%s>, len is %zd\n", snap_name, len);
2545
2546 return snap_name;
2549 2547
2550out_err: 2548out_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
2562static ssize_t rbd_add(struct bus_type *bus, 2560static 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)