[nbd] switch sock_xmit() to sock_{send,recv}msg()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 12 Nov 2015 09:51:19 +0000 (04:51 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 27 Dec 2016 02:21:23 +0000 (21:21 -0500)
Step 1 - don't reinintialize ->msg_iter on each iteration.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/block/nbd.c

index 38c576f76d36fca1f43bc37b6c733ba6bb222849..8e63caecdd00d8ec3a6d7c5c6e1acaebfdeca256 100644 (file)
@@ -215,7 +215,7 @@ static int sock_xmit(struct nbd_device *nbd, int index, int send, void *buf,
        struct socket *sock = nbd->socks[index]->sock;
        int result;
        struct msghdr msg;
-       struct kvec iov;
+       struct kvec iov = {.iov_base = buf, .iov_len = size};
        unsigned long pflags = current->flags;
 
        if (unlikely(!sock)) {
@@ -225,11 +225,12 @@ static int sock_xmit(struct nbd_device *nbd, int index, int send, void *buf,
                return -EINVAL;
        }
 
+       iov_iter_kvec(&msg.msg_iter, (send ? WRITE : READ) | ITER_KVEC,
+                     &iov, 1, size);
+
        current->flags |= PF_MEMALLOC;
        do {
                sock->sk->sk_allocation = GFP_NOIO | __GFP_MEMALLOC;
-               iov.iov_base = buf;
-               iov.iov_len = size;
                msg.msg_name = NULL;
                msg.msg_namelen = 0;
                msg.msg_control = NULL;
@@ -237,19 +238,16 @@ static int sock_xmit(struct nbd_device *nbd, int index, int send, void *buf,
                msg.msg_flags = msg_flags | MSG_NOSIGNAL;
 
                if (send)
-                       result = kernel_sendmsg(sock, &msg, &iov, 1, size);
+                       result = sock_sendmsg(sock, &msg);
                else
-                       result = kernel_recvmsg(sock, &msg, &iov, 1, size,
-                                               msg.msg_flags);
+                       result = sock_recvmsg(sock, &msg, msg.msg_flags);
 
                if (result <= 0) {
                        if (result == 0)
                                result = -EPIPE; /* short read */
                        break;
                }
-               size -= result;
-               buf += result;
-       } while (size > 0);
+       } while (msg_data_left(&msg));
 
        tsk_restore_flags(current, pflags, PF_MEMALLOC);