diff -purN -X /home/mbligh/.diff.exclude 790-irq_vector/fs/aio.c 810-aio_cancel_fix/fs/aio.c --- 790-irq_vector/fs/aio.c 2004-02-28 11:22:13.000000000 -0800 +++ 810-aio_cancel_fix/fs/aio.c 2004-02-28 11:42:27.000000000 -0800 @@ -938,6 +938,13 @@ int aio_complete(struct kiocb *iocb, lon if (iocb->ki_run_list.prev && !list_empty(&iocb->ki_run_list)) list_del_init(&iocb->ki_run_list); + /* + * cancelled requests don't get events, userland was given one + * when the event got cancelled. + */ + if (kiocbIsCancelled(iocb)) + goto put_rq; + ring = kmap_atomic(info->ring_pages[0], KM_IRQ1); tail = info->tail; @@ -970,7 +977,7 @@ int aio_complete(struct kiocb *iocb, lon iocb->ki_retried, iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes, iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups); - +put_rq: /* everything turned out well, dispose of the aiocb. */ ret = __aio_put_req(ctx, iocb); @@ -1644,6 +1651,7 @@ asmlinkage long sys_io_cancel(aio_contex if (kiocb && kiocb->ki_cancel) { cancel = kiocb->ki_cancel; kiocb->ki_users ++; + kiocbSetCancelled(kiocb); } else cancel = NULL; spin_unlock_irq(&ctx->ctx_lock);