diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2011-08-16 01:20:10 -0400 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@gmail.com> | 2011-10-24 12:13:11 -0400 |
commit | abfa034e4b8ed0046fa589769e9840af645bc4ba (patch) | |
tree | 146195e891a2fd63e3fc91f803547abb904b2087 /net/9p/protocol.c | |
parent | c3b92c8787367a8bb53d57d9789b558f1295cc96 (diff) |
fs/9p: Update zero-copy implementation in 9p
* remove lot of update to different data structure
* add a seperate callback for zero copy request.
* above makes non zero copy code path simpler
* remove conditionalizing TREAD/TREADDIR/TWRITE in the zero copy path
* Fix the dotu p9_check_errors with zero copy. Add sufficient doc around
* Add support for both in and output buffers in zero copy callback
* pin and unpin pages in the same context
* use helpers instead of defining page offset and rest of page ourself
* Fix mem leak in p9_check_errors
* Remove 'E' and 'F' in p9pdu_vwritef
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/9p/protocol.c')
-rw-r--r-- | net/9p/protocol.c | 46 |
1 files changed, 1 insertions, 45 deletions
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index df58375ea6b3..b7d4e8aa5383 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c | |||
@@ -81,7 +81,7 @@ void p9stat_free(struct p9_wstat *stbuf) | |||
81 | } | 81 | } |
82 | EXPORT_SYMBOL(p9stat_free); | 82 | EXPORT_SYMBOL(p9stat_free); |
83 | 83 | ||
84 | static size_t pdu_read(struct p9_fcall *pdu, void *data, size_t size) | 84 | size_t pdu_read(struct p9_fcall *pdu, void *data, size_t size) |
85 | { | 85 | { |
86 | size_t len = min(pdu->size - pdu->offset, size); | 86 | size_t len = min(pdu->size - pdu->offset, size); |
87 | memcpy(data, &pdu->sdata[pdu->offset], len); | 87 | memcpy(data, &pdu->sdata[pdu->offset], len); |
@@ -108,26 +108,6 @@ pdu_write_u(struct p9_fcall *pdu, const char __user *udata, size_t size) | |||
108 | return size - len; | 108 | return size - len; |
109 | } | 109 | } |
110 | 110 | ||
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 | /* | 111 | /* |
132 | b - int8_t | 112 | b - int8_t |
133 | w - int16_t | 113 | w - int16_t |
@@ -459,26 +439,6 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
459 | errcode = -EFAULT; | 439 | errcode = -EFAULT; |
460 | } | 440 | } |
461 | break; | 441 | 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':{ | 442 | case 'U':{ |
483 | int32_t count = va_arg(ap, int32_t); | 443 | int32_t count = va_arg(ap, int32_t); |
484 | const char __user *udata = | 444 | const char __user *udata = |
@@ -637,10 +597,6 @@ void p9pdu_reset(struct p9_fcall *pdu) | |||
637 | { | 597 | { |
638 | pdu->offset = 0; | 598 | pdu->offset = 0; |
639 | pdu->size = 0; | 599 | pdu->size = 0; |
640 | pdu->private = NULL; | ||
641 | pdu->pubuf = NULL; | ||
642 | pdu->pkbuf = NULL; | ||
643 | pdu->pbuf_size = 0; | ||
644 | } | 600 | } |
645 | 601 | ||
646 | int p9dirent_read(char *buf, int len, struct p9_dirent *dirent, | 602 | int p9dirent_read(char *buf, int len, struct p9_dirent *dirent, |