Commit 5d960724 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring: io_fail_links() should only consider first linked timeout



We currently clear the linked timeout field if we cancel such a timeout,
but we should only attempt to cancel if it's the first one we see.
Others should simply be freed like other requests, as they haven't
been started yet.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 09fbb0a8
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -942,12 +942,12 @@ static void io_fail_links(struct io_kiocb *req)
		if ((req->flags & REQ_F_LINK_TIMEOUT) &&
		    link->submit.sqe->opcode == IORING_OP_LINK_TIMEOUT) {
			io_link_cancel_timeout(link);
			req->flags &= ~REQ_F_LINK_TIMEOUT;
		} else {
			io_cqring_fill_event(link, -ECANCELED);
			__io_double_put_req(link);
		}
		kfree(sqe_to_free);
		req->flags &= ~REQ_F_LINK_TIMEOUT;
	}

	io_commit_cqring(ctx);
@@ -2837,9 +2837,10 @@ static enum hrtimer_restart io_link_timeout_fn(struct hrtimer *timer)
	 */
	if (!list_empty(&req->list)) {
		prev = list_entry(req->list.prev, struct io_kiocb, link_list);
		if (refcount_inc_not_zero(&prev->refs))
		if (refcount_inc_not_zero(&prev->refs)) {
			list_del_init(&req->list);
		else
			prev->flags &= ~REQ_F_LINK_TIMEOUT;
		} else
			prev = NULL;
	}