diff options
author | David S. Miller <davem@davemloft.net> | 2016-04-14 00:39:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-14 00:39:15 -0400 |
commit | 6c61403daea578dcfe84f187c204db1a3fa3d6ae (patch) | |
tree | 76418aa08d196b20920d6ec94dc2b586c1ff2c3f | |
parent | 743b03a83297690f0bd38c452a3bbb47d2be300a (diff) | |
parent | 2da62906b1e298695e1bb725927041cd59942c98 (diff) |
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
-rw-r--r-- | drivers/target/iscsi/iscsi_target_util.c | 5 | ||||
-rw-r--r-- | include/linux/net.h | 3 | ||||
-rw-r--r-- | net/socket.c | 23 |
3 files changed, 13 insertions, 18 deletions
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 428b0d9e3dba..57720385a751 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c | |||
@@ -1283,9 +1283,8 @@ static int iscsit_do_rx_data( | |||
1283 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, | 1283 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, |
1284 | count->iov, count->iov_count, data); | 1284 | count->iov, count->iov_count, data); |
1285 | 1285 | ||
1286 | while (total_rx < data) { | 1286 | while (msg_data_left(&msg)) { |
1287 | rx_loop = sock_recvmsg(conn->sock, &msg, | 1287 | rx_loop = sock_recvmsg(conn->sock, &msg, MSG_WAITALL); |
1288 | (data - total_rx), MSG_WAITALL); | ||
1289 | if (rx_loop <= 0) { | 1288 | if (rx_loop <= 0) { |
1290 | pr_debug("rx_loop: %d total_rx: %d\n", | 1289 | pr_debug("rx_loop: %d total_rx: %d\n", |
1291 | rx_loop, total_rx); | 1290 | rx_loop, total_rx); |
diff --git a/include/linux/net.h b/include/linux/net.h index 49175e4ced11..72c1e0622ce2 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -218,8 +218,7 @@ int sock_create_lite(int family, int type, int proto, struct socket **res); | |||
218 | struct socket *sock_alloc(void); | 218 | struct socket *sock_alloc(void); |
219 | void sock_release(struct socket *sock); | 219 | void sock_release(struct socket *sock); |
220 | int sock_sendmsg(struct socket *sock, struct msghdr *msg); | 220 | int sock_sendmsg(struct socket *sock, struct msghdr *msg); |
221 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, | 221 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags); |
222 | int flags); | ||
223 | struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname); | 222 | struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname); |
224 | struct socket *sockfd_lookup(int fd, int *err); | 223 | struct socket *sockfd_lookup(int fd, int *err); |
225 | struct socket *sock_from_file(struct file *file, int *err); | 224 | struct socket *sock_from_file(struct file *file, int *err); |
diff --git a/net/socket.c b/net/socket.c index afa3c3470717..5dbb0bbe12a7 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -709,17 +709,16 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk, | |||
709 | EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); | 709 | EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops); |
710 | 710 | ||
711 | static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, | 711 | static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, |
712 | size_t size, int flags) | 712 | int flags) |
713 | { | 713 | { |
714 | return sock->ops->recvmsg(sock, msg, size, flags); | 714 | return sock->ops->recvmsg(sock, msg, msg_data_left(msg), flags); |
715 | } | 715 | } |
716 | 716 | ||
717 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, | 717 | int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags) |
718 | int flags) | ||
719 | { | 718 | { |
720 | int err = security_socket_recvmsg(sock, msg, size, flags); | 719 | int err = security_socket_recvmsg(sock, msg, msg_data_left(msg), flags); |
721 | 720 | ||
722 | return err ?: sock_recvmsg_nosec(sock, msg, size, flags); | 721 | return err ?: sock_recvmsg_nosec(sock, msg, flags); |
723 | } | 722 | } |
724 | EXPORT_SYMBOL(sock_recvmsg); | 723 | EXPORT_SYMBOL(sock_recvmsg); |
725 | 724 | ||
@@ -746,7 +745,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg, | |||
746 | 745 | ||
747 | iov_iter_kvec(&msg->msg_iter, READ | ITER_KVEC, vec, num, size); | 746 | iov_iter_kvec(&msg->msg_iter, READ | ITER_KVEC, vec, num, size); |
748 | set_fs(KERNEL_DS); | 747 | set_fs(KERNEL_DS); |
749 | result = sock_recvmsg(sock, msg, size, flags); | 748 | result = sock_recvmsg(sock, msg, flags); |
750 | set_fs(oldfs); | 749 | set_fs(oldfs); |
751 | return result; | 750 | return result; |
752 | } | 751 | } |
@@ -796,7 +795,7 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to) | |||
796 | if (!iov_iter_count(to)) /* Match SYS5 behaviour */ | 795 | if (!iov_iter_count(to)) /* Match SYS5 behaviour */ |
797 | return 0; | 796 | return 0; |
798 | 797 | ||
799 | res = sock_recvmsg(sock, &msg, iov_iter_count(to), msg.msg_flags); | 798 | res = sock_recvmsg(sock, &msg, msg.msg_flags); |
800 | *to = msg.msg_iter; | 799 | *to = msg.msg_iter; |
801 | return res; | 800 | return res; |
802 | } | 801 | } |
@@ -1696,7 +1695,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, | |||
1696 | msg.msg_iocb = NULL; | 1695 | msg.msg_iocb = NULL; |
1697 | if (sock->file->f_flags & O_NONBLOCK) | 1696 | if (sock->file->f_flags & O_NONBLOCK) |
1698 | flags |= MSG_DONTWAIT; | 1697 | flags |= MSG_DONTWAIT; |
1699 | err = sock_recvmsg(sock, &msg, iov_iter_count(&msg.msg_iter), flags); | 1698 | err = sock_recvmsg(sock, &msg, flags); |
1700 | 1699 | ||
1701 | if (err >= 0 && addr != NULL) { | 1700 | if (err >= 0 && addr != NULL) { |
1702 | err2 = move_addr_to_user(&address, | 1701 | err2 = move_addr_to_user(&address, |
@@ -2073,7 +2072,7 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg, | |||
2073 | struct iovec iovstack[UIO_FASTIOV]; | 2072 | struct iovec iovstack[UIO_FASTIOV]; |
2074 | struct iovec *iov = iovstack; | 2073 | struct iovec *iov = iovstack; |
2075 | unsigned long cmsg_ptr; | 2074 | unsigned long cmsg_ptr; |
2076 | int total_len, len; | 2075 | int len; |
2077 | ssize_t err; | 2076 | ssize_t err; |
2078 | 2077 | ||
2079 | /* kernel mode address */ | 2078 | /* kernel mode address */ |
@@ -2091,7 +2090,6 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg, | |||
2091 | err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov); | 2090 | err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov); |
2092 | if (err < 0) | 2091 | if (err < 0) |
2093 | return err; | 2092 | return err; |
2094 | total_len = iov_iter_count(&msg_sys->msg_iter); | ||
2095 | 2093 | ||
2096 | cmsg_ptr = (unsigned long)msg_sys->msg_control; | 2094 | cmsg_ptr = (unsigned long)msg_sys->msg_control; |
2097 | msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); | 2095 | msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT); |
@@ -2101,8 +2099,7 @@ static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg, | |||
2101 | 2099 | ||
2102 | if (sock->file->f_flags & O_NONBLOCK) | 2100 | if (sock->file->f_flags & O_NONBLOCK) |
2103 | flags |= MSG_DONTWAIT; | 2101 | flags |= MSG_DONTWAIT; |
2104 | err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys, | 2102 | err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys, flags); |
2105 | total_len, flags); | ||
2106 | if (err < 0) | 2103 | if (err < 0) |
2107 | goto out_freeiov; | 2104 | goto out_freeiov; |
2108 | len = err; | 2105 | len = err; |