|
|
@@ -1992,24 +1992,6 @@ COMPAT_SYSCALL_DEFINE3(io_submit, compat_aio_context_t, ctx_id,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-/* lookup_kiocb
|
|
|
- * Finds a given iocb for cancellation.
|
|
|
- */
|
|
|
-static struct aio_kiocb *
|
|
|
-lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb)
|
|
|
-{
|
|
|
- struct aio_kiocb *kiocb;
|
|
|
-
|
|
|
- assert_spin_locked(&ctx->ctx_lock);
|
|
|
-
|
|
|
- /* TODO: use a hash or array, this sucks. */
|
|
|
- list_for_each_entry(kiocb, &ctx->active_reqs, ki_list) {
|
|
|
- if (kiocb->ki_user_iocb == iocb)
|
|
|
- return kiocb;
|
|
|
- }
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
/* sys_io_cancel:
|
|
|
* Attempts to cancel an iocb previously passed to io_submit. If
|
|
|
* the operation is successfully cancelled, the resulting event is
|
|
|
@@ -2038,10 +2020,13 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
|
|
|
return -EINVAL;
|
|
|
|
|
|
spin_lock_irq(&ctx->ctx_lock);
|
|
|
- kiocb = lookup_kiocb(ctx, iocb);
|
|
|
- if (kiocb) {
|
|
|
- ret = kiocb->ki_cancel(&kiocb->rw);
|
|
|
- list_del_init(&kiocb->ki_list);
|
|
|
+ /* TODO: use a hash or array, this sucks. */
|
|
|
+ list_for_each_entry(kiocb, &ctx->active_reqs, ki_list) {
|
|
|
+ if (kiocb->ki_user_iocb == iocb) {
|
|
|
+ ret = kiocb->ki_cancel(&kiocb->rw);
|
|
|
+ list_del_init(&kiocb->ki_list);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
spin_unlock_irq(&ctx->ctx_lock);
|
|
|
|