diff options
Diffstat (limited to 'net/9p/trans_fd.c')
-rw-r--r-- | net/9p/trans_fd.c | 205 |
1 files changed, 92 insertions, 113 deletions
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index f84592345573..d09389f08382 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/file.h> | 39 | #include <linux/file.h> |
40 | #include <linux/parser.h> | 40 | #include <linux/parser.h> |
41 | #include <net/9p/9p.h> | 41 | #include <net/9p/9p.h> |
42 | #include <net/9p/client.h> | ||
42 | #include <net/9p/transport.h> | 43 | #include <net/9p/transport.h> |
43 | 44 | ||
44 | #define P9_PORT 564 | 45 | #define P9_PORT 564 |
@@ -146,7 +147,7 @@ struct p9_poll_wait { | |||
146 | * @mux_list: list link for mux to manage multiple connections (?) | 147 | * @mux_list: list link for mux to manage multiple connections (?) |
147 | * @msize: maximum size for connection (dup) | 148 | * @msize: maximum size for connection (dup) |
148 | * @extended: 9p2000.u flag (dup) | 149 | * @extended: 9p2000.u flag (dup) |
149 | * @trans: reference to transport instance for this connection | 150 | * @client: reference to client instance for this connection |
150 | * @tagpool: id accounting for transactions | 151 | * @tagpool: id accounting for transactions |
151 | * @err: error state | 152 | * @err: error state |
152 | * @req_list: accounting for requests which have been sent | 153 | * @req_list: accounting for requests which have been sent |
@@ -171,7 +172,7 @@ struct p9_conn { | |||
171 | struct list_head mux_list; | 172 | struct list_head mux_list; |
172 | int msize; | 173 | int msize; |
173 | unsigned char extended; | 174 | unsigned char extended; |
174 | struct p9_trans *trans; | 175 | struct p9_client *client; |
175 | struct p9_idpool *tagpool; | 176 | struct p9_idpool *tagpool; |
176 | int err; | 177 | int err; |
177 | struct list_head req_list; | 178 | struct list_head req_list; |
@@ -214,8 +215,8 @@ static void p9_read_work(struct work_struct *work); | |||
214 | static void p9_write_work(struct work_struct *work); | 215 | static void p9_write_work(struct work_struct *work); |
215 | static void p9_pollwait(struct file *filp, wait_queue_head_t *wait_address, | 216 | static void p9_pollwait(struct file *filp, wait_queue_head_t *wait_address, |
216 | poll_table *p); | 217 | poll_table *p); |
217 | static int p9_fd_write(struct p9_trans *trans, void *v, int len); | 218 | static int p9_fd_write(struct p9_client *client, void *v, int len); |
218 | static int p9_fd_read(struct p9_trans *trans, void *v, int len); | 219 | static int p9_fd_read(struct p9_client *client, void *v, int len); |
219 | 220 | ||
220 | static DEFINE_SPINLOCK(p9_poll_lock); | 221 | static DEFINE_SPINLOCK(p9_poll_lock); |
221 | static LIST_HEAD(p9_poll_pending_list); | 222 | static LIST_HEAD(p9_poll_pending_list); |
@@ -223,7 +224,7 @@ static struct workqueue_struct *p9_mux_wq; | |||
223 | static struct task_struct *p9_poll_task; | 224 | static struct task_struct *p9_poll_task; |
224 | 225 | ||
225 | static void p9_conn_destroy(struct p9_conn *); | 226 | static void p9_conn_destroy(struct p9_conn *); |
226 | static unsigned int p9_fd_poll(struct p9_trans *trans, | 227 | static unsigned int p9_fd_poll(struct p9_client *client, |
227 | struct poll_table_struct *pt); | 228 | struct poll_table_struct *pt); |
228 | 229 | ||
229 | #ifdef P9_NONBLOCK | 230 | #ifdef P9_NONBLOCK |
@@ -271,27 +272,26 @@ static void p9_mux_poll_stop(struct p9_conn *m) | |||
271 | 272 | ||
272 | /** | 273 | /** |
273 | * p9_conn_create - allocate and initialize the per-session mux data | 274 | * p9_conn_create - allocate and initialize the per-session mux data |
274 | * @trans: transport structure | 275 | * @client: client instance |
275 | * | 276 | * |
276 | * Note: Creates the polling task if this is the first session. | 277 | * Note: Creates the polling task if this is the first session. |
277 | */ | 278 | */ |
278 | 279 | ||
279 | static struct p9_conn *p9_conn_create(struct p9_trans *trans) | 280 | static struct p9_conn *p9_conn_create(struct p9_client *client) |
280 | { | 281 | { |
281 | int i, n; | 282 | int i, n; |
282 | struct p9_conn *m; | 283 | struct p9_conn *m; |
283 | 284 | ||
284 | P9_DPRINTK(P9_DEBUG_MUX, "transport %p msize %d\n", trans, | 285 | P9_DPRINTK(P9_DEBUG_MUX, "client %p msize %d\n", client, client->msize); |
285 | trans->msize); | ||
286 | m = kzalloc(sizeof(struct p9_conn), GFP_KERNEL); | 286 | m = kzalloc(sizeof(struct p9_conn), GFP_KERNEL); |
287 | if (!m) | 287 | if (!m) |
288 | return ERR_PTR(-ENOMEM); | 288 | return ERR_PTR(-ENOMEM); |
289 | 289 | ||
290 | spin_lock_init(&m->lock); | 290 | spin_lock_init(&m->lock); |
291 | INIT_LIST_HEAD(&m->mux_list); | 291 | INIT_LIST_HEAD(&m->mux_list); |
292 | m->msize = trans->msize; | 292 | m->msize = client->msize; |
293 | m->extended = trans->extended; | 293 | m->extended = client->dotu; |
294 | m->trans = trans; | 294 | m->client = client; |
295 | m->tagpool = p9_idpool_create(); | 295 | m->tagpool = p9_idpool_create(); |
296 | if (IS_ERR(m->tagpool)) { | 296 | if (IS_ERR(m->tagpool)) { |
297 | kfree(m); | 297 | kfree(m); |
@@ -305,7 +305,7 @@ static struct p9_conn *p9_conn_create(struct p9_trans *trans) | |||
305 | INIT_LIST_HEAD(&m->poll_pending_link); | 305 | INIT_LIST_HEAD(&m->poll_pending_link); |
306 | init_poll_funcptr(&m->pt, p9_pollwait); | 306 | init_poll_funcptr(&m->pt, p9_pollwait); |
307 | 307 | ||
308 | n = p9_fd_poll(trans, &m->pt); | 308 | n = p9_fd_poll(client, &m->pt); |
309 | if (n & POLLIN) { | 309 | if (n & POLLIN) { |
310 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p can read\n", m); | 310 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p can read\n", m); |
311 | set_bit(Rpending, &m->wsched); | 311 | set_bit(Rpending, &m->wsched); |
@@ -345,7 +345,7 @@ static void p9_conn_destroy(struct p9_conn *m) | |||
345 | 345 | ||
346 | p9_conn_cancel(m, -ECONNRESET); | 346 | p9_conn_cancel(m, -ECONNRESET); |
347 | 347 | ||
348 | m->trans = NULL; | 348 | m->client = NULL; |
349 | p9_idpool_destroy(m->tagpool); | 349 | p9_idpool_destroy(m->tagpool); |
350 | kfree(m); | 350 | kfree(m); |
351 | } | 351 | } |
@@ -420,7 +420,7 @@ static void p9_poll_mux(struct p9_conn *m) | |||
420 | if (m->err < 0) | 420 | if (m->err < 0) |
421 | return; | 421 | return; |
422 | 422 | ||
423 | n = p9_fd_poll(m->trans, NULL); | 423 | n = p9_fd_poll(m->client, NULL); |
424 | if (n < 0 || n & (POLLERR | POLLHUP | POLLNVAL)) { | 424 | if (n < 0 || n & (POLLERR | POLLHUP | POLLNVAL)) { |
425 | P9_DPRINTK(P9_DEBUG_MUX, "error mux %p err %d\n", m, n); | 425 | P9_DPRINTK(P9_DEBUG_MUX, "error mux %p err %d\n", m, n); |
426 | if (n >= 0) | 426 | if (n >= 0) |
@@ -533,7 +533,7 @@ again: | |||
533 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p pos %d size %d\n", m, m->wpos, | 533 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p pos %d size %d\n", m, m->wpos, |
534 | m->wsize); | 534 | m->wsize); |
535 | clear_bit(Wpending, &m->wsched); | 535 | clear_bit(Wpending, &m->wsched); |
536 | err = p9_fd_write(m->trans, m->wbuf + m->wpos, m->wsize - m->wpos); | 536 | err = p9_fd_write(m->client, m->wbuf + m->wpos, m->wsize - m->wpos); |
537 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p sent %d bytes\n", m, err); | 537 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p sent %d bytes\n", m, err); |
538 | if (err == -EAGAIN) { | 538 | if (err == -EAGAIN) { |
539 | clear_bit(Wworksched, &m->wsched); | 539 | clear_bit(Wworksched, &m->wsched); |
@@ -555,7 +555,7 @@ again: | |||
555 | if (test_and_clear_bit(Wpending, &m->wsched)) | 555 | if (test_and_clear_bit(Wpending, &m->wsched)) |
556 | n = POLLOUT; | 556 | n = POLLOUT; |
557 | else | 557 | else |
558 | n = p9_fd_poll(m->trans, NULL); | 558 | n = p9_fd_poll(m->client, NULL); |
559 | 559 | ||
560 | if (n & POLLOUT) { | 560 | if (n & POLLOUT) { |
561 | P9_DPRINTK(P9_DEBUG_MUX, "schedule write work %p\n", m); | 561 | P9_DPRINTK(P9_DEBUG_MUX, "schedule write work %p\n", m); |
@@ -640,7 +640,7 @@ static void p9_read_work(struct work_struct *work) | |||
640 | } | 640 | } |
641 | 641 | ||
642 | clear_bit(Rpending, &m->wsched); | 642 | clear_bit(Rpending, &m->wsched); |
643 | err = p9_fd_read(m->trans, m->rbuf + m->rpos, m->msize - m->rpos); | 643 | err = p9_fd_read(m->client, m->rbuf + m->rpos, m->msize - m->rpos); |
644 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p got %d bytes\n", m, err); | 644 | P9_DPRINTK(P9_DEBUG_MUX, "mux %p got %d bytes\n", m, err); |
645 | if (err == -EAGAIN) { | 645 | if (err == -EAGAIN) { |
646 | clear_bit(Rworksched, &m->wsched); | 646 | clear_bit(Rworksched, &m->wsched); |
@@ -735,7 +735,7 @@ static void p9_read_work(struct work_struct *work) | |||
735 | if (test_and_clear_bit(Rpending, &m->wsched)) | 735 | if (test_and_clear_bit(Rpending, &m->wsched)) |
736 | n = POLLIN; | 736 | n = POLLIN; |
737 | else | 737 | else |
738 | n = p9_fd_poll(m->trans, NULL); | 738 | n = p9_fd_poll(m->client, NULL); |
739 | 739 | ||
740 | if (n & POLLIN) { | 740 | if (n & POLLIN) { |
741 | P9_DPRINTK(P9_DEBUG_MUX, "schedule read work %p\n", m); | 741 | P9_DPRINTK(P9_DEBUG_MUX, "schedule read work %p\n", m); |
@@ -819,7 +819,7 @@ static struct p9_req *p9_send_request(struct p9_conn *m, | |||
819 | if (test_and_clear_bit(Wpending, &m->wsched)) | 819 | if (test_and_clear_bit(Wpending, &m->wsched)) |
820 | n = POLLOUT; | 820 | n = POLLOUT; |
821 | else | 821 | else |
822 | n = p9_fd_poll(m->trans, NULL); | 822 | n = p9_fd_poll(m->client, NULL); |
823 | 823 | ||
824 | if (n & POLLOUT && !test_and_set_bit(Wworksched, &m->wsched)) | 824 | if (n & POLLOUT && !test_and_set_bit(Wworksched, &m->wsched)) |
825 | queue_work(p9_mux_wq, &m->wq); | 825 | queue_work(p9_mux_wq, &m->wq); |
@@ -933,16 +933,16 @@ p9_conn_rpc_cb(struct p9_req *req, void *a) | |||
933 | /** | 933 | /** |
934 | * p9_fd_rpc- sends 9P request and waits until a response is available. | 934 | * p9_fd_rpc- sends 9P request and waits until a response is available. |
935 | * The function can be interrupted. | 935 | * The function can be interrupted. |
936 | * @t: transport data | 936 | * @client: client instance |
937 | * @tc: request to be sent | 937 | * @tc: request to be sent |
938 | * @rc: pointer where a pointer to the response is stored | 938 | * @rc: pointer where a pointer to the response is stored |
939 | * | 939 | * |
940 | */ | 940 | */ |
941 | 941 | ||
942 | int | 942 | int |
943 | p9_fd_rpc(struct p9_trans *t, struct p9_fcall *tc, struct p9_fcall **rc) | 943 | p9_fd_rpc(struct p9_client *client, struct p9_fcall *tc, struct p9_fcall **rc) |
944 | { | 944 | { |
945 | struct p9_trans_fd *p = t->priv; | 945 | struct p9_trans_fd *p = client->trans; |
946 | struct p9_conn *m = p->conn; | 946 | struct p9_conn *m = p->conn; |
947 | int err, sigpending; | 947 | int err, sigpending; |
948 | unsigned long flags; | 948 | unsigned long flags; |
@@ -975,7 +975,7 @@ p9_fd_rpc(struct p9_trans *t, struct p9_fcall *tc, struct p9_fcall **rc) | |||
975 | if (r.err < 0) | 975 | if (r.err < 0) |
976 | err = r.err; | 976 | err = r.err; |
977 | 977 | ||
978 | if (err == -ERESTARTSYS && m->trans->status == Connected | 978 | if (err == -ERESTARTSYS && client->status == Connected |
979 | && m->err == 0) { | 979 | && m->err == 0) { |
980 | if (p9_mux_flush_request(m, req)) { | 980 | if (p9_mux_flush_request(m, req)) { |
981 | /* wait until we get response of the flush message */ | 981 | /* wait until we get response of the flush message */ |
@@ -984,7 +984,7 @@ p9_fd_rpc(struct p9_trans *t, struct p9_fcall *tc, struct p9_fcall **rc) | |||
984 | err = wait_event_interruptible(r.wqueue, | 984 | err = wait_event_interruptible(r.wqueue, |
985 | r.rcall || r.err); | 985 | r.rcall || r.err); |
986 | } while (!r.rcall && !r.err && err == -ERESTARTSYS && | 986 | } while (!r.rcall && !r.err && err == -ERESTARTSYS && |
987 | m->trans->status == Connected && !m->err); | 987 | client->status == Connected && !m->err); |
988 | 988 | ||
989 | err = -ERESTARTSYS; | 989 | err = -ERESTARTSYS; |
990 | } | 990 | } |
@@ -1133,7 +1133,7 @@ static int parse_opts(char *params, struct p9_fd_opts *opts) | |||
1133 | return 0; | 1133 | return 0; |
1134 | } | 1134 | } |
1135 | 1135 | ||
1136 | static int p9_fd_open(struct p9_trans *trans, int rfd, int wfd) | 1136 | static int p9_fd_open(struct p9_client *client, int rfd, int wfd) |
1137 | { | 1137 | { |
1138 | struct p9_trans_fd *ts = kmalloc(sizeof(struct p9_trans_fd), | 1138 | struct p9_trans_fd *ts = kmalloc(sizeof(struct p9_trans_fd), |
1139 | GFP_KERNEL); | 1139 | GFP_KERNEL); |
@@ -1151,13 +1151,13 @@ static int p9_fd_open(struct p9_trans *trans, int rfd, int wfd) | |||
1151 | return -EIO; | 1151 | return -EIO; |
1152 | } | 1152 | } |
1153 | 1153 | ||
1154 | trans->priv = ts; | 1154 | client->trans = ts; |
1155 | trans->status = Connected; | 1155 | client->status = Connected; |
1156 | 1156 | ||
1157 | return 0; | 1157 | return 0; |
1158 | } | 1158 | } |
1159 | 1159 | ||
1160 | static int p9_socket_open(struct p9_trans *trans, struct socket *csocket) | 1160 | static int p9_socket_open(struct p9_client *client, struct socket *csocket) |
1161 | { | 1161 | { |
1162 | int fd, ret; | 1162 | int fd, ret; |
1163 | 1163 | ||
@@ -1168,33 +1168,33 @@ static int p9_socket_open(struct p9_trans *trans, struct socket *csocket) | |||
1168 | return fd; | 1168 | return fd; |
1169 | } | 1169 | } |
1170 | 1170 | ||
1171 | ret = p9_fd_open(trans, fd, fd); | 1171 | ret = p9_fd_open(client, fd, fd); |
1172 | if (ret < 0) { | 1172 | if (ret < 0) { |
1173 | P9_EPRINTK(KERN_ERR, "p9_socket_open: failed to open fd\n"); | 1173 | P9_EPRINTK(KERN_ERR, "p9_socket_open: failed to open fd\n"); |
1174 | sockfd_put(csocket); | 1174 | sockfd_put(csocket); |
1175 | return ret; | 1175 | return ret; |
1176 | } | 1176 | } |
1177 | 1177 | ||
1178 | ((struct p9_trans_fd *)trans->priv)->rd->f_flags |= O_NONBLOCK; | 1178 | ((struct p9_trans_fd *)client->trans)->rd->f_flags |= O_NONBLOCK; |
1179 | 1179 | ||
1180 | return 0; | 1180 | return 0; |
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | /** | 1183 | /** |
1184 | * p9_fd_read- read from a fd | 1184 | * p9_fd_read- read from a fd |
1185 | * @trans: transport instance state | 1185 | * @client: client instance |
1186 | * @v: buffer to receive data into | 1186 | * @v: buffer to receive data into |
1187 | * @len: size of receive buffer | 1187 | * @len: size of receive buffer |
1188 | * | 1188 | * |
1189 | */ | 1189 | */ |
1190 | 1190 | ||
1191 | static int p9_fd_read(struct p9_trans *trans, void *v, int len) | 1191 | static int p9_fd_read(struct p9_client *client, void *v, int len) |
1192 | { | 1192 | { |
1193 | int ret; | 1193 | int ret; |
1194 | struct p9_trans_fd *ts = NULL; | 1194 | struct p9_trans_fd *ts = NULL; |
1195 | 1195 | ||
1196 | if (trans && trans->status != Disconnected) | 1196 | if (client && client->status != Disconnected) |
1197 | ts = trans->priv; | 1197 | ts = client->trans; |
1198 | 1198 | ||
1199 | if (!ts) | 1199 | if (!ts) |
1200 | return -EREMOTEIO; | 1200 | return -EREMOTEIO; |
@@ -1204,26 +1204,26 @@ static int p9_fd_read(struct p9_trans *trans, void *v, int len) | |||
1204 | 1204 | ||
1205 | ret = kernel_read(ts->rd, ts->rd->f_pos, v, len); | 1205 | ret = kernel_read(ts->rd, ts->rd->f_pos, v, len); |
1206 | if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) | 1206 | if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) |
1207 | trans->status = Disconnected; | 1207 | client->status = Disconnected; |
1208 | return ret; | 1208 | return ret; |
1209 | } | 1209 | } |
1210 | 1210 | ||
1211 | /** | 1211 | /** |
1212 | * p9_fd_write - write to a socket | 1212 | * p9_fd_write - write to a socket |
1213 | * @trans: transport instance state | 1213 | * @client: client instance |
1214 | * @v: buffer to send data from | 1214 | * @v: buffer to send data from |
1215 | * @len: size of send buffer | 1215 | * @len: size of send buffer |
1216 | * | 1216 | * |
1217 | */ | 1217 | */ |
1218 | 1218 | ||
1219 | static int p9_fd_write(struct p9_trans *trans, void *v, int len) | 1219 | static int p9_fd_write(struct p9_client *client, void *v, int len) |
1220 | { | 1220 | { |
1221 | int ret; | 1221 | int ret; |
1222 | mm_segment_t oldfs; | 1222 | mm_segment_t oldfs; |
1223 | struct p9_trans_fd *ts = NULL; | 1223 | struct p9_trans_fd *ts = NULL; |
1224 | 1224 | ||
1225 | if (trans && trans->status != Disconnected) | 1225 | if (client && client->status != Disconnected) |
1226 | ts = trans->priv; | 1226 | ts = client->trans; |
1227 | 1227 | ||
1228 | if (!ts) | 1228 | if (!ts) |
1229 | return -EREMOTEIO; | 1229 | return -EREMOTEIO; |
@@ -1238,18 +1238,18 @@ static int p9_fd_write(struct p9_trans *trans, void *v, int len) | |||
1238 | set_fs(oldfs); | 1238 | set_fs(oldfs); |
1239 | 1239 | ||
1240 | if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) | 1240 | if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) |
1241 | trans->status = Disconnected; | 1241 | client->status = Disconnected; |
1242 | return ret; | 1242 | return ret; |
1243 | } | 1243 | } |
1244 | 1244 | ||
1245 | static unsigned int | 1245 | static unsigned int |
1246 | p9_fd_poll(struct p9_trans *trans, struct poll_table_struct *pt) | 1246 | p9_fd_poll(struct p9_client *client, struct poll_table_struct *pt) |
1247 | { | 1247 | { |
1248 | int ret, n; | 1248 | int ret, n; |
1249 | struct p9_trans_fd *ts = NULL; | 1249 | struct p9_trans_fd *ts = NULL; |
1250 | 1250 | ||
1251 | if (trans && trans->status == Connected) | 1251 | if (client && client->status == Connected) |
1252 | ts = trans->priv; | 1252 | ts = client->trans; |
1253 | 1253 | ||
1254 | if (!ts) | 1254 | if (!ts) |
1255 | return -EREMOTEIO; | 1255 | return -EREMOTEIO; |
@@ -1275,30 +1275,31 @@ p9_fd_poll(struct p9_trans *trans, struct poll_table_struct *pt) | |||
1275 | } | 1275 | } |
1276 | 1276 | ||
1277 | /** | 1277 | /** |
1278 | * p9_fd_close - shutdown socket | 1278 | * p9_fd_close - shutdown file descriptor transport |
1279 | * @trans: private socket structure | 1279 | * @client: client instance |
1280 | * | 1280 | * |
1281 | */ | 1281 | */ |
1282 | 1282 | ||
1283 | static void p9_fd_close(struct p9_trans *trans) | 1283 | static void p9_fd_close(struct p9_client *client) |
1284 | { | 1284 | { |
1285 | struct p9_trans_fd *ts; | 1285 | struct p9_trans_fd *ts; |
1286 | 1286 | ||
1287 | if (!trans) | 1287 | if (!client) |
1288 | return; | 1288 | return; |
1289 | 1289 | ||
1290 | ts = xchg(&trans->priv, NULL); | 1290 | ts = client->trans; |
1291 | |||
1292 | if (!ts) | 1291 | if (!ts) |
1293 | return; | 1292 | return; |
1294 | 1293 | ||
1294 | client->status = Disconnected; | ||
1295 | |||
1295 | p9_conn_destroy(ts->conn); | 1296 | p9_conn_destroy(ts->conn); |
1296 | 1297 | ||
1297 | trans->status = Disconnected; | ||
1298 | if (ts->rd) | 1298 | if (ts->rd) |
1299 | fput(ts->rd); | 1299 | fput(ts->rd); |
1300 | if (ts->wr) | 1300 | if (ts->wr) |
1301 | fput(ts->wr); | 1301 | fput(ts->wr); |
1302 | |||
1302 | kfree(ts); | 1303 | kfree(ts); |
1303 | } | 1304 | } |
1304 | 1305 | ||
@@ -1319,31 +1320,23 @@ static inline int valid_ipaddr4(const char *buf) | |||
1319 | return 0; | 1320 | return 0; |
1320 | } | 1321 | } |
1321 | 1322 | ||
1322 | static struct p9_trans * | 1323 | static int |
1323 | p9_trans_create_tcp(const char *addr, char *args, int msize, unsigned char dotu) | 1324 | p9_fd_create_tcp(struct p9_client *client, const char *addr, char *args) |
1324 | { | 1325 | { |
1325 | int err; | 1326 | int err; |
1326 | struct p9_trans *trans; | ||
1327 | struct socket *csocket; | 1327 | struct socket *csocket; |
1328 | struct sockaddr_in sin_server; | 1328 | struct sockaddr_in sin_server; |
1329 | struct p9_fd_opts opts; | 1329 | struct p9_fd_opts opts; |
1330 | struct p9_trans_fd *p; | 1330 | struct p9_trans_fd *p = NULL; /* this gets allocated in p9_fd_open */ |
1331 | 1331 | ||
1332 | err = parse_opts(args, &opts); | 1332 | err = parse_opts(args, &opts); |
1333 | if (err < 0) | 1333 | if (err < 0) |
1334 | return ERR_PTR(err); | 1334 | return err; |
1335 | 1335 | ||
1336 | if (valid_ipaddr4(addr) < 0) | 1336 | if (valid_ipaddr4(addr) < 0) |
1337 | return ERR_PTR(-EINVAL); | 1337 | return -EINVAL; |
1338 | 1338 | ||
1339 | csocket = NULL; | 1339 | csocket = NULL; |
1340 | trans = kmalloc(sizeof(struct p9_trans), GFP_KERNEL); | ||
1341 | if (!trans) | ||
1342 | return ERR_PTR(-ENOMEM); | ||
1343 | trans->msize = msize; | ||
1344 | trans->extended = dotu; | ||
1345 | trans->rpc = p9_fd_rpc; | ||
1346 | trans->close = p9_fd_close; | ||
1347 | 1340 | ||
1348 | sin_server.sin_family = AF_INET; | 1341 | sin_server.sin_family = AF_INET; |
1349 | sin_server.sin_addr.s_addr = in_aton(addr); | 1342 | sin_server.sin_addr.s_addr = in_aton(addr); |
@@ -1366,45 +1359,38 @@ p9_trans_create_tcp(const char *addr, char *args, int msize, unsigned char dotu) | |||
1366 | goto error; | 1359 | goto error; |
1367 | } | 1360 | } |
1368 | 1361 | ||
1369 | err = p9_socket_open(trans, csocket); | 1362 | err = p9_socket_open(client, csocket); |
1370 | if (err < 0) | 1363 | if (err < 0) |
1371 | goto error; | 1364 | goto error; |
1372 | 1365 | ||
1373 | p = (struct p9_trans_fd *) trans->priv; | 1366 | p = (struct p9_trans_fd *) client->trans; |
1374 | p->conn = p9_conn_create(trans); | 1367 | p->conn = p9_conn_create(client); |
1375 | if (IS_ERR(p->conn)) { | 1368 | if (IS_ERR(p->conn)) { |
1376 | err = PTR_ERR(p->conn); | 1369 | err = PTR_ERR(p->conn); |
1377 | p->conn = NULL; | 1370 | p->conn = NULL; |
1378 | goto error; | 1371 | goto error; |
1379 | } | 1372 | } |
1380 | 1373 | ||
1381 | return trans; | 1374 | return 0; |
1382 | 1375 | ||
1383 | error: | 1376 | error: |
1384 | if (csocket) | 1377 | if (csocket) |
1385 | sock_release(csocket); | 1378 | sock_release(csocket); |
1386 | 1379 | ||
1387 | kfree(trans); | 1380 | kfree(p); |
1388 | return ERR_PTR(err); | 1381 | |
1382 | return err; | ||
1389 | } | 1383 | } |
1390 | 1384 | ||
1391 | static struct p9_trans * | 1385 | static int |
1392 | p9_trans_create_unix(const char *addr, char *args, int msize, | 1386 | p9_fd_create_unix(struct p9_client *client, const char *addr, char *args) |
1393 | unsigned char dotu) | ||
1394 | { | 1387 | { |
1395 | int err; | 1388 | int err; |
1396 | struct socket *csocket; | 1389 | struct socket *csocket; |
1397 | struct sockaddr_un sun_server; | 1390 | struct sockaddr_un sun_server; |
1398 | struct p9_trans *trans; | 1391 | struct p9_trans_fd *p = NULL; /* this gets allocated in p9_fd_open */ |
1399 | struct p9_trans_fd *p; | ||
1400 | 1392 | ||
1401 | csocket = NULL; | 1393 | csocket = NULL; |
1402 | trans = kmalloc(sizeof(struct p9_trans), GFP_KERNEL); | ||
1403 | if (!trans) | ||
1404 | return ERR_PTR(-ENOMEM); | ||
1405 | |||
1406 | trans->rpc = p9_fd_rpc; | ||
1407 | trans->close = p9_fd_close; | ||
1408 | 1394 | ||
1409 | if (strlen(addr) > UNIX_PATH_MAX) { | 1395 | if (strlen(addr) > UNIX_PATH_MAX) { |
1410 | P9_EPRINTK(KERN_ERR, "p9_trans_unix: address too long: %s\n", | 1396 | P9_EPRINTK(KERN_ERR, "p9_trans_unix: address too long: %s\n", |
@@ -1425,79 +1411,68 @@ p9_trans_create_unix(const char *addr, char *args, int msize, | |||
1425 | goto error; | 1411 | goto error; |
1426 | } | 1412 | } |
1427 | 1413 | ||
1428 | err = p9_socket_open(trans, csocket); | 1414 | err = p9_socket_open(client, csocket); |
1429 | if (err < 0) | 1415 | if (err < 0) |
1430 | goto error; | 1416 | goto error; |
1431 | 1417 | ||
1432 | trans->msize = msize; | 1418 | p = (struct p9_trans_fd *) client->trans; |
1433 | trans->extended = dotu; | 1419 | p->conn = p9_conn_create(client); |
1434 | p = (struct p9_trans_fd *) trans->priv; | ||
1435 | p->conn = p9_conn_create(trans); | ||
1436 | if (IS_ERR(p->conn)) { | 1420 | if (IS_ERR(p->conn)) { |
1437 | err = PTR_ERR(p->conn); | 1421 | err = PTR_ERR(p->conn); |
1438 | p->conn = NULL; | 1422 | p->conn = NULL; |
1439 | goto error; | 1423 | goto error; |
1440 | } | 1424 | } |
1441 | 1425 | ||
1442 | return trans; | 1426 | return 0; |
1443 | 1427 | ||
1444 | error: | 1428 | error: |
1445 | if (csocket) | 1429 | if (csocket) |
1446 | sock_release(csocket); | 1430 | sock_release(csocket); |
1447 | 1431 | ||
1448 | kfree(trans); | 1432 | kfree(p); |
1449 | return ERR_PTR(err); | 1433 | return err; |
1450 | } | 1434 | } |
1451 | 1435 | ||
1452 | static struct p9_trans * | 1436 | static int |
1453 | p9_trans_create_fd(const char *name, char *args, int msize, | 1437 | p9_fd_create(struct p9_client *client, const char *addr, char *args) |
1454 | unsigned char extended) | ||
1455 | { | 1438 | { |
1456 | int err; | 1439 | int err; |
1457 | struct p9_trans *trans; | ||
1458 | struct p9_fd_opts opts; | 1440 | struct p9_fd_opts opts; |
1459 | struct p9_trans_fd *p; | 1441 | struct p9_trans_fd *p = NULL; /* this get allocated in p9_fd_open */ |
1460 | 1442 | ||
1461 | parse_opts(args, &opts); | 1443 | parse_opts(args, &opts); |
1462 | 1444 | ||
1463 | if (opts.rfd == ~0 || opts.wfd == ~0) { | 1445 | if (opts.rfd == ~0 || opts.wfd == ~0) { |
1464 | printk(KERN_ERR "v9fs: Insufficient options for proto=fd\n"); | 1446 | printk(KERN_ERR "v9fs: Insufficient options for proto=fd\n"); |
1465 | return ERR_PTR(-ENOPROTOOPT); | 1447 | return -ENOPROTOOPT; |
1466 | } | 1448 | } |
1467 | 1449 | ||
1468 | trans = kmalloc(sizeof(struct p9_trans), GFP_KERNEL); | 1450 | err = p9_fd_open(client, opts.rfd, opts.wfd); |
1469 | if (!trans) | ||
1470 | return ERR_PTR(-ENOMEM); | ||
1471 | |||
1472 | trans->rpc = p9_fd_rpc; | ||
1473 | trans->close = p9_fd_close; | ||
1474 | |||
1475 | err = p9_fd_open(trans, opts.rfd, opts.wfd); | ||
1476 | if (err < 0) | 1451 | if (err < 0) |
1477 | goto error; | 1452 | goto error; |
1478 | 1453 | ||
1479 | trans->msize = msize; | 1454 | p = (struct p9_trans_fd *) client->trans; |
1480 | trans->extended = extended; | 1455 | p->conn = p9_conn_create(client); |
1481 | p = (struct p9_trans_fd *) trans->priv; | ||
1482 | p->conn = p9_conn_create(trans); | ||
1483 | if (IS_ERR(p->conn)) { | 1456 | if (IS_ERR(p->conn)) { |
1484 | err = PTR_ERR(p->conn); | 1457 | err = PTR_ERR(p->conn); |
1485 | p->conn = NULL; | 1458 | p->conn = NULL; |
1486 | goto error; | 1459 | goto error; |
1487 | } | 1460 | } |
1488 | 1461 | ||
1489 | return trans; | 1462 | return 0; |
1490 | 1463 | ||
1491 | error: | 1464 | error: |
1492 | kfree(trans); | 1465 | kfree(p); |
1493 | return ERR_PTR(err); | 1466 | return err; |
1494 | } | 1467 | } |
1495 | 1468 | ||
1496 | static struct p9_trans_module p9_tcp_trans = { | 1469 | static struct p9_trans_module p9_tcp_trans = { |
1497 | .name = "tcp", | 1470 | .name = "tcp", |
1498 | .maxsize = MAX_SOCK_BUF, | 1471 | .maxsize = MAX_SOCK_BUF, |
1499 | .def = 1, | 1472 | .def = 1, |
1500 | .create = p9_trans_create_tcp, | 1473 | .create = p9_fd_create_tcp, |
1474 | .close = p9_fd_close, | ||
1475 | .rpc = p9_fd_rpc, | ||
1501 | .owner = THIS_MODULE, | 1476 | .owner = THIS_MODULE, |
1502 | }; | 1477 | }; |
1503 | 1478 | ||
@@ -1505,7 +1480,9 @@ static struct p9_trans_module p9_unix_trans = { | |||
1505 | .name = "unix", | 1480 | .name = "unix", |
1506 | .maxsize = MAX_SOCK_BUF, | 1481 | .maxsize = MAX_SOCK_BUF, |
1507 | .def = 0, | 1482 | .def = 0, |
1508 | .create = p9_trans_create_unix, | 1483 | .create = p9_fd_create_unix, |
1484 | .close = p9_fd_close, | ||
1485 | .rpc = p9_fd_rpc, | ||
1509 | .owner = THIS_MODULE, | 1486 | .owner = THIS_MODULE, |
1510 | }; | 1487 | }; |
1511 | 1488 | ||
@@ -1513,7 +1490,9 @@ static struct p9_trans_module p9_fd_trans = { | |||
1513 | .name = "fd", | 1490 | .name = "fd", |
1514 | .maxsize = MAX_SOCK_BUF, | 1491 | .maxsize = MAX_SOCK_BUF, |
1515 | .def = 0, | 1492 | .def = 0, |
1516 | .create = p9_trans_create_fd, | 1493 | .create = p9_fd_create, |
1494 | .close = p9_fd_close, | ||
1495 | .rpc = p9_fd_rpc, | ||
1517 | .owner = THIS_MODULE, | 1496 | .owner = THIS_MODULE, |
1518 | }; | 1497 | }; |
1519 | 1498 | ||