diff options
Diffstat (limited to 'net/9p/client.c')
| -rw-r--r-- | net/9p/client.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 09d4f1e2e4a8..3b5f3c94a6eb 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -46,6 +46,7 @@ enum { | |||
| 46 | Opt_msize, | 46 | Opt_msize, |
| 47 | Opt_trans, | 47 | Opt_trans, |
| 48 | Opt_legacy, | 48 | Opt_legacy, |
| 49 | Opt_version, | ||
| 49 | Opt_err, | 50 | Opt_err, |
| 50 | }; | 51 | }; |
| 51 | 52 | ||
| @@ -53,9 +54,30 @@ static const match_table_t tokens = { | |||
| 53 | {Opt_msize, "msize=%u"}, | 54 | {Opt_msize, "msize=%u"}, |
| 54 | {Opt_legacy, "noextend"}, | 55 | {Opt_legacy, "noextend"}, |
| 55 | {Opt_trans, "trans=%s"}, | 56 | {Opt_trans, "trans=%s"}, |
| 57 | {Opt_version, "version=%s"}, | ||
| 56 | {Opt_err, NULL}, | 58 | {Opt_err, NULL}, |
| 57 | }; | 59 | }; |
| 58 | 60 | ||
| 61 | /* Interpret mount option for protocol version */ | ||
| 62 | static unsigned char get_protocol_version(const substring_t *name) | ||
| 63 | { | ||
| 64 | unsigned char version = -EINVAL; | ||
| 65 | if (!strncmp("9p2000", name->from, name->to-name->from)) { | ||
| 66 | version = p9_proto_legacy; | ||
| 67 | P9_DPRINTK(P9_DEBUG_9P, "Protocol version: Legacy\n"); | ||
| 68 | } else if (!strncmp("9p2000.u", name->from, name->to-name->from)) { | ||
| 69 | version = p9_proto_2000u; | ||
| 70 | P9_DPRINTK(P9_DEBUG_9P, "Protocol version: 9P2000.u\n"); | ||
| 71 | } else if (!strncmp("9p2010.L", name->from, name->to-name->from)) { | ||
| 72 | version = p9_proto_2010L; | ||
| 73 | P9_DPRINTK(P9_DEBUG_9P, "Protocol version: 9P2010.L\n"); | ||
| 74 | } else { | ||
| 75 | P9_DPRINTK(P9_DEBUG_ERROR, "Unknown protocol version %s. ", | ||
| 76 | name->from); | ||
| 77 | } | ||
| 78 | return version; | ||
| 79 | } | ||
| 80 | |||
| 59 | static struct p9_req_t * | 81 | static struct p9_req_t * |
| 60 | p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); | 82 | p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...); |
| 61 | 83 | ||
| @@ -120,6 +142,12 @@ static int parse_opts(char *opts, struct p9_client *clnt) | |||
| 120 | case Opt_legacy: | 142 | case Opt_legacy: |
| 121 | clnt->dotu = 0; | 143 | clnt->dotu = 0; |
| 122 | break; | 144 | break; |
| 145 | case Opt_version: | ||
| 146 | ret = get_protocol_version(&args[0]); | ||
| 147 | if (ret == -EINVAL) | ||
| 148 | goto free_and_return; | ||
| 149 | clnt->proto_version = ret; | ||
| 150 | break; | ||
| 123 | default: | 151 | default: |
| 124 | continue; | 152 | continue; |
| 125 | } | 153 | } |
