summaryrefslogtreecommitdiff
path: root/fs/io_uring.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-10-08 19:09:46 -0600
committerJens Axboe <axboe@kernel.dk>2020-10-08 20:37:45 -0600
commited6930c9201cd1e00f74474da2f095796a0d82f6 (patch)
treeaa462dd3eae9754ae41bb323e0ef79d25ef4d3d5 /fs/io_uring.c
parentca6484cd308a671811bf39f3119e81966eb476e3 (diff)
downloadlwn-ed6930c9201cd1e00f74474da2f095796a0d82f6.tar.gz
lwn-ed6930c9201cd1e00f74474da2f095796a0d82f6.zip
io_uring: fix break condition for __io_uring_register() waiting
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>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r--fs/io_uring.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 4df5b14c2e56..299c530c66f9 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -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;
}
}