Skip to content

Commit 54cbc05

Browse files
bvanasschebrauner
authored andcommitted
fs/aio: Make io_cancel() generate completions again
The following patch accidentally removed the code for delivering completions for cancelled reads and writes to user space: "[PATCH 04/33] aio: remove retry-based AIO" (https://lore.kernel.org/all/1363883754-27966-5-git-send-email-koverstreet@google.com/) >From that patch: - if (kiocbIsCancelled(iocb)) { - ret = -EINTR; - aio_complete(iocb, ret, 0); - /* must not access the iocb after this */ - goto out; - } This leads to a leak in user space of a struct iocb. Hence this patch that restores the code that reports to user space that a read or write has been cancelled successfully. Fixes: 41003a7 ("aio: remove retry-based AIO") 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 Signed-off-by: Bart Van Assche <bvanassche@acm.org> Link: https://lore.kernel.org/r/20240215204739.2677806-3-bvanassche@acm.org Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 5f7a076 commit 54cbc05

1 file changed

Lines changed: 11 additions & 16 deletions

File tree

fs/aio.c

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2165,14 +2165,11 @@ 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
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.
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.
21762173
*/
21772174
SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
21782175
struct io_event __user *, result)
@@ -2203,14 +2200,12 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
22032200
}
22042201
spin_unlock_irq(&ctx->ctx_lock);
22052202

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-
}
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);
22142209

22152210
percpu_ref_put(&ctx->users);
22162211

0 commit comments

Comments
 (0)