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