aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorAlex Elder <elder@dreamhost.com>2012-02-02 08:13:30 -0600
committerAlex Elder <elder@dreamhost.com>2012-03-22 10:47:48 -0500
commit27cc25943fb359241546e7bb7a3ab1c2f35796a2 (patch)
treeb5b957d4732a9fc3cc4b9eff33344eb5faabde2e /drivers/block
parentrbd: reduce memory used for rbd_dev fields (diff)
downloadlinux-dev-27cc25943fb359241546e7bb7a3ab1c2f35796a2.tar.xz
linux-dev-27cc25943fb359241546e7bb7a3ab1c2f35796a2.zip
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,
const char *buf,
size_t count)
{
- struct ceph_osd_client *osdc;
struct rbd_device *rbd_dev;
- ssize_t rc = -ENOMEM;
- int irc;
- char *mon_dev_name;
- char *options;
+ char *mon_dev_name = NULL;
+ char *options = NULL;
+ struct ceph_osd_client *osdc;
+ int rc = -ENOMEM;
if (!try_module_get(THIS_MODULE))
return -ENODEV;
+ rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
+ if (!rbd_dev)
+ goto err_nomem;
mon_dev_name = kmalloc(count, GFP_KERNEL);
if (!mon_dev_name)
- goto err_out_mod;
-
+ goto err_nomem;
options = kmalloc(count, GFP_KERNEL);
if (!options)
- goto err_mon_dev;
-
- /* new rbd_device object */
- rbd_dev = kzalloc(sizeof(*rbd_dev), GFP_KERNEL);
- if (!rbd_dev)
- goto err_out_opt;
+ goto err_nomem;
/* static rbd_device initialization */
spin_lock_init(&rbd_dev->lock);
@@ -2294,12 +2290,10 @@ static ssize_t rbd_add(struct bus_type *bus,
rbd_dev->poolid = rc;
/* register our block device */
- irc = register_blkdev(0, rbd_dev->name);
- if (irc < 0) {
- rc = irc;
+ rc = register_blkdev(0, rbd_dev->name);
+ if (rc < 0)
goto err_out_client;
- }
- rbd_dev->major = irc;
+ rbd_dev->major = rc;
rc = rbd_bus_add_dev(rbd_dev);
if (rc)
@@ -2332,15 +2326,15 @@ err_out_client:
rbd_put_client(rbd_dev);
err_put_id:
rbd_id_put(rbd_dev);
- kfree(rbd_dev);
-err_out_opt:
+err_nomem:
kfree(options);
-err_mon_dev:
kfree(mon_dev_name);
-err_out_mod:
+ kfree(rbd_dev);
+
dout("Error adding device %s\n", buf);
module_put(THIS_MODULE);
- return rc;
+
+ return (ssize_t) rc;
}
static struct rbd_device *__rbd_get_dev(unsigned long id)