Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'work.sendmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs sendmsg updates from Al Viro:
"More sendmsg work.

This is a fairly separate isolated stuff (there's a continuation
around lustre, but that one was too late to soak in -next), thus the
separate pull request"

* 'work.sendmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
ncpfs: switch to sock_sendmsg()
ncpfs: don't mess with manually advancing iovec on send
ncpfs: sendmsg does *not* bugger iovec these days
ceph_tcp_sendpage(): use ITER_BVEC sendmsg
afs_send_pages(): use ITER_BVEC
rds: remove dead code
ceph: switch to sock_recvmsg()
usbip_recv(): switch to sock_recvmsg()
iscsi_target: deal with short writes on the tx side
[nbd] pass iov_iter to nbd_xmit()
[nbd] switch sock_xmit() to sock_{send,recv}msg()
[drbd] use sock_sendmsg()

+146 -241
+4 -7
drivers/block/drbd/drbd_main.c
··· 1846 1846 int drbd_send(struct drbd_connection *connection, struct socket *sock, 1847 1847 void *buf, size_t size, unsigned msg_flags) 1848 1848 { 1849 - struct kvec iov; 1849 + struct kvec iov = {.iov_base = buf, .iov_len = size}; 1850 1850 struct msghdr msg; 1851 1851 int rv, sent = 0; 1852 1852 ··· 1855 1855 1856 1856 /* THINK if (signal_pending) return ... ? */ 1857 1857 1858 - iov.iov_base = buf; 1859 - iov.iov_len = size; 1860 - 1861 1858 msg.msg_name = NULL; 1862 1859 msg.msg_namelen = 0; 1863 1860 msg.msg_control = NULL; 1864 1861 msg.msg_controllen = 0; 1865 1862 msg.msg_flags = msg_flags | MSG_NOSIGNAL; 1863 + 1864 + iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size); 1866 1865 1867 1866 if (sock == connection->data.socket) { 1868 1867 rcu_read_lock(); ··· 1870 1871 drbd_update_congested(connection); 1871 1872 } 1872 1873 do { 1873 - rv = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len); 1874 + rv = sock_sendmsg(sock, &msg); 1874 1875 if (rv == -EAGAIN) { 1875 1876 if (we_should_drop_the_connection(connection, sock)) 1876 1877 break; ··· 1884 1885 if (rv < 0) 1885 1886 break; 1886 1887 sent += rv; 1887 - iov.iov_base += rv; 1888 - iov.iov_len -= rv; 1889 1888 } while (sent < size); 1890 1889 1891 1890 if (sock == connection->data.socket)
+31 -45
drivers/block/nbd.c
··· 201 201 /* 202 202 * Send or receive packet. 203 203 */ 204 - static int sock_xmit(struct nbd_device *nbd, int index, int send, void *buf, 205 - int size, int msg_flags) 204 + static int sock_xmit(struct nbd_device *nbd, int index, int send, 205 + struct iov_iter *iter, int msg_flags) 206 206 { 207 207 struct socket *sock = nbd->socks[index]->sock; 208 208 int result; 209 209 struct msghdr msg; 210 - struct kvec iov; 211 210 unsigned long pflags = current->flags; 212 211 213 212 if (unlikely(!sock)) { ··· 216 217 return -EINVAL; 217 218 } 218 219 220 + msg.msg_iter = *iter; 221 + 219 222 current->flags |= PF_MEMALLOC; 220 223 do { 221 224 sock->sk->sk_allocation = GFP_NOIO | __GFP_MEMALLOC; 222 - iov.iov_base = buf; 223 - iov.iov_len = size; 224 225 msg.msg_name = NULL; 225 226 msg.msg_namelen = 0; 226 227 msg.msg_control = NULL; ··· 228 229 msg.msg_flags = msg_flags | MSG_NOSIGNAL; 229 230 230 231 if (send) 231 - result = kernel_sendmsg(sock, &msg, &iov, 1, size); 232 + result = sock_sendmsg(sock, &msg); 232 233 else 233 - result = kernel_recvmsg(sock, &msg, &iov, 1, size, 234 - msg.msg_flags); 234 + result = sock_recvmsg(sock, &msg, msg.msg_flags); 235 235 236 236 if (result <= 0) { 237 237 if (result == 0) 238 238 result = -EPIPE; /* short read */ 239 239 break; 240 240 } 241 - size -= result; 242 - buf += result; 243 - } while (size > 0); 241 + } while (msg_data_left(&msg)); 244 242 245 243 tsk_restore_flags(current, pflags, PF_MEMALLOC); 246 244 247 - return result; 248 - } 249 - 250 - static inline int sock_send_bvec(struct nbd_device *nbd, int index, 251 - struct bio_vec *bvec, int flags) 252 - { 253 - int result; 254 - void *kaddr = kmap(bvec->bv_page); 255 - result = sock_xmit(nbd, index, 1, kaddr + bvec->bv_offset, 256 - bvec->bv_len, flags); 257 - kunmap(bvec->bv_page); 258 245 return result; 259 246 } 260 247 ··· 249 264 { 250 265 struct request *req = blk_mq_rq_from_pdu(cmd); 251 266 int result; 252 - struct nbd_request request; 267 + struct nbd_request request = {.magic = htonl(NBD_REQUEST_MAGIC)}; 268 + struct kvec iov = {.iov_base = &request, .iov_len = sizeof(request)}; 269 + struct iov_iter from; 253 270 unsigned long size = blk_rq_bytes(req); 254 271 struct bio *bio; 255 272 u32 type; 256 273 u32 tag = blk_mq_unique_tag(req); 274 + 275 + iov_iter_kvec(&from, WRITE | ITER_KVEC, &iov, 1, sizeof(request)); 257 276 258 277 switch (req_op(req)) { 259 278 case REQ_OP_DISCARD: ··· 283 294 return -EIO; 284 295 } 285 296 286 - memset(&request, 0, sizeof(request)); 287 - request.magic = htonl(NBD_REQUEST_MAGIC); 288 297 request.type = htonl(type); 289 298 if (type != NBD_CMD_FLUSH) { 290 299 request.from = cpu_to_be64((u64)blk_rq_pos(req) << 9); ··· 293 306 dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n", 294 307 cmd, nbdcmd_to_ascii(type), 295 308 (unsigned long long)blk_rq_pos(req) << 9, blk_rq_bytes(req)); 296 - result = sock_xmit(nbd, index, 1, &request, sizeof(request), 309 + result = sock_xmit(nbd, index, 1, &from, 297 310 (type == NBD_CMD_WRITE) ? MSG_MORE : 0); 298 311 if (result <= 0) { 299 312 dev_err_ratelimited(disk_to_dev(nbd->disk), ··· 316 329 317 330 dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n", 318 331 cmd, bvec.bv_len); 319 - result = sock_send_bvec(nbd, index, &bvec, flags); 332 + iov_iter_bvec(&from, ITER_BVEC | WRITE, 333 + &bvec, 1, bvec.bv_len); 334 + result = sock_xmit(nbd, index, 1, &from, flags); 320 335 if (result <= 0) { 321 336 dev_err(disk_to_dev(nbd->disk), 322 337 "Send data failed (result %d)\n", ··· 339 350 return 0; 340 351 } 341 352 342 - static inline int sock_recv_bvec(struct nbd_device *nbd, int index, 343 - struct bio_vec *bvec) 344 - { 345 - int result; 346 - void *kaddr = kmap(bvec->bv_page); 347 - result = sock_xmit(nbd, index, 0, kaddr + bvec->bv_offset, 348 - bvec->bv_len, MSG_WAITALL); 349 - kunmap(bvec->bv_page); 350 - return result; 351 - } 352 - 353 353 /* NULL returned = something went wrong, inform userspace */ 354 354 static struct nbd_cmd *nbd_read_stat(struct nbd_device *nbd, int index) 355 355 { ··· 348 370 struct request *req = NULL; 349 371 u16 hwq; 350 372 u32 tag; 373 + struct kvec iov = {.iov_base = &reply, .iov_len = sizeof(reply)}; 374 + struct iov_iter to; 351 375 352 376 reply.magic = 0; 353 - result = sock_xmit(nbd, index, 0, &reply, sizeof(reply), MSG_WAITALL); 377 + iov_iter_kvec(&to, READ | ITER_KVEC, &iov, 1, sizeof(reply)); 378 + result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL); 354 379 if (result <= 0) { 355 380 if (!test_bit(NBD_DISCONNECTED, &nbd->runtime_flags) && 356 381 !test_bit(NBD_DISCONNECT_REQUESTED, &nbd->runtime_flags)) ··· 393 412 struct bio_vec bvec; 394 413 395 414 rq_for_each_segment(bvec, req, iter) { 396 - result = sock_recv_bvec(nbd, index, &bvec); 415 + iov_iter_bvec(&to, ITER_BVEC | READ, 416 + &bvec, 1, bvec.bv_len); 417 + result = sock_xmit(nbd, index, 0, &to, MSG_WAITALL); 397 418 if (result <= 0) { 398 419 dev_err(disk_to_dev(nbd->disk), "Receive data failed (result %d)\n", 399 420 result); ··· 624 641 625 642 static void send_disconnects(struct nbd_device *nbd) 626 643 { 627 - struct nbd_request request = {}; 644 + struct nbd_request request = { 645 + .magic = htonl(NBD_REQUEST_MAGIC), 646 + .type = htonl(NBD_CMD_DISC), 647 + }; 648 + struct kvec iov = {.iov_base = &request, .iov_len = sizeof(request)}; 649 + struct iov_iter from; 628 650 int i, ret; 629 651 630 - request.magic = htonl(NBD_REQUEST_MAGIC); 631 - request.type = htonl(NBD_CMD_DISC); 632 - 633 652 for (i = 0; i < nbd->num_connections; i++) { 634 - ret = sock_xmit(nbd, i, 1, &request, sizeof(request), 0); 653 + iov_iter_kvec(&from, WRITE | ITER_KVEC, &iov, 1, sizeof(request)); 654 + ret = sock_xmit(nbd, i, 1, &from, 0); 635 655 if (ret <= 0) 636 656 dev_err(disk_to_dev(nbd->disk), 637 657 "Send disconnect failed %d\n", ret);
+24 -40
drivers/target/iscsi/iscsi_target_util.c
··· 1305 1305 return total_rx; 1306 1306 } 1307 1307 1308 - static int iscsit_do_tx_data( 1309 - struct iscsi_conn *conn, 1310 - struct iscsi_data_count *count) 1311 - { 1312 - int ret, iov_len; 1313 - struct kvec *iov_p; 1314 - struct msghdr msg; 1315 - 1316 - if (!conn || !conn->sock || !conn->conn_ops) 1317 - return -1; 1318 - 1319 - if (count->data_length <= 0) { 1320 - pr_err("Data length is: %d\n", count->data_length); 1321 - return -1; 1322 - } 1323 - 1324 - memset(&msg, 0, sizeof(struct msghdr)); 1325 - 1326 - iov_p = count->iov; 1327 - iov_len = count->iov_count; 1328 - 1329 - ret = kernel_sendmsg(conn->sock, &msg, iov_p, iov_len, 1330 - count->data_length); 1331 - if (ret != count->data_length) { 1332 - pr_err("Unexpected ret: %d send data %d\n", 1333 - ret, count->data_length); 1334 - return -EPIPE; 1335 - } 1336 - pr_debug("ret: %d, sent data: %d\n", ret, count->data_length); 1337 - 1338 - return ret; 1339 - } 1340 - 1341 1308 int rx_data( 1342 1309 struct iscsi_conn *conn, 1343 1310 struct kvec *iov, ··· 1331 1364 int iov_count, 1332 1365 int data) 1333 1366 { 1334 - struct iscsi_data_count c; 1367 + struct msghdr msg; 1368 + int total_tx = 0; 1335 1369 1336 1370 if (!conn || !conn->sock || !conn->conn_ops) 1337 1371 return -1; 1338 1372 1339 - memset(&c, 0, sizeof(struct iscsi_data_count)); 1340 - c.iov = iov; 1341 - c.iov_count = iov_count; 1342 - c.data_length = data; 1343 - c.type = ISCSI_TX_DATA; 1373 + if (data <= 0) { 1374 + pr_err("Data length is: %d\n", data); 1375 + return -1; 1376 + } 1344 1377 1345 - return iscsit_do_tx_data(conn, &c); 1378 + memset(&msg, 0, sizeof(struct msghdr)); 1379 + 1380 + iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, 1381 + iov, iov_count, data); 1382 + 1383 + while (msg_data_left(&msg)) { 1384 + int tx_loop = sock_sendmsg(conn->sock, &msg); 1385 + if (tx_loop <= 0) { 1386 + pr_debug("tx_loop: %d total_tx %d\n", 1387 + tx_loop, total_tx); 1388 + return tx_loop; 1389 + } 1390 + total_tx += tx_loop; 1391 + pr_debug("tx_loop: %d, total_tx: %d, data: %d\n", 1392 + tx_loop, total_tx, data); 1393 + } 1394 + 1395 + return total_tx; 1346 1396 } 1347 1397 1348 1398 void iscsit_collect_login_stats(
+10 -20
drivers/usb/usbip/usbip_common.c
··· 327 327 int usbip_recv(struct socket *sock, void *buf, int size) 328 328 { 329 329 int result; 330 - struct msghdr msg; 331 - struct kvec iov; 330 + struct kvec iov = {.iov_base = buf, .iov_len = size}; 331 + struct msghdr msg = {.msg_flags = MSG_NOSIGNAL}; 332 332 int total = 0; 333 333 334 - /* for blocks of if (usbip_dbg_flag_xmit) */ 335 - char *bp = buf; 336 - int osize = size; 334 + iov_iter_kvec(&msg.msg_iter, READ|ITER_KVEC, &iov, 1, size); 337 335 338 336 usbip_dbg_xmit("enter\n"); 339 337 ··· 342 344 } 343 345 344 346 do { 347 + int sz = msg_data_left(&msg); 345 348 sock->sk->sk_allocation = GFP_NOIO; 346 - iov.iov_base = buf; 347 - iov.iov_len = size; 348 - msg.msg_name = NULL; 349 - msg.msg_namelen = 0; 350 - msg.msg_control = NULL; 351 - msg.msg_controllen = 0; 352 - msg.msg_flags = MSG_NOSIGNAL; 353 349 354 - result = kernel_recvmsg(sock, &msg, &iov, 1, size, MSG_WAITALL); 350 + result = sock_recvmsg(sock, &msg, MSG_WAITALL); 355 351 if (result <= 0) { 356 352 pr_debug("receive sock %p buf %p size %u ret %d total %d\n", 357 - sock, buf, size, result, total); 353 + sock, buf + total, sz, result, total); 358 354 goto err; 359 355 } 360 356 361 - size -= result; 362 - buf += result; 363 357 total += result; 364 - } while (size > 0); 358 + } while (msg_data_left(&msg)); 365 359 366 360 if (usbip_dbg_flag_xmit) { 367 361 if (!in_interrupt()) ··· 362 372 pr_debug("interrupt :"); 363 373 364 374 pr_debug("receiving....\n"); 365 - usbip_dump_buffer(bp, osize); 366 - pr_debug("received, osize %d ret %d size %d total %d\n", 367 - osize, result, size, total); 375 + usbip_dump_buffer(buf, size); 376 + pr_debug("received, osize %d ret %d size %zd total %d\n", 377 + size, result, msg_data_left(&msg), total); 368 378 } 369 379 370 380 return total;
+7 -8
fs/afs/rxrpc.c
··· 260 260 /* 261 261 * attach the data from a bunch of pages on an inode to a call 262 262 */ 263 - static int afs_send_pages(struct afs_call *call, struct msghdr *msg, 264 - struct kvec *iov) 263 + static int afs_send_pages(struct afs_call *call, struct msghdr *msg) 265 264 { 266 265 struct page *pages[8]; 267 266 unsigned count, n, loop, offset, to; ··· 283 284 284 285 loop = 0; 285 286 do { 287 + struct bio_vec bvec = {.bv_page = pages[loop], 288 + .bv_offset = offset}; 286 289 msg->msg_flags = 0; 287 290 to = PAGE_SIZE; 288 291 if (first + loop >= last) 289 292 to = call->last_to; 290 293 else 291 294 msg->msg_flags = MSG_MORE; 292 - iov->iov_base = kmap(pages[loop]) + offset; 293 - iov->iov_len = to - offset; 295 + bvec.bv_len = to - offset; 294 296 offset = 0; 295 297 296 298 _debug("- range %u-%u%s", 297 299 offset, to, msg->msg_flags ? " [more]" : ""); 298 - iov_iter_kvec(&msg->msg_iter, WRITE | ITER_KVEC, 299 - iov, 1, to - offset); 300 + iov_iter_bvec(&msg->msg_iter, WRITE | ITER_BVEC, 301 + &bvec, 1, to - offset); 300 302 301 303 /* have to change the state *before* sending the last 302 304 * packet as RxRPC might give us the reply before it ··· 306 306 call->state = AFS_CALL_AWAIT_REPLY; 307 307 ret = rxrpc_kernel_send_data(afs_socket, call->rxcall, 308 308 msg, to - offset); 309 - kunmap(pages[loop]); 310 309 if (ret < 0) 311 310 break; 312 311 } while (++loop < count); ··· 390 391 goto error_do_abort; 391 392 392 393 if (call->send_pages) { 393 - ret = afs_send_pages(call, &msg, iov); 394 + ret = afs_send_pages(call, &msg); 394 395 if (ret < 0) 395 396 goto error_do_abort; 396 397 }
+41 -70
fs/ncpfs/sock.c
··· 40 40 return kernel_recvmsg(sock, &msg, &iov, 1, size, flags); 41 41 } 42 42 43 - static inline int do_send(struct socket *sock, struct kvec *vec, int count, 44 - int len, unsigned flags) 45 - { 46 - struct msghdr msg = { .msg_flags = flags }; 47 - return kernel_sendmsg(sock, &msg, vec, count, len); 48 - } 49 - 50 43 static int _send(struct socket *sock, const void *buff, int len) 51 44 { 52 - struct kvec vec; 53 - vec.iov_base = (void *) buff; 54 - vec.iov_len = len; 55 - return do_send(sock, &vec, 1, len, 0); 45 + struct msghdr msg = { .msg_flags = 0 }; 46 + struct kvec vec = {.iov_base = (void *)buff, .iov_len = len}; 47 + iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &vec, 1, len); 48 + return sock_sendmsg(sock, &msg); 56 49 } 57 50 58 51 struct ncp_request_reply { ··· 56 63 size_t datalen; 57 64 int result; 58 65 enum { RQ_DONE, RQ_INPROGRESS, RQ_QUEUED, RQ_IDLE, RQ_ABANDONED } status; 59 - struct kvec* tx_ciov; 60 - size_t tx_totallen; 61 - size_t tx_iovlen; 66 + struct iov_iter from; 62 67 struct kvec tx_iov[3]; 63 68 u_int16_t tx_type; 64 69 u_int32_t sign[6]; ··· 196 205 197 206 static int ncpdgram_send(struct socket *sock, struct ncp_request_reply *req) 198 207 { 199 - struct kvec vec[3]; 200 - /* sock_sendmsg updates iov pointers for us :-( */ 201 - memcpy(vec, req->tx_ciov, req->tx_iovlen * sizeof(vec[0])); 202 - return do_send(sock, vec, req->tx_iovlen, 203 - req->tx_totallen, MSG_DONTWAIT); 208 + struct msghdr msg = { .msg_iter = req->from, .msg_flags = MSG_DONTWAIT }; 209 + return sock_sendmsg(sock, &msg); 204 210 } 205 211 206 212 static void __ncptcp_try_send(struct ncp_server *server) 207 213 { 208 214 struct ncp_request_reply *rq; 209 - struct kvec *iov; 210 - struct kvec iovc[3]; 215 + struct msghdr msg = { .msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT }; 211 216 int result; 212 217 213 218 rq = server->tx.creq; 214 219 if (!rq) 215 220 return; 216 221 217 - /* sock_sendmsg updates iov pointers for us :-( */ 218 - memcpy(iovc, rq->tx_ciov, rq->tx_iovlen * sizeof(iov[0])); 219 - result = do_send(server->ncp_sock, iovc, rq->tx_iovlen, 220 - rq->tx_totallen, MSG_NOSIGNAL | MSG_DONTWAIT); 222 + msg.msg_iter = rq->from; 223 + result = sock_sendmsg(server->ncp_sock, &msg); 221 224 222 225 if (result == -EAGAIN) 223 226 return; ··· 221 236 __ncp_abort_request(server, rq, result); 222 237 return; 223 238 } 224 - if (result >= rq->tx_totallen) { 239 + if (!msg_data_left(&msg)) { 225 240 server->rcv.creq = rq; 226 241 server->tx.creq = NULL; 227 242 return; 228 243 } 229 - rq->tx_totallen -= result; 230 - iov = rq->tx_ciov; 231 - while (iov->iov_len <= result) { 232 - result -= iov->iov_len; 233 - iov++; 234 - rq->tx_iovlen--; 235 - } 236 - iov->iov_base += result; 237 - iov->iov_len -= result; 238 - rq->tx_ciov = iov; 244 + rq->from = msg.msg_iter; 239 245 } 240 246 241 247 static inline void ncp_init_header(struct ncp_server *server, struct ncp_request_reply *req, struct ncp_request_header *h) ··· 239 263 240 264 static void ncpdgram_start_request(struct ncp_server *server, struct ncp_request_reply *req) 241 265 { 242 - size_t signlen; 243 - struct ncp_request_header* h; 266 + size_t signlen, len = req->tx_iov[1].iov_len; 267 + struct ncp_request_header *h = req->tx_iov[1].iov_base; 244 268 245 - req->tx_ciov = req->tx_iov + 1; 246 - 247 - h = req->tx_iov[1].iov_base; 248 269 ncp_init_header(server, req, h); 249 - signlen = sign_packet(server, req->tx_iov[1].iov_base + sizeof(struct ncp_request_header) - 1, 250 - req->tx_iov[1].iov_len - sizeof(struct ncp_request_header) + 1, 251 - cpu_to_le32(req->tx_totallen), req->sign); 270 + signlen = sign_packet(server, 271 + req->tx_iov[1].iov_base + sizeof(struct ncp_request_header) - 1, 272 + len - sizeof(struct ncp_request_header) + 1, 273 + cpu_to_le32(len), req->sign); 252 274 if (signlen) { 253 - req->tx_ciov[1].iov_base = req->sign; 254 - req->tx_ciov[1].iov_len = signlen; 255 - req->tx_iovlen += 1; 256 - req->tx_totallen += signlen; 275 + /* NCP over UDP appends signature */ 276 + req->tx_iov[2].iov_base = req->sign; 277 + req->tx_iov[2].iov_len = signlen; 257 278 } 279 + iov_iter_kvec(&req->from, WRITE | ITER_KVEC, 280 + req->tx_iov + 1, signlen ? 2 : 1, len + signlen); 258 281 server->rcv.creq = req; 259 282 server->timeout_last = server->m.time_out; 260 283 server->timeout_retries = server->m.retry_count; ··· 267 292 268 293 static void ncptcp_start_request(struct ncp_server *server, struct ncp_request_reply *req) 269 294 { 270 - size_t signlen; 271 - struct ncp_request_header* h; 295 + size_t signlen, len = req->tx_iov[1].iov_len; 296 + struct ncp_request_header *h = req->tx_iov[1].iov_base; 272 297 273 - req->tx_ciov = req->tx_iov; 274 - h = req->tx_iov[1].iov_base; 275 298 ncp_init_header(server, req, h); 276 299 signlen = sign_packet(server, req->tx_iov[1].iov_base + sizeof(struct ncp_request_header) - 1, 277 - req->tx_iov[1].iov_len - sizeof(struct ncp_request_header) + 1, 278 - cpu_to_be32(req->tx_totallen + 24), req->sign + 4) + 16; 300 + len - sizeof(struct ncp_request_header) + 1, 301 + cpu_to_be32(len + 24), req->sign + 4) + 16; 279 302 280 303 req->sign[0] = htonl(NCP_TCP_XMIT_MAGIC); 281 - req->sign[1] = htonl(req->tx_totallen + signlen); 304 + req->sign[1] = htonl(len + signlen); 282 305 req->sign[2] = htonl(NCP_TCP_XMIT_VERSION); 283 306 req->sign[3] = htonl(req->datalen + 8); 307 + /* NCP over TCP prepends signature */ 284 308 req->tx_iov[0].iov_base = req->sign; 285 309 req->tx_iov[0].iov_len = signlen; 286 - req->tx_iovlen += 1; 287 - req->tx_totallen += signlen; 310 + iov_iter_kvec(&req->from, WRITE | ITER_KVEC, 311 + req->tx_iov, 2, len + signlen); 288 312 289 313 server->tx.creq = req; 290 314 __ncptcp_try_send(server); ··· 338 364 static void info_server(struct ncp_server *server, unsigned int id, const void * data, size_t len) 339 365 { 340 366 if (server->info_sock) { 341 - struct kvec iov[2]; 342 - __be32 hdr[2]; 343 - 344 - hdr[0] = cpu_to_be32(len + 8); 345 - hdr[1] = cpu_to_be32(id); 346 - 347 - iov[0].iov_base = hdr; 348 - iov[0].iov_len = 8; 349 - iov[1].iov_base = (void *) data; 350 - iov[1].iov_len = len; 367 + struct msghdr msg = { .msg_flags = MSG_NOSIGNAL }; 368 + __be32 hdr[2] = {cpu_to_be32(len + 8), cpu_to_be32(id)}; 369 + struct kvec iov[2] = { 370 + {.iov_base = hdr, .iov_len = 8}, 371 + {.iov_base = (void *)data, .iov_len = len}, 372 + }; 351 373 352 - do_send(server->info_sock, iov, 2, len + 8, MSG_NOSIGNAL); 374 + iov_iter_kvec(&msg.msg_iter, ITER_KVEC | WRITE, 375 + iov, 2, len + 8); 376 + 377 + sock_sendmsg(server->info_sock, &msg); 353 378 } 354 379 } 355 380 ··· 684 711 req->datalen = max_reply_size; 685 712 req->tx_iov[1].iov_base = server->packet; 686 713 req->tx_iov[1].iov_len = size; 687 - req->tx_iovlen = 1; 688 - req->tx_totallen = size; 689 714 req->tx_type = *(u_int16_t*)server->packet; 690 715 691 716 result = ncp_add_request(server, req);
+29 -15
net/ceph/messenger.c
··· 520 520 struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; 521 521 int r; 522 522 523 - r = kernel_recvmsg(sock, &msg, &iov, 1, len, msg.msg_flags); 523 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, len); 524 + r = sock_recvmsg(sock, &msg, msg.msg_flags); 524 525 if (r == -EAGAIN) 525 526 r = 0; 526 527 return r; ··· 530 529 static int ceph_tcp_recvpage(struct socket *sock, struct page *page, 531 530 int page_offset, size_t length) 532 531 { 533 - void *kaddr; 534 - int ret; 532 + struct bio_vec bvec = { 533 + .bv_page = page, 534 + .bv_offset = page_offset, 535 + .bv_len = length 536 + }; 537 + struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; 538 + int r; 535 539 536 540 BUG_ON(page_offset + length > PAGE_SIZE); 537 - 538 - kaddr = kmap(page); 539 - BUG_ON(!kaddr); 540 - ret = ceph_tcp_recvmsg(sock, kaddr + page_offset, length); 541 - kunmap(page); 542 - 543 - return ret; 541 + iov_iter_bvec(&msg.msg_iter, READ | ITER_BVEC, &bvec, 1, length); 542 + r = sock_recvmsg(sock, &msg, msg.msg_flags); 543 + if (r == -EAGAIN) 544 + r = 0; 545 + return r; 544 546 } 545 547 546 548 /* ··· 583 579 static int ceph_tcp_sendpage(struct socket *sock, struct page *page, 584 580 int offset, size_t size, bool more) 585 581 { 582 + struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; 583 + struct bio_vec bvec; 586 584 int ret; 587 - struct kvec iov; 588 585 589 586 /* sendpage cannot properly handle pages with page_count == 0, 590 587 * we need to fallback to sendmsg if that's the case */ 591 588 if (page_count(page) >= 1) 592 589 return __ceph_tcp_sendpage(sock, page, offset, size, more); 593 590 594 - iov.iov_base = kmap(page) + offset; 595 - iov.iov_len = size; 596 - ret = ceph_tcp_sendmsg(sock, &iov, 1, size, more); 597 - kunmap(page); 591 + bvec.bv_page = page; 592 + bvec.bv_offset = offset; 593 + bvec.bv_len = size; 594 + 595 + if (more) 596 + msg.msg_flags |= MSG_MORE; 597 + else 598 + msg.msg_flags |= MSG_EOR; /* superfluous, but what the hell */ 599 + 600 + iov_iter_bvec(&msg.msg_iter, WRITE | ITER_BVEC, &bvec, 1, size); 601 + ret = sock_sendmsg(sock, &msg); 602 + if (ret == -EAGAIN) 603 + ret = 0; 598 604 599 605 return ret; 600 606 }
-29
net/rds/page.c
··· 45 45 static 46 46 DEFINE_PER_CPU_SHARED_ALIGNED(struct rds_page_remainder, rds_page_remainders); 47 47 48 - /* 49 - * returns 0 on success or -errno on failure. 50 - * 51 - * We don't have to worry about flush_dcache_page() as this only works 52 - * with private pages. If, say, we were to do directed receive to pinned 53 - * user pages we'd have to worry more about cache coherence. (Though 54 - * the flush_dcache_page() in get_user_pages() would probably be enough). 55 - */ 56 - int rds_page_copy_user(struct page *page, unsigned long offset, 57 - void __user *ptr, unsigned long bytes, 58 - int to_user) 59 - { 60 - unsigned long ret; 61 - void *addr; 62 - 63 - addr = kmap(page); 64 - if (to_user) { 65 - rds_stats_add(s_copy_to_user, bytes); 66 - ret = copy_to_user(ptr, addr + offset, bytes); 67 - } else { 68 - rds_stats_add(s_copy_from_user, bytes); 69 - ret = copy_from_user(addr + offset, ptr, bytes); 70 - } 71 - kunmap(page); 72 - 73 - return ret ? -EFAULT : 0; 74 - } 75 - EXPORT_SYMBOL_GPL(rds_page_copy_user); 76 - 77 48 /** 78 49 * rds_page_remainder_alloc - build up regions of a message. 79 50 *
-7
net/rds/rds.h
··· 798 798 /* page.c */ 799 799 int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes, 800 800 gfp_t gfp); 801 - int rds_page_copy_user(struct page *page, unsigned long offset, 802 - void __user *ptr, unsigned long bytes, 803 - int to_user); 804 - #define rds_page_copy_to_user(page, offset, ptr, bytes) \ 805 - rds_page_copy_user(page, offset, ptr, bytes, 1) 806 - #define rds_page_copy_from_user(page, offset, ptr, bytes) \ 807 - rds_page_copy_user(page, offset, ptr, bytes, 0) 808 801 void rds_page_exit(void); 809 802 810 803 /* recv.c */