mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-14 04:09:18 -04:00
staging: lustre: ksocknal_lib_send_kiov(): sendmsg doesn't bugger iovec...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
805560e8f1
commit
1b4e992f50
@@ -106,10 +106,6 @@ ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx)
|
||||
/* Not NOOP message */
|
||||
LASSERT(tx->tx_lnetmsg);
|
||||
|
||||
/*
|
||||
* NB we can't trust socket ops to either consume our iovs
|
||||
* or leave them alone.
|
||||
*/
|
||||
if (tx->tx_msg.ksm_zc_cookies[0]) {
|
||||
/* Zero copy is enabled */
|
||||
struct sock *sk = sock->sk;
|
||||
@@ -132,34 +128,19 @@ ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx)
|
||||
rc = tcp_sendpage(sk, page, offset, fragsize, msgflg);
|
||||
}
|
||||
} else {
|
||||
#if SOCKNAL_SINGLE_FRAG_TX || !SOCKNAL_RISK_KMAP_DEADLOCK
|
||||
struct kvec scratch;
|
||||
struct kvec *scratchiov = &scratch;
|
||||
unsigned int niov = 1;
|
||||
#else
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
#warning "XXX risk of kmap deadlock on multiple frags..."
|
||||
#endif
|
||||
struct kvec *scratchiov = conn->ksnc_scheduler->kss_scratch_iov;
|
||||
unsigned int niov = tx->tx_nkiov;
|
||||
#endif
|
||||
struct msghdr msg = {.msg_flags = MSG_DONTWAIT};
|
||||
int i;
|
||||
|
||||
for (nob = i = 0; i < niov; i++) {
|
||||
scratchiov[i].iov_base = kmap(kiov[i].bv_page) +
|
||||
kiov[i].bv_offset;
|
||||
nob += scratchiov[i].iov_len = kiov[i].bv_len;
|
||||
}
|
||||
for (nob = i = 0; i < tx->tx_nkiov; i++)
|
||||
nob += kiov[i].bv_len;
|
||||
|
||||
if (!list_empty(&conn->ksnc_tx_queue) ||
|
||||
nob < tx->tx_resid)
|
||||
msg.msg_flags |= MSG_MORE;
|
||||
|
||||
rc = kernel_sendmsg(sock, &msg, (struct kvec *)scratchiov, niov, nob);
|
||||
|
||||
for (i = 0; i < niov; i++)
|
||||
kunmap(kiov[i].bv_page);
|
||||
iov_iter_bvec(&msg.msg_iter, WRITE | ITER_BVEC,
|
||||
kiov, tx->tx_nkiov, nob);
|
||||
rc = sock_sendmsg(sock, &msg);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user