summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/rbd.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 2f2d194..641f098 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2284,7 +2284,7 @@ static inline size_t copy_token(const char **buf,
*/
static int rbd_add_parse_args(struct rbd_device *rbd_dev,
const char *buf,
- char *mon_addrs,
+ const char **mon_addrs,
size_t *mon_addrs_size,
char *options,
size_t options_size)
@@ -2293,10 +2293,13 @@ static int rbd_add_parse_args(struct rbd_device *rbd_dev,
/* The first four tokens are required */
- len = copy_token(&buf, mon_addrs, *mon_addrs_size);
- if (!len || len >= *mon_addrs_size)
+ len = next_token(&buf);
+ if (!len)
return -EINVAL;
*mon_addrs_size = len + 1;
+ *mon_addrs = buf;
+
+ buf += len;
len = copy_token(&buf, options, options_size);
if (!len || len >= options_size)
@@ -2337,8 +2340,8 @@ static ssize_t rbd_add(struct bus_type *bus,
size_t count)
{
struct rbd_device *rbd_dev;
- char *mon_addrs = NULL;
- size_t mon_addrs_size;
+ const char *mon_addrs = NULL;
+ size_t mon_addrs_size = 0;
char *options = NULL;
struct ceph_osd_client *osdc;
int rc = -ENOMEM;
@@ -2349,9 +2352,6 @@ static ssize_t rbd_add(struct bus_type *bus,
rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
if (!rbd_dev)
goto err_nomem;
- mon_addrs = kmalloc(count, GFP_KERNEL);
- if (!mon_addrs)
- goto err_nomem;
options = kmalloc(count, GFP_KERNEL);
if (!options)
goto err_nomem;
@@ -2372,8 +2372,7 @@ static ssize_t rbd_add(struct bus_type *bus,
sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->id);
/* parse add command */
- mon_addrs_size = count;
- rc = rbd_add_parse_args(rbd_dev, buf, mon_addrs, &mon_addrs_size,
+ rc = rbd_add_parse_args(rbd_dev, buf, &mon_addrs, &mon_addrs_size,
options, count);
if (rc)
goto err_put_id;
@@ -2420,7 +2419,6 @@ err_out_bus:
rbd_bus_del_dev(rbd_dev);
kfree(options);
- kfree(mon_addrs);
return rc;
err_out_blkdev:
@@ -2431,7 +2429,6 @@ err_put_id:
rbd_id_put(rbd_dev);
err_nomem:
kfree(options);
- kfree(mon_addrs);
kfree(rbd_dev);
dout("Error adding device %s\n", buf);
OpenPOWER on IntegriCloud