summaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorAlex Elder <elder@dreamhost.com>2012-02-02 15:13:30 +0100
committerAlex Elder <elder@dreamhost.com>2012-03-22 16:47:48 +0100
commitd720bcb0a8f246eb441ba9d4f341bc16746556c6 (patch)
tree9df53a7ff220547c7150be803c8a3e8cca0664b1 /drivers/block
parentrbd: a few simple changes (diff)
downloadlinux-d720bcb0a8f246eb441ba9d4f341bc16746556c6.tar.xz
linux-d720bcb0a8f246eb441ba9d4f341bc16746556c6.zip
rbd: have rbd_get_client() return a rbd_client
Since rbd_get_client() currently returns an error code. It assigns the rbd_client field of the rbd_device structure it is passed if successful. Instead, have it return the created rbd_client structure and return a pointer-coded error if there is an error. This makes the assignment of the client pointer more obvious at the call site. 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.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 812fd38cba3d..3e6f300ba9f1 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -384,17 +384,15 @@ static int parse_rbd_opts_token(char *c, void *private)
* Get a ceph client with specific addr and configuration, if one does
* not exist create it.
*/
-static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
- char *options)
+static struct rbd_client *rbd_get_client(const char *mon_addr, char *options)
{
struct rbd_client *rbdc;
struct ceph_options *opt;
- int ret;
struct rbd_options *rbd_opts;
rbd_opts = kzalloc(sizeof(*rbd_opts), GFP_KERNEL);
if (!rbd_opts)
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
rbd_opts->notify_timeout = RBD_NOTIFY_TIMEOUT_DEFAULT;
@@ -402,8 +400,8 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
mon_addr + strlen(mon_addr),
parse_rbd_opts_token, rbd_opts);
if (IS_ERR(opt)) {
- ret = PTR_ERR(opt);
- goto done_err;
+ kfree(rbd_opts);
+ return ERR_CAST(opt);
}
spin_lock(&rbd_client_list_lock);
@@ -413,27 +411,19 @@ static int rbd_get_client(struct rbd_device *rbd_dev, const char *mon_addr,
kref_get(&rbdc->kref);
spin_unlock(&rbd_client_list_lock);
- rbd_dev->rbd_client = rbdc;
-
ceph_destroy_options(opt);
kfree(rbd_opts);
- return 0;
+ return rbdc;
}
spin_unlock(&rbd_client_list_lock);
rbdc = rbd_client_create(opt, rbd_opts);
- if (IS_ERR(rbdc)) {
- ret = PTR_ERR(rbdc);
- goto done_err;
- }
+ if (IS_ERR(rbdc))
+ kfree(rbd_opts);
- rbd_dev->rbd_client = rbdc;
- return 0;
-done_err:
- kfree(rbd_opts);
- return ret;
+ return rbdc;
}
/*
@@ -2290,9 +2280,11 @@ static ssize_t rbd_add(struct bus_type *bus,
/* initialize rest of new object */
snprintf(rbd_dev->name, DEV_NAME_LEN, RBD_DRV_NAME "%d", rbd_dev->id);
- rc = rbd_get_client(rbd_dev, mon_dev_name, options);
- if (rc < 0)
+ rbd_dev->rbd_client = rbd_get_client(mon_dev_name, options);
+ if (IS_ERR(rbd_dev->rbd_client)) {
+ rc = PTR_ERR(rbd_dev->rbd_client);
goto err_put_id;
+ }
/* pick the pool */
osdc = &rbd_dev->rbd_client->client->osdc;