diff options
author | Venkateswararao Jujjuri (JV) <jvrao@linux.vnet.ibm.com> | 2011-01-28 20:05:59 -0500 |
---|---|---|
committer | Eric Van Hensbergen <ericvh@gmail.com> | 2011-03-15 10:57:35 -0400 |
commit | bb2f8a55153ec58e66a496224504ac9be919c8f1 (patch) | |
tree | 25a0d7b4d74b42ca6389fa8f4c41c9378ccd75de /net/9p/client.c | |
parent | 6f69c395cefb26ebba2c9bb725296a3a4a9200ec (diff) |
[net/9p] Read side zerocopy changes for 9P2000.L protocol.
Modify p9_client_read() to check the transport preference and act accordingly.
If the preference is P9_TRANS_PREF_PAYLOAD_SEP, send the payload
separately instead of putting it directly on PDU.
Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'net/9p/client.c')
-rw-r--r-- | net/9p/client.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index a848bca9fbf..82079f902f5 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -1270,7 +1270,15 @@ p9_client_read(struct p9_fid *fid, char *data, char __user *udata, u64 offset, | |||
1270 | if (count < rsize) | 1270 | if (count < rsize) |
1271 | rsize = count; | 1271 | rsize = count; |
1272 | 1272 | ||
1273 | req = p9_client_rpc(clnt, P9_TREAD, "dqd", fid->fid, offset, rsize); | 1273 | /* Don't bother zerocopy form small IO (< 1024) */ |
1274 | if (((clnt->trans_mod->pref & P9_TRANS_PREF_PAYLOAD_MASK) == | ||
1275 | P9_TRANS_PREF_PAYLOAD_SEP) && (rsize > 1024)) { | ||
1276 | req = p9_client_rpc(clnt, P9_TREAD, "dqE", fid->fid, offset, | ||
1277 | rsize, data, udata); | ||
1278 | } else { | ||
1279 | req = p9_client_rpc(clnt, P9_TREAD, "dqd", fid->fid, offset, | ||
1280 | rsize); | ||
1281 | } | ||
1274 | if (IS_ERR(req)) { | 1282 | if (IS_ERR(req)) { |
1275 | err = PTR_ERR(req); | 1283 | err = PTR_ERR(req); |
1276 | goto error; | 1284 | goto error; |
@@ -1284,13 +1292,15 @@ p9_client_read(struct p9_fid *fid, char *data, char __user *udata, u64 offset, | |||
1284 | 1292 | ||
1285 | P9_DPRINTK(P9_DEBUG_9P, "<<< RREAD count %d\n", count); | 1293 | P9_DPRINTK(P9_DEBUG_9P, "<<< RREAD count %d\n", count); |
1286 | 1294 | ||
1287 | if (data) { | 1295 | if (!req->tc->pbuf_size) { |
1288 | memmove(data, dataptr, count); | 1296 | if (data) { |
1289 | } else { | 1297 | memmove(data, dataptr, count); |
1290 | err = copy_to_user(udata, dataptr, count); | 1298 | } else { |
1291 | if (err) { | 1299 | err = copy_to_user(udata, dataptr, count); |
1292 | err = -EFAULT; | 1300 | if (err) { |
1293 | goto free_and_error; | 1301 | err = -EFAULT; |
1302 | goto free_and_error; | ||
1303 | } | ||
1294 | } | 1304 | } |
1295 | } | 1305 | } |
1296 | p9_free_req(clnt, req); | 1306 | p9_free_req(clnt, req); |