On Sat, 2014-11-22 at 04:32 +0000, Al Viro wrote:
> Signed-off-by: Al Viro <v...@zeniv.linux.org.uk>
> ---
>  drivers/net/macvtap.c |   39 ++++++++++++++++-----------------------
>  1 file changed, 16 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
> index cea99d4..cdd820f 100644
> --- a/drivers/net/macvtap.c
> +++ b/drivers/net/macvtap.c
> @@ -829,16 +829,17 @@ done:
>  }
>  
>  static ssize_t macvtap_do_read(struct macvtap_queue *q,
> -                            const struct iovec *iv, unsigned long segs,
> -                            unsigned long len,
> +                            struct iov_iter *to,
>                              int noblock)
>  {
>       DEFINE_WAIT(wait);
>       struct sk_buff *skb;
>       ssize_t ret = 0;
> -     struct iov_iter iter;
>  
> -     while (len) {
> +     if (!iov_iter_count(to))
> +             return 0;
> +
> +     while (1) {
>               if (!noblock)
>                       prepare_to_wait(sk_sleep(&q->sk), &wait,
>                                       TASK_INTERRUPTIBLE);
> @@ -856,37 +857,27 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q,
>                       }
>                       /* Nothing to read, let's sleep */
>                       schedule();
> -                     continue;
>               }
> -             iov_iter_init(&iter, READ, iv, segs, len);
> -             ret = macvtap_put_user(q, skb, &iter);
> +     }
> +     if (skb) {
> +             ret = macvtap_put_user(q, skb, to);
>               kfree_skb(skb);
> -             break;
[...]

You need to leave this break at the bottom of the loop body, or change
it to:

        do {
                ...
        } while (!skb);

Ben.

-- 
Ben Hutchings
Never put off till tomorrow what you can avoid all together.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to