ceph: switch to sock_recvmsg()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 15 Nov 2015 05:12:48 +0000 (00:12 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 27 Dec 2016 02:35:38 +0000 (21:35 -0500)
... and use ITER_BVEC instead of playing with kmap()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
net/ceph/messenger.c

index 770c527..9e46db7 100644 (file)
@@ -520,7 +520,8 @@ static int ceph_tcp_recvmsg(struct socket *sock, void *buf, size_t len)
        struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
        int r;
 
-       r = kernel_recvmsg(sock, &msg, &iov, 1, len, msg.msg_flags);
+       iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, len);
+       r = sock_recvmsg(sock, &msg, msg.msg_flags);
        if (r == -EAGAIN)
                r = 0;
        return r;
@@ -529,17 +530,20 @@ static int ceph_tcp_recvmsg(struct socket *sock, void *buf, size_t len)
 static int ceph_tcp_recvpage(struct socket *sock, struct page *page,
                     int page_offset, size_t length)
 {
-       void *kaddr;
-       int ret;
+       struct bio_vec bvec = {
+               .bv_page = page,
+               .bv_offset = page_offset,
+               .bv_len = length
+       };
+       struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
+       int r;
 
        BUG_ON(page_offset + length > PAGE_SIZE);
-
-       kaddr = kmap(page);
-       BUG_ON(!kaddr);
-       ret = ceph_tcp_recvmsg(sock, kaddr + page_offset, length);
-       kunmap(page);
-
-       return ret;
+       iov_iter_bvec(&msg.msg_iter, READ | ITER_BVEC, &bvec, 1, length);
+       r = sock_recvmsg(sock, &msg, msg.msg_flags);
+       if (r == -EAGAIN)
+               r = 0;
+       return r;
 }
 
 /*