diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-24 19:32:50 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-12-09 16:28:23 -0500 |
commit | d838df2e5dcbb6ed4d82854869e9a30f9aeef6da (patch) | |
tree | dd72df4d21aa997d830a80683b5afc80852f5a01 | |
parent | 56c39fb67cdb665ae67fba4975f5e20e6614cda6 (diff) |
vmci: propagate msghdr all way down to __qp_memcpy_from_queue()
... and switch it to memcpy_to_msg()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | drivers/misc/vmw_vmci/vmci_queue_pair.c | 17 | ||||
-rw-r--r-- | include/linux/vmw_vmci_api.h | 5 | ||||
-rw-r--r-- | net/vmw_vsock/vmci_transport.c | 4 |
3 files changed, 14 insertions, 12 deletions
diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c b/drivers/misc/vmw_vmci/vmci_queue_pair.c index 1b7b303085d2..7aaaf51e1596 100644 --- a/drivers/misc/vmw_vmci/vmci_queue_pair.c +++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/uio.h> | 27 | #include <linux/uio.h> |
28 | #include <linux/wait.h> | 28 | #include <linux/wait.h> |
29 | #include <linux/vmalloc.h> | 29 | #include <linux/vmalloc.h> |
30 | #include <linux/skbuff.h> | ||
30 | 31 | ||
31 | #include "vmci_handle_array.h" | 32 | #include "vmci_handle_array.h" |
32 | #include "vmci_queue_pair.h" | 33 | #include "vmci_queue_pair.h" |
@@ -429,11 +430,11 @@ static int __qp_memcpy_from_queue(void *dest, | |||
429 | to_copy = size - bytes_copied; | 430 | to_copy = size - bytes_copied; |
430 | 431 | ||
431 | if (is_iovec) { | 432 | if (is_iovec) { |
432 | struct iovec *iov = (struct iovec *)dest; | 433 | struct msghdr *msg = dest; |
433 | int err; | 434 | int err; |
434 | 435 | ||
435 | /* The iovec will track bytes_copied internally. */ | 436 | /* The iovec will track bytes_copied internally. */ |
436 | err = memcpy_toiovec(iov, (u8 *)va + page_offset, | 437 | err = memcpy_to_msg(msg, (u8 *)va + page_offset, |
437 | to_copy); | 438 | to_copy); |
438 | if (err != 0) { | 439 | if (err != 0) { |
439 | if (kernel_if->host) | 440 | if (kernel_if->host) |
@@ -3264,13 +3265,13 @@ EXPORT_SYMBOL_GPL(vmci_qpair_enquev); | |||
3264 | * of bytes dequeued or < 0 on error. | 3265 | * of bytes dequeued or < 0 on error. |
3265 | */ | 3266 | */ |
3266 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, | 3267 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, |
3267 | void *iov, | 3268 | struct msghdr *msg, |
3268 | size_t iov_size, | 3269 | size_t iov_size, |
3269 | int buf_type) | 3270 | int buf_type) |
3270 | { | 3271 | { |
3271 | ssize_t result; | 3272 | ssize_t result; |
3272 | 3273 | ||
3273 | if (!qpair || !iov) | 3274 | if (!qpair) |
3274 | return VMCI_ERROR_INVALID_ARGS; | 3275 | return VMCI_ERROR_INVALID_ARGS; |
3275 | 3276 | ||
3276 | qp_lock(qpair); | 3277 | qp_lock(qpair); |
@@ -3279,7 +3280,7 @@ ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, | |||
3279 | result = qp_dequeue_locked(qpair->produce_q, | 3280 | result = qp_dequeue_locked(qpair->produce_q, |
3280 | qpair->consume_q, | 3281 | qpair->consume_q, |
3281 | qpair->consume_q_size, | 3282 | qpair->consume_q_size, |
3282 | iov, iov_size, | 3283 | msg, iov_size, |
3283 | qp_memcpy_from_queue_iov, | 3284 | qp_memcpy_from_queue_iov, |
3284 | true); | 3285 | true); |
3285 | 3286 | ||
@@ -3308,13 +3309,13 @@ EXPORT_SYMBOL_GPL(vmci_qpair_dequev); | |||
3308 | * of bytes peeked or < 0 on error. | 3309 | * of bytes peeked or < 0 on error. |
3309 | */ | 3310 | */ |
3310 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, | 3311 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, |
3311 | void *iov, | 3312 | struct msghdr *msg, |
3312 | size_t iov_size, | 3313 | size_t iov_size, |
3313 | int buf_type) | 3314 | int buf_type) |
3314 | { | 3315 | { |
3315 | ssize_t result; | 3316 | ssize_t result; |
3316 | 3317 | ||
3317 | if (!qpair || !iov) | 3318 | if (!qpair) |
3318 | return VMCI_ERROR_INVALID_ARGS; | 3319 | return VMCI_ERROR_INVALID_ARGS; |
3319 | 3320 | ||
3320 | qp_lock(qpair); | 3321 | qp_lock(qpair); |
@@ -3323,7 +3324,7 @@ ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, | |||
3323 | result = qp_dequeue_locked(qpair->produce_q, | 3324 | result = qp_dequeue_locked(qpair->produce_q, |
3324 | qpair->consume_q, | 3325 | qpair->consume_q, |
3325 | qpair->consume_q_size, | 3326 | qpair->consume_q_size, |
3326 | iov, iov_size, | 3327 | msg, iov_size, |
3327 | qp_memcpy_from_queue_iov, | 3328 | qp_memcpy_from_queue_iov, |
3328 | false); | 3329 | false); |
3329 | 3330 | ||
diff --git a/include/linux/vmw_vmci_api.h b/include/linux/vmw_vmci_api.h index 023430e265fe..5691f752ce8f 100644 --- a/include/linux/vmw_vmci_api.h +++ b/include/linux/vmw_vmci_api.h | |||
@@ -24,6 +24,7 @@ | |||
24 | #define VMCI_KERNEL_API_VERSION_2 2 | 24 | #define VMCI_KERNEL_API_VERSION_2 2 |
25 | #define VMCI_KERNEL_API_VERSION VMCI_KERNEL_API_VERSION_2 | 25 | #define VMCI_KERNEL_API_VERSION VMCI_KERNEL_API_VERSION_2 |
26 | 26 | ||
27 | struct msghdr; | ||
27 | typedef void (vmci_device_shutdown_fn) (void *device_registration, | 28 | typedef void (vmci_device_shutdown_fn) (void *device_registration, |
28 | void *user_data); | 29 | void *user_data); |
29 | 30 | ||
@@ -75,8 +76,8 @@ ssize_t vmci_qpair_peek(struct vmci_qp *qpair, void *buf, size_t buf_size, | |||
75 | ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, | 76 | ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, |
76 | void *iov, size_t iov_size, int mode); | 77 | void *iov, size_t iov_size, int mode); |
77 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, | 78 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, |
78 | void *iov, size_t iov_size, int mode); | 79 | struct msghdr *msg, size_t iov_size, int mode); |
79 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, void *iov, size_t iov_size, | 80 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, struct msghdr *msg, size_t iov_size, |
80 | int mode); | 81 | int mode); |
81 | 82 | ||
82 | #endif /* !__VMW_VMCI_API_H__ */ | 83 | #endif /* !__VMW_VMCI_API_H__ */ |
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index c1c038952973..20a0ba3bfff6 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c | |||
@@ -1840,9 +1840,9 @@ static ssize_t vmci_transport_stream_dequeue( | |||
1840 | int flags) | 1840 | int flags) |
1841 | { | 1841 | { |
1842 | if (flags & MSG_PEEK) | 1842 | if (flags & MSG_PEEK) |
1843 | return vmci_qpair_peekv(vmci_trans(vsk)->qpair, msg->msg_iov, len, 0); | 1843 | return vmci_qpair_peekv(vmci_trans(vsk)->qpair, msg, len, 0); |
1844 | else | 1844 | else |
1845 | return vmci_qpair_dequev(vmci_trans(vsk)->qpair, msg->msg_iov, len, 0); | 1845 | return vmci_qpair_dequev(vmci_trans(vsk)->qpair, msg, len, 0); |
1846 | } | 1846 | } |
1847 | 1847 | ||
1848 | static ssize_t vmci_transport_stream_enqueue( | 1848 | static ssize_t vmci_transport_stream_enqueue( |