Commit 1ed2d76e authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'work.sock_recvmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull kern_recvmsg reduction from Al Viro:
 "kernel_recvmsg() is a set_fs()-using wrapper for sock_recvmsg(). In
  all but one case that is not needed - use of ITER_KVEC for ->msg_iter
  takes care of the data and does not care about set_fs(). The only
  exception is svc_udp_recvfrom() where we want cmsg to be store into
  kernel object; everything else can just use sock_recvmsg() and be done
  with that.

  A followup converting svc_udp_recvfrom() away from set_fs() (and
  killing kernel_recvmsg() off) is *NOT* in here - I'd like to hear what
  netdev folks think of the approach proposed in that followup)"

* 'work.sock_recvmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  tipc: switch to sock_recvmsg()
  smc: switch to sock_recvmsg()
  ipvs: switch to sock_recvmsg()
  mISDN: switch to sock_recvmsg()
  drbd: switch to sock_recvmsg()
  lustre lnet_sock_read(): switch to sock_recvmsg()
  cfs2: switch to sock_recvmsg()
  ncpfs: switch to sock_recvmsg()
  dlm: switch to sock_recvmsg()
  svc_recvfrom(): switch to sock_recvmsg()
parents 8b0fdf63 bc480273
...@@ -1847,7 +1847,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock, ...@@ -1847,7 +1847,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,
void *buf, size_t size, unsigned msg_flags) void *buf, size_t size, unsigned msg_flags)
{ {
struct kvec iov = {.iov_base = buf, .iov_len = size}; struct kvec iov = {.iov_base = buf, .iov_len = size};
struct msghdr msg; struct msghdr msg = {.msg_flags = msg_flags | MSG_NOSIGNAL};
int rv, sent = 0; int rv, sent = 0;
if (!sock) if (!sock)
...@@ -1855,12 +1855,6 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock, ...@@ -1855,12 +1855,6 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,
/* THINK if (signal_pending) return ... ? */ /* THINK if (signal_pending) return ... ? */
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_flags = msg_flags | MSG_NOSIGNAL;
iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size); iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size);
if (sock == connection->data.socket) { if (sock == connection->data.socket) {
......
...@@ -516,7 +516,8 @@ static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flag ...@@ -516,7 +516,8 @@ static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flag
struct msghdr msg = { struct msghdr msg = {
.msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL) .msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL)
}; };
return kernel_recvmsg(sock, &msg, &iov, 1, size, msg.msg_flags); iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, size);
return sock_recvmsg(sock, &msg, msg.msg_flags);
} }
static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size)
......
...@@ -645,8 +645,10 @@ l1oip_socket_thread(void *data) ...@@ -645,8 +645,10 @@ l1oip_socket_thread(void *data)
{ {
struct l1oip *hc = (struct l1oip *)data; struct l1oip *hc = (struct l1oip *)data;
int ret = 0; int ret = 0;
struct msghdr msg;
struct sockaddr_in sin_rx; struct sockaddr_in sin_rx;
struct kvec iov;
struct msghdr msg = {.msg_name = &sin_rx,
.msg_namelen = sizeof(sin_rx)};
unsigned char *recvbuf; unsigned char *recvbuf;
size_t recvbuf_size = 1500; size_t recvbuf_size = 1500;
int recvlen; int recvlen;
...@@ -661,6 +663,9 @@ l1oip_socket_thread(void *data) ...@@ -661,6 +663,9 @@ l1oip_socket_thread(void *data)
goto fail; goto fail;
} }
iov.iov_base = recvbuf;
iov.iov_len = recvbuf_size;
/* make daemon */ /* make daemon */
allow_signal(SIGTERM); allow_signal(SIGTERM);
...@@ -697,12 +702,6 @@ l1oip_socket_thread(void *data) ...@@ -697,12 +702,6 @@ l1oip_socket_thread(void *data)
goto fail; goto fail;
} }
/* build receive message */
msg.msg_name = &sin_rx;
msg.msg_namelen = sizeof(sin_rx);
msg.msg_control = NULL;
msg.msg_controllen = 0;
/* build send message */ /* build send message */
hc->sendmsg.msg_name = &hc->sin_remote; hc->sendmsg.msg_name = &hc->sin_remote;
hc->sendmsg.msg_namelen = sizeof(hc->sin_remote); hc->sendmsg.msg_namelen = sizeof(hc->sin_remote);
...@@ -719,12 +718,9 @@ l1oip_socket_thread(void *data) ...@@ -719,12 +718,9 @@ l1oip_socket_thread(void *data)
printk(KERN_DEBUG "%s: socket created and open\n", printk(KERN_DEBUG "%s: socket created and open\n",
__func__); __func__);
while (!signal_pending(current)) { while (!signal_pending(current)) {
struct kvec iov = { iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1,
.iov_base = recvbuf, recvbuf_size);
.iov_len = recvbuf_size, recvlen = sock_recvmsg(socket, &msg, 0);
};
recvlen = kernel_recvmsg(socket, &msg, &iov, 1,
recvbuf_size, 0);
if (recvlen > 0) { if (recvlen > 0) {
l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen); l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);
} else { } else {
......
...@@ -314,19 +314,20 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) ...@@ -314,19 +314,20 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout)
long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC); long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC);
unsigned long then; unsigned long then;
struct timeval tv; struct timeval tv;
struct kvec iov = {
.iov_base = buffer,
.iov_len = nob
};
struct msghdr msg = {
.msg_flags = 0
};
LASSERT(nob > 0); LASSERT(nob > 0);
LASSERT(jiffies_left > 0); LASSERT(jiffies_left > 0);
for (;;) { iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, nob);
struct kvec iov = {
.iov_base = buffer,
.iov_len = nob
};
struct msghdr msg = {
.msg_flags = 0
};
for (;;) {
/* Set receive timeout to remaining time */ /* Set receive timeout to remaining time */
jiffies_to_timeval(jiffies_left, &tv); jiffies_to_timeval(jiffies_left, &tv);
rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
...@@ -338,7 +339,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) ...@@ -338,7 +339,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout)
} }
then = jiffies; then = jiffies;
rc = kernel_recvmsg(sock, &msg, &iov, 1, nob, 0); rc = sock_recvmsg(sock, &msg, 0);
jiffies_left -= jiffies - then; jiffies_left -= jiffies - then;
if (rc < 0) if (rc < 0)
...@@ -347,10 +348,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) ...@@ -347,10 +348,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout)
if (!rc) if (!rc)
return -ECONNRESET; return -ECONNRESET;
buffer = ((char *)buffer) + rc; if (!msg_data_left(&msg))
nob -= rc;
if (!nob)
return 0; return 0;
if (jiffies_left <= 0) if (jiffies_left <= 0)
......
...@@ -675,9 +675,9 @@ static int receive_from_sock(struct connection *con) ...@@ -675,9 +675,9 @@ static int receive_from_sock(struct connection *con)
nvec = 2; nvec = 2;
} }
len = iov[0].iov_len + iov[1].iov_len; len = iov[0].iov_len + iov[1].iov_len;
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nvec, len);
r = ret = kernel_recvmsg(con->sock, &msg, iov, nvec, len, r = ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT | MSG_NOSIGNAL);
MSG_DONTWAIT | MSG_NOSIGNAL);
if (ret <= 0) if (ret <= 0)
goto out_close; goto out_close;
else if (ret == len) else if (ret == len)
......
...@@ -39,7 +39,8 @@ static int _recv(struct socket *sock, void *buf, int size, unsigned flags) ...@@ -39,7 +39,8 @@ static int _recv(struct socket *sock, void *buf, int size, unsigned flags)
{ {
struct msghdr msg = {NULL, }; struct msghdr msg = {NULL, };
struct kvec iov = {buf, size}; struct kvec iov = {buf, size};
return kernel_recvmsg(sock, &msg, &iov, 1, size, flags); iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, size);
return sock_recvmsg(sock, &msg, flags);
} }
static int _send(struct socket *sock, const void *buff, int len) static int _send(struct socket *sock, const void *buff, int len)
......
...@@ -918,7 +918,8 @@ static int o2net_recv_tcp_msg(struct socket *sock, void *data, size_t len) ...@@ -918,7 +918,8 @@ static int o2net_recv_tcp_msg(struct socket *sock, void *data, size_t len)
{ {
struct kvec vec = { .iov_len = len, .iov_base = data, }; struct kvec vec = { .iov_len = len, .iov_base = data, };
struct msghdr msg = { .msg_flags = MSG_DONTWAIT, }; struct msghdr msg = { .msg_flags = MSG_DONTWAIT, };
return kernel_recvmsg(sock, &msg, &vec, 1, len, msg.msg_flags); iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, len);
return sock_recvmsg(sock, &msg, MSG_DONTWAIT);
} }
static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec, static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec,
......
...@@ -1636,17 +1636,14 @@ static int ...@@ -1636,17 +1636,14 @@ static int
ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen) ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen)
{ {
struct msghdr msg = {NULL,}; struct msghdr msg = {NULL,};
struct kvec iov; struct kvec iov = {buffer, buflen};
int len; int len;
EnterFunction(7); EnterFunction(7);
/* Receive a packet */ /* Receive a packet */
iov.iov_base = buffer; iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, buflen);
iov.iov_len = (size_t)buflen; len = sock_recvmsg(sock, &msg, MSG_DONTWAIT);
len = kernel_recvmsg(sock, &msg, &iov, 1, buflen, MSG_DONTWAIT);
if (len < 0) if (len < 0)
return len; return len;
......
...@@ -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;
......
...@@ -338,8 +338,8 @@ static int svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, ...@@ -338,8 +338,8 @@ static int svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr,
rqstp->rq_xprt_hlen = 0; rqstp->rq_xprt_hlen = 0;
clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags);
len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen, iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nr, buflen);
msg.msg_flags); len = sock_recvmsg(svsk->sk_sock, &msg, msg.msg_flags);
/* If we read a full record, then assume there may be more /* If we read a full record, then assume there may be more
* data to read (stream based sockets only!) * data to read (stream based sockets only!)
*/ */
......
...@@ -264,8 +264,8 @@ static int tipc_receive_from_sock(struct tipc_conn *con) ...@@ -264,8 +264,8 @@ static int tipc_receive_from_sock(struct tipc_conn *con)
iov.iov_base = buf; iov.iov_base = buf;
iov.iov_len = s->max_rcvbuf_size; iov.iov_len = s->max_rcvbuf_size;
msg.msg_name = &addr; msg.msg_name = &addr;
ret = kernel_recvmsg(con->sock, &msg, &iov, 1, iov.iov_len, iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, iov.iov_len);
MSG_DONTWAIT); ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT);
if (ret <= 0) { if (ret <= 0) {
kmem_cache_free(s->rcvbuf_cache, buf); kmem_cache_free(s->rcvbuf_cache, buf);
goto out_close; goto out_close;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment