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

ceph: switch to sock_recvmsg()

... and use ITER_BVEC instead of playing with kmap()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 100803a8 3995d161

+14 -10
+14 -10
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 /*