Commit 2b35b8b4 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring/waitid: always remove waitid entry for cancel all



We know the request is either being removed, or already in the process of
being removed through task_work, so we can delete it from our waitid list
upfront. This is important for remove all conditions, as we otherwise
will find it multiple times and prevent cancelation progress.

Remove the dead check in cancelation as well for the hash_node being
empty or not. We already have a waitid reference check for ownership,
so we don't need to check the list too.

Cc: stable@vger.kernel.org
Fixes: f31ecf67 ("io_uring: add IORING_OP_WAITID support")
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 30dab608
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -125,12 +125,6 @@ static void io_waitid_complete(struct io_kiocb *req, int ret)

	lockdep_assert_held(&req->ctx->uring_lock);

	/*
	 * Did cancel find it meanwhile?
	 */
	if (hlist_unhashed(&req->hash_node))
		return;

	hlist_del_init(&req->hash_node);

	ret = io_waitid_finish(req, ret);
@@ -202,6 +196,7 @@ bool io_waitid_remove_all(struct io_ring_ctx *ctx, struct task_struct *task,
	hlist_for_each_entry_safe(req, tmp, &ctx->waitid_list, hash_node) {
		if (!io_match_task_safe(req, task, cancel_all))
			continue;
		hlist_del_init(&req->hash_node);
		__io_waitid_cancel(ctx, req);
		found = true;
	}