summaryrefslogtreecommitdiff
path: root/net/9p
diff options
context:
space:
mode:
authorEric Van Hensbergen <ericvh@gmail.com>2008-10-13 20:36:14 -0500
committerEric Van Hensbergen <ericvh@gmail.com>2008-10-17 11:04:43 -0500
commit6936bf60d2c407449c09e3f28ec0301e1f937106 (patch)
tree222ca66d663958ff44e7d196f17d1ed0d2cb37d6 /net/9p
parent06b55b464ee5b305aca75cb7d9424b184bf07f68 (diff)
downloadlwn-6936bf60d2c407449c09e3f28ec0301e1f937106.tar.gz
lwn-6936bf60d2c407449c09e3f28ec0301e1f937106.zip
9p: encapsulate version function
Alsmot all 9P client wire functions have their own (set of) functions. Tversion is an exception as its encapsulated into the client_create code. This patch moves the protocol specifics of this to a function to match the rest of the code. Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'net/9p')
-rw-r--r--net/9p/client.c74
1 files changed, 44 insertions, 30 deletions
diff --git a/net/9p/client.c b/net/9p/client.c
index 90ee9efeede3..a9982df00a3a 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -587,16 +587,56 @@ static void p9_fid_destroy(struct p9_fid *fid)
kfree(fid);
}
-struct p9_client *p9_client_create(const char *dev_name, char *options)
+static int p9_client_version(struct p9_client *clnt)
{
- int err, n;
- struct p9_client *clnt;
+ int err = 0;
struct p9_fcall *tc, *rc;
struct p9_str *version;
+ P9_DPRINTK(P9_DEBUG_9P, "%p\n", clnt);
err = 0;
tc = NULL;
rc = NULL;
+
+ tc = p9_create_tversion(clnt->msize,
+ clnt->dotu ? "9P2000.u" : "9P2000");
+ if (IS_ERR(tc)) {
+ err = PTR_ERR(tc);
+ tc = NULL;
+ goto error;
+ }
+
+ err = p9_client_rpc(clnt, tc, &rc);
+ if (err)
+ goto error;
+
+ version = &rc->params.rversion.version;
+ if (version->len == 8 && !memcmp(version->str, "9P2000.u", 8))
+ clnt->dotu = 1;
+ else if (version->len == 6 && !memcmp(version->str, "9P2000", 6))
+ clnt->dotu = 0;
+ else {
+ err = -EREMOTEIO;
+ goto error;
+ }
+
+ if (rc->params.rversion.msize < clnt->msize)
+ clnt->msize = rc->params.rversion.msize;
+
+error:
+ kfree(tc);
+ kfree(rc);
+
+ return err;
+}
+EXPORT_SYMBOL(p9_client_auth);
+
+struct p9_client *p9_client_create(const char *dev_name, char *options)
+{
+ int err;
+ struct p9_client *clnt;
+
+ err = 0;
clnt = kmalloc(sizeof(struct p9_client), GFP_KERNEL);
if (!clnt)
return ERR_PTR(-ENOMEM);
@@ -628,7 +668,6 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
P9_DPRINTK(P9_DEBUG_9P, "clnt %p trans %p msize %d dotu %d\n",
clnt, clnt->trans_mod, clnt->msize, clnt->dotu);
-
err = clnt->trans_mod->create(clnt, dev_name, options);
if (err)
goto error;
@@ -636,38 +675,13 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
if ((clnt->msize+P9_IOHDRSZ) > clnt->trans_mod->maxsize)
clnt->msize = clnt->trans_mod->maxsize-P9_IOHDRSZ;
- tc = p9_create_tversion(clnt->msize, clnt->dotu?"9P2000.u":"9P2000");
- if (IS_ERR(tc)) {
- err = PTR_ERR(tc);
- tc = NULL;
- goto error;
- }
-
- err = p9_client_rpc(clnt, tc, &rc);
+ err = p9_client_version(clnt);
if (err)
goto error;
- version = &rc->params.rversion.version;
- if (version->len == 8 && !memcmp(version->str, "9P2000.u", 8))
- clnt->dotu = 1;
- else if (version->len == 6 && !memcmp(version->str, "9P2000", 6))
- clnt->dotu = 0;
- else {
- err = -EREMOTEIO;
- goto error;
- }
-
- n = rc->params.rversion.msize;
- if (n < clnt->msize)
- clnt->msize = n;
-
- kfree(tc);
- kfree(rc);
return clnt;
error:
- kfree(tc);
- kfree(rc);
p9_client_destroy(clnt);
return ERR_PTR(err);
}