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( |
