aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Elder <elder@dreamhost.com>2012-02-02 09:13:30 -0500
committerAlex Elder <elder@dreamhost.com>2012-03-22 11:47:48 -0400
commita725f65e52de73defb3c7033c471c48c56ca6cdd (patch)
tree38b1561838f74e4faab94f9828cfc57dc2027e0d
parent27cc25943fb359241546e7bb7a3ab1c2f35796a2 (diff)
rbd: encapsulate argument parsing for rbd_add()
Move the code that parses the arguments provided to rbd_add() (which are supplied via /sys/bus/rbd/add) into a separate function. Also rename the "mon_dev_name" variable in rbd_add() to be "mon_addrs". The variable represents a list of one or more comma-separated monitor IP addresses, each with an optional port number. I think "mon_addrs" captures that notion a little better. Signed-off-by: Alex Elder <elder@dreamhost.com>
-rw-r--r--drivers/block/rbd.c68
1 files changed, 42 insertions, 26 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 8ac26ab09aa0..caafe1d87a4b 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2220,12 +2220,43 @@ static void rbd_id_put(struct rbd_device *rbd_dev)
2220 atomic64_cmpxchg(&rbd_id_max, rbd_id, max_id); 2220 atomic64_cmpxchg(&rbd_id_max, rbd_id, max_id);
2221} 2221}
2222 2222
2223/*
2224 * This fills in the pool_name, obj, obj_len, snap_name, obj_len,
2225 * rbd_dev, rbd_md_name, and name fields of the given rbd_dev, based
2226 * on the list of monitor addresses and other options provided via
2227 * /sys/bus/rbd/add.
2228 */
2229static int rbd_add_parse_args(struct rbd_device *rbd_dev,
2230 const char *buf,
2231 char *mon_addrs,
2232 char *options)
2233{
2234 if (sscanf(buf, "%" __stringify(RBD_MAX_OPT_LEN) "s "
2235 "%" __stringify(RBD_MAX_OPT_LEN) "s "
2236 "%" __stringify(RBD_MAX_POOL_NAME_LEN) "s "
2237 "%" __stringify(RBD_MAX_OBJ_NAME_LEN) "s"
2238 "%" __stringify(RBD_MAX_SNAP_NAME_LEN) "s",
2239 mon_addrs, options, rbd_dev->pool_name,
2240 rbd_dev->obj, rbd_dev->snap_name) < 4)
2241 return -EINVAL;
2242
2243 if (rbd_dev->snap_name[0] == 0)
2244 memcpy(rbd_dev->snap_name, RBD_SNAP_HEAD_NAME,
2245 sizeof (RBD_SNAP_HEAD_NAME));
2246
2247 rbd_dev->obj_len = strlen(rbd_dev->obj);
2248 snprintf(rbd_dev->obj_md_name, sizeof(rbd_dev->obj_md_name), "%s%s",
2249 rbd_dev->obj, RBD_SUFFIX);
2250
2251 return 0;
2252}
2253
2223static ssize_t rbd_add(struct bus_type *bus, 2254static ssize_t rbd_add(struct bus_type *bus,
2224 const char *buf, 2255 const char *buf,
2225 size_t count) 2256 size_t count)
2226{ 2257{
2227 struct rbd_device *rbd_dev; 2258 struct rbd_device *rbd_dev;
2228 char *mon_dev_name = NULL; 2259 char *mon_addrs = NULL;
2229 char *options = NULL; 2260 char *options = NULL;
2230 struct ceph_osd_client *osdc; 2261 struct ceph_osd_client *osdc;
2231 int rc = -ENOMEM; 2262 int rc = -ENOMEM;
@@ -2236,8 +2267,8 @@ static ssize_t rbd_add(struct bus_type *bus,
2236 rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL); 2267 rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
2237 if (!rbd_dev) 2268 if (!rbd_dev)
2238 goto err_nomem; 2269 goto err_nomem;
2239 mon_dev_name = kmalloc(count, GFP_KERNEL); 2270 mon_addrs = kmalloc(count, GFP_KERNEL);
2240 if (!mon_dev_name) 2271 if (!mon_addrs)
2241 goto err_nomem; 2272 goto err_nomem;
2242 options = kmalloc(count, GFP_KERNEL); 2273 options = kmalloc(count, GFP_KERNEL);
2243 if (!options) 2274 if (!options)
@@ -2253,30 +2284,15 @@ static ssize_t rbd_add(struct bus_type *bus,
2253 /* generate unique id: find highest unique id, add one */ 2284 /* generate unique id: find highest unique id, add one */
2254 rbd_id_get(rbd_dev); 2285 rbd_id_get(rbd_dev);
2255 2286
2287 /* Fill in the device name, now that we have its id. */
2288 snprintf(rbd_dev->name, DEV_NAME_LEN, RBD_DRV_NAME "%d", rbd_dev->id);
2289
2256 /* parse add command */ 2290 /* parse add command */
2257 if (sscanf(buf, "%" __stringify(RBD_MAX_OPT_LEN) "s " 2291 rc = rbd_add_parse_args(rbd_dev, buf, mon_addrs, options);
2258 "%" __stringify(RBD_MAX_OPT_LEN) "s " 2292 if (rc)
2259 "%" __stringify(RBD_MAX_POOL_NAME_LEN) "s "
2260 "%" __stringify(RBD_MAX_OBJ_NAME_LEN) "s"
2261 "%" __stringify(RBD_MAX_SNAP_NAME_LEN) "s",
2262 mon_dev_name, options, rbd_dev->pool_name,
2263 rbd_dev->obj, rbd_dev->snap_name) < 4) {
2264 rc = -EINVAL;
2265 goto err_put_id; 2293 goto err_put_id;
2266 }
2267
2268 if (rbd_dev->snap_name[0] == 0)
2269 memcpy(rbd_dev->snap_name, RBD_SNAP_HEAD_NAME,
2270 sizeof (RBD_SNAP_HEAD_NAME));
2271
2272 rbd_dev->obj_len = strlen(rbd_dev->obj);
2273 snprintf(rbd_dev->obj_md_name, sizeof(rbd_dev->obj_md_name), "%s%s",
2274 rbd_dev->obj, RBD_SUFFIX);
2275
2276 /* initialize rest of new object */
2277 snprintf(rbd_dev->name, DEV_NAME_LEN, RBD_DRV_NAME "%d", rbd_dev->id);
2278 2294
2279 rbd_dev->rbd_client = rbd_get_client(mon_dev_name, options); 2295 rbd_dev->rbd_client = rbd_get_client(mon_addrs, options);
2280 if (IS_ERR(rbd_dev->rbd_client)) { 2296 if (IS_ERR(rbd_dev->rbd_client)) {
2281 rc = PTR_ERR(rbd_dev->rbd_client); 2297 rc = PTR_ERR(rbd_dev->rbd_client);
2282 goto err_put_id; 2298 goto err_put_id;
@@ -2317,7 +2333,7 @@ err_out_bus:
2317 2333
2318 rbd_bus_del_dev(rbd_dev); 2334 rbd_bus_del_dev(rbd_dev);
2319 kfree(options); 2335 kfree(options);
2320 kfree(mon_dev_name); 2336 kfree(mon_addrs);
2321 return rc; 2337 return rc;
2322 2338
2323err_out_blkdev: 2339err_out_blkdev:
@@ -2328,7 +2344,7 @@ err_put_id:
2328 rbd_id_put(rbd_dev); 2344 rbd_id_put(rbd_dev);
2329err_nomem: 2345err_nomem:
2330 kfree(options); 2346 kfree(options);
2331 kfree(mon_dev_name); 2347 kfree(mon_addrs);
2332 kfree(rbd_dev); 2348 kfree(rbd_dev);
2333 2349
2334 dout("Error adding device %s\n", buf); 2350 dout("Error adding device %s\n", buf);