diff options
author | Jason Wang <jasowang@redhat.com> | 2015-02-15 03:35:17 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-02-15 11:17:15 -0500 |
commit | 0960b6417e9ed8e4b4aa3c54e257324a9352f40b (patch) | |
tree | 57ed67565cc5723eedfb15bc30894f29069177af /drivers/vhost | |
parent | ca9f1fd263e14765a4c213e46940876ad78fce28 (diff) |
vhost_net: fix wrong iter offset when setting number of buffers
In commit ba7438aed924 ("vhost: don't bother copying iovecs in
handle_rx(), kill memcpy_toiovecend()"), we advance iov iter fixup
sizeof(struct virtio_net_hdr) bytes and fill the number of buffers
after doing the socket recvmsg(). This work well but was broken after
commit 6e03f896b52c ("Merge
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net") which tries
to advance sizeof(struct virtio_net_hdr_mrg_rxbuf). It will fill the
number of buffers at the wrong place. This patch fixes this.
Fixes 6e03f896b52c
("Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net")
Cc: David S. Miller <davem@davemloft.net>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/vhost')
-rw-r--r-- | drivers/vhost/net.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 8dccca9013ed..afa06d28725d 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -528,9 +528,9 @@ static void handle_rx(struct vhost_net *net) | |||
528 | .msg_controllen = 0, | 528 | .msg_controllen = 0, |
529 | .msg_flags = MSG_DONTWAIT, | 529 | .msg_flags = MSG_DONTWAIT, |
530 | }; | 530 | }; |
531 | struct virtio_net_hdr_mrg_rxbuf hdr = { | 531 | struct virtio_net_hdr hdr = { |
532 | .hdr.flags = 0, | 532 | .flags = 0, |
533 | .hdr.gso_type = VIRTIO_NET_HDR_GSO_NONE | 533 | .gso_type = VIRTIO_NET_HDR_GSO_NONE |
534 | }; | 534 | }; |
535 | size_t total_len = 0; | 535 | size_t total_len = 0; |
536 | int err, mergeable; | 536 | int err, mergeable; |
@@ -539,6 +539,7 @@ static void handle_rx(struct vhost_net *net) | |||
539 | size_t vhost_len, sock_len; | 539 | size_t vhost_len, sock_len; |
540 | struct socket *sock; | 540 | struct socket *sock; |
541 | struct iov_iter fixup; | 541 | struct iov_iter fixup; |
542 | __virtio16 num_buffers; | ||
542 | 543 | ||
543 | mutex_lock(&vq->mutex); | 544 | mutex_lock(&vq->mutex); |
544 | sock = vq->private_data; | 545 | sock = vq->private_data; |
@@ -616,9 +617,9 @@ static void handle_rx(struct vhost_net *net) | |||
616 | } | 617 | } |
617 | /* TODO: Should check and handle checksum. */ | 618 | /* TODO: Should check and handle checksum. */ |
618 | 619 | ||
619 | hdr.num_buffers = cpu_to_vhost16(vq, headcount); | 620 | num_buffers = cpu_to_vhost16(vq, headcount); |
620 | if (likely(mergeable) && | 621 | if (likely(mergeable) && |
621 | copy_to_iter(&hdr.num_buffers, 2, &fixup) != 2) { | 622 | copy_to_iter(&num_buffers, 2, &fixup) != 2) { |
622 | vq_err(vq, "Failed num_buffers write"); | 623 | vq_err(vq, "Failed num_buffers write"); |
623 | vhost_discard_vq_desc(vq, headcount); | 624 | vhost_discard_vq_desc(vq, headcount); |
624 | break; | 625 | break; |