On 5/1/20 11:43 AM, Al Viro wrote:
> On Fri, May 01, 2020 at 11:18:05AM -0600, Jens Axboe wrote:
> 
>> -    if (res > 0 && put_user(ucnt, (__u64 __user *)buf))
>> +    if (res > 0 && copy_to_iter(&ucnt, res, iov) < res)
> 
> *whoa*
> 
> It is correct, but only because here res > 0 <=> res == 8.
> And that's not trivial at the first glance.
> 
> Please, turn that into something like

Looks good to me, just one minor edit:

>       if (iov_iter_count(to) < sizeof(ucnt))
>               return -EINVAL;
>       spin_lock_irq(&ctx->wqh.lock);
>       if (!ctx->count) {
>               if (unlikely(file->f_flags & O_NONBLOCK) {
>                       spin_unlock_irq(&ctx->wqh.lock)
>                       return -EAGAIN;
>               }
>               __add_wait_queue(&ctx->wqh, &wait);
>               for (;;) {
>                       set_current_state(TASK_INTERRUPTIBLE);
>                       if (ctx->count)
>                               break;
>                       if (signal_pending(current)) {
>                               spin_unlock_irq(&ctx->wqh.lock)
>                               return -ERESTARTSYS;
>                       }

We need to remove waitq and re-set task state here. I'll run a sanity
check on that and send out a v3.

-- 
Jens Axboe

Reply via email to