diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2011-05-20 18:55:52 +0000 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@gmail.com> | 2011-05-25 08:46:38 -0500 |
commit | fe1cbabaea5e99a93bafe12fbf1b3b9cc71b610a (patch) | |
tree | 370e20e37796404602072f08b430ce04c6eb8188 /net | |
parent | 398c4f0efb5c2f07fe2f5cd67031b15fd3e920c9 (diff) | |
download | linux-3.10-fe1cbabaea5e99a93bafe12fbf1b3b9cc71b610a.tar.gz linux-3.10-fe1cbabaea5e99a93bafe12fbf1b3b9cc71b610a.tar.bz2 linux-3.10-fe1cbabaea5e99a93bafe12fbf1b3b9cc71b610a.zip |
net/9p: p9_idpool_get return -1 on error
We need to return -1 on error. Also handle error properly
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/9p/client.c | 20 | ||||
-rw-r--r-- | net/9p/util.c | 2 |
2 files changed, 13 insertions, 9 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 5b705559a6b..9e3b0e640da 100644 --- a/net/9p/client.c +++ b/net/9p/client.c @@ -304,12 +304,13 @@ static int p9_tag_init(struct p9_client *c) c->tagpool = p9_idpool_create(); if (IS_ERR(c->tagpool)) { err = PTR_ERR(c->tagpool); - c->tagpool = NULL; goto error; } - - p9_idpool_get(c->tagpool); /* reserve tag 0 */ - + err = p9_idpool_get(c->tagpool); /* reserve tag 0 */ + if (err < 0) { + p9_idpool_destroy(c->tagpool); + goto error; + } c->max_tag = 0; error: return err; @@ -789,11 +790,13 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) spin_lock_init(&clnt->lock); INIT_LIST_HEAD(&clnt->fidlist); - p9_tag_init(clnt); + err = p9_tag_init(clnt); + if (err < 0) + goto free_client; err = parse_opts(options, clnt); if (err < 0) - goto free_client; + goto destroy_tagpool; if (!clnt->trans_mod) clnt->trans_mod = v9fs_get_default_trans(); @@ -802,13 +805,12 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) err = -EPROTONOSUPPORT; P9_DPRINTK(P9_DEBUG_ERROR, "No transport defined or default transport\n"); - goto free_client; + goto destroy_tagpool; } clnt->fidpool = p9_idpool_create(); if (IS_ERR(clnt->fidpool)) { err = PTR_ERR(clnt->fidpool); - clnt->fidpool = NULL; goto put_trans; } @@ -834,6 +836,8 @@ destroy_fidpool: p9_idpool_destroy(clnt->fidpool); put_trans: v9fs_put_trans(clnt->trans_mod); +destroy_tagpool: + p9_idpool_destroy(clnt->tagpool); free_client: kfree(clnt); return ERR_PTR(err); diff --git a/net/9p/util.c b/net/9p/util.c index da6af81e59d..9c1c9348ac3 100644 --- a/net/9p/util.c +++ b/net/9p/util.c @@ -93,7 +93,7 @@ int p9_idpool_get(struct p9_idpool *p) retry: if (idr_pre_get(&p->pool, GFP_NOFS) == 0) - return 0; + return -1; spin_lock_irqsave(&p->lock, flags); |