diff options
Diffstat (limited to 'net/9p/protocol.c')
-rw-r--r-- | net/9p/protocol.c | 99 |
1 files changed, 13 insertions, 86 deletions
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index df58375ea6b..55e10a96c90 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c | |||
@@ -37,40 +37,11 @@ | |||
37 | #include <net/9p/client.h> | 37 | #include <net/9p/client.h> |
38 | #include "protocol.h" | 38 | #include "protocol.h" |
39 | 39 | ||
40 | #include <trace/events/9p.h> | ||
41 | |||
40 | static int | 42 | static int |
41 | p9pdu_writef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...); | 43 | p9pdu_writef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...); |
42 | 44 | ||
43 | #ifdef CONFIG_NET_9P_DEBUG | ||
44 | void | ||
45 | p9pdu_dump(int way, struct p9_fcall *pdu) | ||
46 | { | ||
47 | int len = pdu->size; | ||
48 | |||
49 | if ((p9_debug_level & P9_DEBUG_VPKT) != P9_DEBUG_VPKT) { | ||
50 | if ((p9_debug_level & P9_DEBUG_PKT) == P9_DEBUG_PKT) { | ||
51 | if (len > 32) | ||
52 | len = 32; | ||
53 | } else { | ||
54 | /* shouldn't happen */ | ||
55 | return; | ||
56 | } | ||
57 | } | ||
58 | |||
59 | if (way) | ||
60 | print_hex_dump_bytes("[9P] ", DUMP_PREFIX_OFFSET, pdu->sdata, | ||
61 | len); | ||
62 | else | ||
63 | print_hex_dump_bytes("]9P[ ", DUMP_PREFIX_OFFSET, pdu->sdata, | ||
64 | len); | ||
65 | } | ||
66 | #else | ||
67 | void | ||
68 | p9pdu_dump(int way, struct p9_fcall *pdu) | ||
69 | { | ||
70 | } | ||
71 | #endif | ||
72 | EXPORT_SYMBOL(p9pdu_dump); | ||
73 | |||
74 | void p9stat_free(struct p9_wstat *stbuf) | 45 | void p9stat_free(struct p9_wstat *stbuf) |
75 | { | 46 | { |
76 | kfree(stbuf->name); | 47 | kfree(stbuf->name); |
@@ -81,7 +52,7 @@ void p9stat_free(struct p9_wstat *stbuf) | |||
81 | } | 52 | } |
82 | EXPORT_SYMBOL(p9stat_free); | 53 | EXPORT_SYMBOL(p9stat_free); |
83 | 54 | ||
84 | static size_t pdu_read(struct p9_fcall *pdu, void *data, size_t size) | 55 | size_t pdu_read(struct p9_fcall *pdu, void *data, size_t size) |
85 | { | 56 | { |
86 | size_t len = min(pdu->size - pdu->offset, size); | 57 | size_t len = min(pdu->size - pdu->offset, size); |
87 | memcpy(data, &pdu->sdata[pdu->offset], len); | 58 | memcpy(data, &pdu->sdata[pdu->offset], len); |
@@ -108,26 +79,6 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size) | |||
108 | return size - len; | 79 | return size - len; |
109 | } | 80 | } |
110 | 81 | ||
111 | static size_t | ||
112 | pdu_write_urw(struct p9_fcall *pdu, const char *kdata, const char __user *udata, | ||
113 | size_t size) | ||
114 | { | ||
115 | BUG_ON(pdu->size > P9_IOHDRSZ); | ||
116 | pdu->pubuf = (char __user *)udata; | ||
117 | pdu->pkbuf = (char *)kdata; | ||
118 | pdu->pbuf_size = size; | ||
119 | return 0; | ||
120 | } | ||
121 | |||
122 | static size_t | ||
123 | pdu_write_readdir(struct p9_fcall *pdu, const char *kdata, size_t size) | ||
124 | { | ||
125 | BUG_ON(pdu->size > P9_READDIRHDRSZ); | ||
126 | pdu->pkbuf = (char *)kdata; | ||
127 | pdu->pbuf_size = size; | ||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | /* | 82 | /* |
132 | b - int8_t | 83 | b - int8_t |
133 | w - int16_t | 84 | w - int16_t |
@@ -459,26 +410,6 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
459 | errcode = -EFAULT; | 410 | errcode = -EFAULT; |
460 | } | 411 | } |
461 | break; | 412 | break; |
462 | case 'E':{ | ||
463 | int32_t cnt = va_arg(ap, int32_t); | ||
464 | const char *k = va_arg(ap, const void *); | ||
465 | const char __user *u = va_arg(ap, | ||
466 | const void __user *); | ||
467 | errcode = p9pdu_writef(pdu, proto_version, "d", | ||
468 | cnt); | ||
469 | if (!errcode && pdu_write_urw(pdu, k, u, cnt)) | ||
470 | errcode = -EFAULT; | ||
471 | } | ||
472 | break; | ||
473 | case 'F':{ | ||
474 | int32_t cnt = va_arg(ap, int32_t); | ||
475 | const char *k = va_arg(ap, const void *); | ||
476 | errcode = p9pdu_writef(pdu, proto_version, "d", | ||
477 | cnt); | ||
478 | if (!errcode && pdu_write_readdir(pdu, k, cnt)) | ||
479 | errcode = -EFAULT; | ||
480 | } | ||
481 | break; | ||
482 | case 'U':{ | 413 | case 'U':{ |
483 | int32_t count = va_arg(ap, int32_t); | 414 | int32_t count = va_arg(ap, int32_t); |
484 | const char __user *udata = | 415 | const char __user *udata = |
@@ -591,7 +522,7 @@ p9pdu_writef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...) | |||
591 | return ret; | 522 | return ret; |
592 | } | 523 | } |
593 | 524 | ||
594 | int p9stat_read(char *buf, int len, struct p9_wstat *st, int proto_version) | 525 | int p9stat_read(struct p9_client *clnt, char *buf, int len, struct p9_wstat *st) |
595 | { | 526 | { |
596 | struct p9_fcall fake_pdu; | 527 | struct p9_fcall fake_pdu; |
597 | int ret; | 528 | int ret; |
@@ -601,10 +532,10 @@ int p9stat_read(char *buf, int len, struct p9_wstat *st, int proto_version) | |||
601 | fake_pdu.sdata = buf; | 532 | fake_pdu.sdata = buf; |
602 | fake_pdu.offset = 0; | 533 | fake_pdu.offset = 0; |
603 | 534 | ||
604 | ret = p9pdu_readf(&fake_pdu, proto_version, "S", st); | 535 | ret = p9pdu_readf(&fake_pdu, clnt->proto_version, "S", st); |
605 | if (ret) { | 536 | if (ret) { |
606 | P9_DPRINTK(P9_DEBUG_9P, "<<< p9stat_read failed: %d\n", ret); | 537 | P9_DPRINTK(P9_DEBUG_9P, "<<< p9stat_read failed: %d\n", ret); |
607 | P9_DUMP_PKT(0, &fake_pdu); | 538 | trace_9p_protocol_dump(clnt, &fake_pdu); |
608 | } | 539 | } |
609 | 540 | ||
610 | return ret; | 541 | return ret; |
@@ -617,7 +548,7 @@ int p9pdu_prepare(struct p9_fcall *pdu, int16_t tag, int8_t type) | |||
617 | return p9pdu_writef(pdu, 0, "dbw", 0, type, tag); | 548 | return p9pdu_writef(pdu, 0, "dbw", 0, type, tag); |
618 | } | 549 | } |
619 | 550 | ||
620 | int p9pdu_finalize(struct p9_fcall *pdu) | 551 | int p9pdu_finalize(struct p9_client *clnt, struct p9_fcall *pdu) |
621 | { | 552 | { |
622 | int size = pdu->size; | 553 | int size = pdu->size; |
623 | int err; | 554 | int err; |
@@ -626,7 +557,7 @@ int p9pdu_finalize(struct p9_fcall *pdu) | |||
626 | err = p9pdu_writef(pdu, 0, "d", size); | 557 | err = p9pdu_writef(pdu, 0, "d", size); |
627 | pdu->size = size; | 558 | pdu->size = size; |
628 | 559 | ||
629 | P9_DUMP_PKT(0, pdu); | 560 | trace_9p_protocol_dump(clnt, pdu); |
630 | P9_DPRINTK(P9_DEBUG_9P, ">>> size=%d type: %d tag: %d\n", pdu->size, | 561 | P9_DPRINTK(P9_DEBUG_9P, ">>> size=%d type: %d tag: %d\n", pdu->size, |
631 | pdu->id, pdu->tag); | 562 | pdu->id, pdu->tag); |
632 | 563 | ||
@@ -637,14 +568,10 @@ void p9pdu_reset(struct p9_fcall *pdu) | |||
637 | { | 568 | { |
638 | pdu->offset = 0; | 569 | pdu->offset = 0; |
639 | pdu->size = 0; | 570 | pdu->size = 0; |
640 | pdu->private = NULL; | ||
641 | pdu->pubuf = NULL; | ||
642 | pdu->pkbuf = NULL; | ||
643 | pdu->pbuf_size = 0; | ||
644 | } | 571 | } |
645 | 572 | ||
646 | int p9dirent_read(char *buf, int len, struct p9_dirent *dirent, | 573 | int p9dirent_read(struct p9_client *clnt, char *buf, int len, |
647 | int proto_version) | 574 | struct p9_dirent *dirent) |
648 | { | 575 | { |
649 | struct p9_fcall fake_pdu; | 576 | struct p9_fcall fake_pdu; |
650 | int ret; | 577 | int ret; |
@@ -655,11 +582,11 @@ int p9dirent_read(char *buf, int len, struct p9_dirent *dirent, | |||
655 | fake_pdu.sdata = buf; | 582 | fake_pdu.sdata = buf; |
656 | fake_pdu.offset = 0; | 583 | fake_pdu.offset = 0; |
657 | 584 | ||
658 | ret = p9pdu_readf(&fake_pdu, proto_version, "Qqbs", &dirent->qid, | 585 | ret = p9pdu_readf(&fake_pdu, clnt->proto_version, "Qqbs", &dirent->qid, |
659 | &dirent->d_off, &dirent->d_type, &nameptr); | 586 | &dirent->d_off, &dirent->d_type, &nameptr); |
660 | if (ret) { | 587 | if (ret) { |
661 | P9_DPRINTK(P9_DEBUG_9P, "<<< p9dirent_read failed: %d\n", ret); | 588 | P9_DPRINTK(P9_DEBUG_9P, "<<< p9dirent_read failed: %d\n", ret); |
662 | P9_DUMP_PKT(1, &fake_pdu); | 589 | trace_9p_protocol_dump(clnt, &fake_pdu); |
663 | goto out; | 590 | goto out; |
664 | } | 591 | } |
665 | 592 | ||