diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-11-12 04:51:19 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-12-26 21:21:23 -0500 |
commit | c1696cab700588f8493df7b51e096abf5bfb1d40 (patch) | |
tree | 1ae3b1243c009c158a586f16ac3f19b566b6e4a4 /drivers/block/nbd.c | |
parent | 79ab80beb792fc56141ca9bc5675b2109b729955 (diff) | |
download | lwn-c1696cab700588f8493df7b51e096abf5bfb1d40.tar.gz lwn-c1696cab700588f8493df7b51e096abf5bfb1d40.zip |
[nbd] switch sock_xmit() to sock_{send,recv}msg()
Step 1 - don't reinintialize ->msg_iter on each iteration.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/block/nbd.c')
-rw-r--r-- | drivers/block/nbd.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 38c576f76d36..8e63caecdd00 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -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); |