switch memcpy_to_msg() and skb_copy{,_and_csum}_datagram_msg() to primitives
... making both non-draining. That means that tcp_recvmsg() becomes non-draining. And _that_ would break iscsit_do_rx_data() unless we a) make sure tcp_recvmsg() is uniformly non-draining (it is) b) make sure it copes with arbitrary (including shifted) iov_iter (it does, all it uses is iov_iter primitives) c) make iscsit_do_rx_data() initialize ->msg_iter only once. Fortunately, (c) is doable with minimal work and we are rid of one the two places where kernel send/recvmsg users would be unhappy with non-draining behaviour. Actually, that makes all but one of ->recvmsg() instances iov_iter-clean. The exception is skcipher_recvmsg() and it also isn't hard to convert to primitives (iov_iter_get_pages() is needed there). That'll wait a bit - there's some interplay with ->sendmsg() path for that one. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -1326,21 +1326,19 @@ static int iscsit_do_rx_data(
|
||||
struct iscsi_conn *conn,
|
||||
struct iscsi_data_count *count)
|
||||
{
|
||||
int data = count->data_length, rx_loop = 0, total_rx = 0, iov_len;
|
||||
struct kvec *iov_p;
|
||||
int data = count->data_length, rx_loop = 0, total_rx = 0;
|
||||
struct msghdr msg;
|
||||
|
||||
if (!conn || !conn->sock || !conn->conn_ops)
|
||||
return -1;
|
||||
|
||||
memset(&msg, 0, sizeof(struct msghdr));
|
||||
|
||||
iov_p = count->iov;
|
||||
iov_len = count->iov_count;
|
||||
iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC,
|
||||
count->iov, count->iov_count, data);
|
||||
|
||||
while (total_rx < data) {
|
||||
rx_loop = kernel_recvmsg(conn->sock, &msg, iov_p, iov_len,
|
||||
(data - total_rx), MSG_WAITALL);
|
||||
rx_loop = sock_recvmsg(conn->sock, &msg,
|
||||
(data - total_rx), MSG_WAITALL);
|
||||
if (rx_loop <= 0) {
|
||||
pr_debug("rx_loop: %d total_rx: %d\n",
|
||||
rx_loop, total_rx);
|
||||
|
Reference in New Issue
Block a user