提交 d63d271c 编写于 作者: A Al Viro

smc: switch to sock_recvmsg()

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 7edffd25
...@@ -35,7 +35,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, ...@@ -35,7 +35,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
struct smc_clc_msg_hdr *clcm = buf; struct smc_clc_msg_hdr *clcm = buf;
struct msghdr msg = {NULL, 0}; struct msghdr msg = {NULL, 0};
int reason_code = 0; int reason_code = 0;
struct kvec vec; struct kvec vec = {buf, buflen};
int len, datlen; int len, datlen;
int krflags; int krflags;
...@@ -43,12 +43,15 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, ...@@ -43,12 +43,15 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
* so we don't consume any subsequent CLC message or payload data * so we don't consume any subsequent CLC message or payload data
* in the TCP byte stream * in the TCP byte stream
*/ */
vec.iov_base = buf; /*
vec.iov_len = buflen; * Caller must make sure that buflen is no less than
* sizeof(struct smc_clc_msg_hdr)
*/
krflags = MSG_PEEK | MSG_WAITALL; krflags = MSG_PEEK | MSG_WAITALL;
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1,
sizeof(struct smc_clc_msg_hdr), krflags); sizeof(struct smc_clc_msg_hdr));
len = sock_recvmsg(smc->clcsock, &msg, krflags);
if (signal_pending(current)) { if (signal_pending(current)) {
reason_code = -EINTR; reason_code = -EINTR;
clc_sk->sk_err = EINTR; clc_sk->sk_err = EINTR;
...@@ -83,12 +86,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, ...@@ -83,12 +86,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen,
} }
/* receive the complete CLC message */ /* receive the complete CLC message */
vec.iov_base = buf;
vec.iov_len = buflen;
memset(&msg, 0, sizeof(struct msghdr)); memset(&msg, 0, sizeof(struct msghdr));
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen);
krflags = MSG_WAITALL; krflags = MSG_WAITALL;
smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, datlen, krflags); len = sock_recvmsg(smc->clcsock, &msg, krflags);
if (len < datlen) { if (len < datlen) {
smc->sk.sk_err = EPROTO; smc->sk.sk_err = EPROTO;
reason_code = -EPROTO; reason_code = -EPROTO;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册