aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
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
commit27cc25943fb359241546e7bb7a3ab1c2f35796a2 (patch)
treeb5b957d4732a9fc3cc4b9eff33344eb5faabde2e /drivers/block
parent60571c7d556b10db7e555bd4b6765647af5c41e8 (diff)
rbd: simplify error handling in rbd_add()
If a couple pointers are initialized to NULL then a single "out_nomem" label can be used for all of the memory allocation failure cases in rbd_add(). Also, get rid of the "irc" local variable there. There is no real need for "rc" to be type ssize_t, and it can be used in the spot "irc" was. Signed-off-by: Alex Elder <elder@dreamhost.com> Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/rbd.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 606d59aece2b..8ac26ab09aa0 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -2224,28 +2224,24 @@ static ssize_t rbd_add(struct bus_type *bus,
2224 const char *buf, 2224 const char *buf,
2225 size_t count) 2225 size_t count)
2226{ 2226{
2227 struct ceph_osd_client *osdc;
2228 struct rbd_device *rbd_dev; 2227 struct rbd_device *rbd_dev;
2229 ssize_t rc = -ENOMEM; 2228 char *mon_dev_name = NULL;
2230 int irc; 2229 char *options = NULL;
2231 char *mon_dev_name; 2230 struct ceph_osd_client *osdc;
2232 char *options; 2231 int rc = -ENOMEM;
2233 2232
2234 if (!try_module_get(THIS_MODULE)) 2233 if (!try_module_get(THIS_MODULE))
2235 return -ENODEV; 2234 return -ENODEV;
2236 2235
2236 rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
2237 if (!rbd_dev)
2238 goto err_nomem;
2237 mon_dev_name = kmalloc(count, GFP_KERNEL); 2239 mon_dev_name = kmalloc(count, GFP_KERNEL);
2238 if (!mon_dev_name) 2240 if (!mon_dev_name)
2239 goto err_out_mod; 2241 goto err_nomem;
2240
2241 options = kmalloc(count, GFP_KERNEL); 2242 options = kmalloc(count, GFP_KERNEL);
2242 if (!options) 2243 if (!options)
2243 goto err_mon_dev; 2244 goto err_nomem;
2244
2245 /* new rbd_device object */
2246 rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
2247 if (!rbd_dev)
2248 goto err_out_opt;
2249 2245
2250 /* static rbd_device initialization */ 2246 /* static rbd_device initialization */
2251 spin_lock_init(&rbd_dev->lock); 2247 spin_lock_init(&rbd_dev->lock);
@@ -2294,12 +2290,10 @@ static ssize_t rbd_add(struct bus_type *bus,
2294 rbd_dev->poolid = rc; 2290 rbd_dev->poolid = rc;
2295 2291
2296 /* register our block device */ 2292 /* register our block device */
2297 irc = register_blkdev(0, rbd_dev->name); 2293 rc = register_blkdev(0, rbd_dev->name);
2298 if (irc < 0) { 2294 if (rc < 0)
2299 rc = irc;
2300 goto err_out_client; 2295 goto err_out_client;
2301 } 2296 rbd_dev->major = rc;
2302 rbd_dev->major = irc;
2303 2297
2304 rc = rbd_bus_add_dev(rbd_dev); 2298 rc = rbd_bus_add_dev(rbd_dev);
2305 if (rc) 2299 if (rc)
@@ -2332,15 +2326,15 @@ err_out_client:
2332 rbd_put_client(rbd_dev); 2326 rbd_put_client(rbd_dev);
2333err_put_id: 2327err_put_id:
2334 rbd_id_put(rbd_dev); 2328 rbd_id_put(rbd_dev);
2335 kfree(rbd_dev); 2329err_nomem:
2336err_out_opt:
2337 kfree(options); 2330 kfree(options);
2338err_mon_dev:
2339 kfree(mon_dev_name); 2331 kfree(mon_dev_name);
2340err_out_mod: 2332 kfree(rbd_dev);
2333
2341 dout("Error adding device %s\n", buf); 2334 dout("Error adding device %s\n", buf);
2342 module_put(THIS_MODULE); 2335 module_put(THIS_MODULE);
2343 return rc; 2336
2337 return (ssize_t) rc;
2344} 2338}
2345 2339
2346static struct rbd_device *__rbd_get_dev(unsigned long id) 2340static struct rbd_device *__rbd_get_dev(unsigned long id)