io_uring: fix break condition for __io_uring_register() waiting
authorJens Axboe <axboe@kernel.dk>
Fri, 9 Oct 2020 01:09:46 +0000 (19:09 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 9 Oct 2020 02:37:45 +0000 (20:37 -0600)
Colin reports that there's unreachable code, since we only ever break
if ret == 0. This is correct, and is due to a reversed logic condition
in when to break or not.

Break out of the loop if we don't process any task work, in that case
we do want to return -EINTR.

Fixes: af9c1a44f8de ("io_uring: process task work in io_uring_register()")
Reported-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 4df5b14..299c530 100644 (file)
@@ -9511,15 +9511,15 @@ static int __io_uring_register(struct io_ring_ctx *ctx, unsigned opcode,
                        ret = wait_for_completion_interruptible(&ctx->ref_comp);
                        if (!ret)
                                break;
-                       if (io_run_task_work_sig() > 0)
-                               continue;
+                       ret = io_run_task_work_sig();
+                       if (ret < 0)
+                               break;
                } while (1);
 
                mutex_lock(&ctx->uring_lock);
 
                if (ret) {
                        percpu_ref_resurrect(&ctx->refs);
-                       ret = -EINTR;
                        goto out_quiesce;
                }
        }