Skip to content

Commit 28468cb

Browse files
bvanasschebrauner
authored andcommitted
Revert "fs/aio: Make io_cancel() generate completions again"
Patch "fs/aio: Make io_cancel() generate completions again" is based on the assumption that calling kiocb->ki_cancel() does not complete R/W requests. This is incorrect: the two drivers that call kiocb_set_cancel_fn() callers set a cancellation function that calls usb_ep_dequeue(). According to its documentation, usb_ep_dequeue() calls the completion routine with status -ECONNRESET. Hence this revert. Cc: Benjamin LaHaise <ben@communityfibre.ca> Cc: Eric Biggers <ebiggers@google.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Avi Kivity <avi@scylladb.com> Cc: Sandeep Dhavale <dhavale@google.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Kent Overstreet <kent.overstreet@linux.dev> Cc: stable@vger.kernel.org Reported-by: syzbot+b91eb2ed18f599dd3c31@syzkaller.appspotmail.com Fixes: 54cbc05 ("fs/aio: Make io_cancel() generate completions again") Signed-off-by: Bart Van Assche <bvanassche@acm.org> Link: https://lore.kernel.org/r/20240304182945.3646109-1-bvanassche@acm.org Acked-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 90d35da commit 28468cb

1 file changed

Lines changed: 16 additions & 11 deletions

File tree

fs/aio.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2165,11 +2165,14 @@ COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id,
21652165
#endif
21662166

21672167
/* sys_io_cancel:
2168-
* Attempts to cancel an iocb previously passed to io_submit(). If the
2169-
* operation is successfully cancelled 0 is returned. May fail with
2170-
* -EFAULT if any of the data structures pointed to are invalid. May
2171-
* fail with -EINVAL if aio_context specified by ctx_id is invalid. Will
2172-
* fail with -ENOSYS if not implemented.
2168+
* Attempts to cancel an iocb previously passed to io_submit. If
2169+
* the operation is successfully cancelled, the resulting event is
2170+
* copied into the memory pointed to by result without being placed
2171+
* into the completion queue and 0 is returned. May fail with
2172+
* -EFAULT if any of the data structures pointed to are invalid.
2173+
* May fail with -EINVAL if aio_context specified by ctx_id is
2174+
* invalid. May fail with -EAGAIN if the iocb specified was not
2175+
* cancelled. Will fail with -ENOSYS if not implemented.
21732176
*/
21742177
SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
21752178
struct io_event __user *, result)
@@ -2200,12 +2203,14 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
22002203
}
22012204
spin_unlock_irq(&ctx->ctx_lock);
22022205

2203-
/*
2204-
* The result argument is no longer used - the io_event is always
2205-
* delivered via the ring buffer.
2206-
*/
2207-
if (ret == 0 && kiocb->rw.ki_flags & IOCB_AIO_RW)
2208-
aio_complete_rw(&kiocb->rw, -EINTR);
2206+
if (!ret) {
2207+
/*
2208+
* The result argument is no longer used - the io_event is
2209+
* always delivered via the ring buffer. -EINPROGRESS indicates
2210+
* cancellation is progress:
2211+
*/
2212+
ret = -EINPROGRESS;
2213+
}
22092214

22102215
percpu_ref_put(&ctx->users);
22112216

0 commit comments

Comments
 (0)