diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-09-20 20:21:22 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-12-02 20:38:09 -0500 |
commit | d63d271ce2b5ce6b4efeefd817b60e6a758083a5 (patch) | |
tree | b90d29fb28304c793c217ce931fa206906df853d | |
parent | 7edffd25be336ecc9e82d36ef53f5c9ab552e01f (diff) |
smc: switch to sock_recvmsg()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | net/smc/smc_clc.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c index 1800e16b2a02..511548085d16 100644 --- a/net/smc/smc_clc.c +++ b/net/smc/smc_clc.c | |||
@@ -35,7 +35,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
35 | struct smc_clc_msg_hdr *clcm = buf; | 35 | struct smc_clc_msg_hdr *clcm = buf; |
36 | struct msghdr msg = {NULL, 0}; | 36 | struct msghdr msg = {NULL, 0}; |
37 | int reason_code = 0; | 37 | int reason_code = 0; |
38 | struct kvec vec; | 38 | struct kvec vec = {buf, buflen}; |
39 | int len, datlen; | 39 | int len, datlen; |
40 | int krflags; | 40 | int krflags; |
41 | 41 | ||
@@ -43,12 +43,15 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
43 | * so we don't consume any subsequent CLC message or payload data | 43 | * so we don't consume any subsequent CLC message or payload data |
44 | * in the TCP byte stream | 44 | * in the TCP byte stream |
45 | */ | 45 | */ |
46 | vec.iov_base = buf; | 46 | /* |
47 | vec.iov_len = buflen; | 47 | * Caller must make sure that buflen is no less than |
48 | * sizeof(struct smc_clc_msg_hdr) | ||
49 | */ | ||
48 | krflags = MSG_PEEK | MSG_WAITALL; | 50 | krflags = MSG_PEEK | MSG_WAITALL; |
49 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; | 51 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; |
50 | len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, | 52 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, |
51 | sizeof(struct smc_clc_msg_hdr), krflags); | 53 | sizeof(struct smc_clc_msg_hdr)); |
54 | len = sock_recvmsg(smc->clcsock, &msg, krflags); | ||
52 | if (signal_pending(current)) { | 55 | if (signal_pending(current)) { |
53 | reason_code = -EINTR; | 56 | reason_code = -EINTR; |
54 | clc_sk->sk_err = EINTR; | 57 | clc_sk->sk_err = EINTR; |
@@ -83,12 +86,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
83 | } | 86 | } |
84 | 87 | ||
85 | /* receive the complete CLC message */ | 88 | /* receive the complete CLC message */ |
86 | vec.iov_base = buf; | ||
87 | vec.iov_len = buflen; | ||
88 | memset(&msg, 0, sizeof(struct msghdr)); | 89 | memset(&msg, 0, sizeof(struct msghdr)); |
90 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen); | ||
89 | krflags = MSG_WAITALL; | 91 | krflags = MSG_WAITALL; |
90 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; | 92 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; |
91 | len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, datlen, krflags); | 93 | len = sock_recvmsg(smc->clcsock, &msg, krflags); |
92 | if (len < datlen) { | 94 | if (len < datlen) { |
93 | smc->sk.sk_err = EPROTO; | 95 | smc->sk.sk_err = EPROTO; |
94 | reason_code = -EPROTO; | 96 | reason_code = -EPROTO; |