When an AIO operation is cancelled, the ki_cancel callback can't
determine whether the ki_retry callback will ever be called. As a
result, it can't correctly determine whether to free resources. This
patch changes aio_run_iocb to always call ki_retry.
Signed-off-by: Sarah Sharp <[EMAIL PROTECTED]>
Signed-off-by: Jamey Sharp <[EMAIL PROTECTED]>
---
I've been using gadgetfs (the USB slave filesystem) as an example for
how to do in-kernel AIO. Both gadgetfs and usbfs2 use callbacks from
the USB core to know when data is transfered. If the transfer was a
write, the completion function simply calls aio_complete() and frees
data structures. If it's a read, the completion function function calls
kick_iocb(). The retry function copies data into userspace, calls
aio_complete(), and then frees the data structures.
The problem comes when someone calls sys_io_cancel() on a read. If the
retry function has started before this point, everything is fine.
However, if sys_io_cancel() runs before the retry function, aio_run_iocb
will notice the iocb is cancelled and call aio_complete instead. The
retry function never runs, and the data structures are never freed.
Jamey and I believe there is no way to know in the cancel function if
the retry function will be called. Therefore, kick_iocb() should always
call the retry function. This patch fixes that bug.
I'd love to ditch the in-kernel AIO and use syslets instead, but Greg
won't accept my usbfs2 patches until I've implemented AIO, and I don't
want to keep waiting.
Sarah Sharp
fs/aio.c | 8 --------
1 files changed, 0 insertions(+), 8 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index dbe699e..439c0a7 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -700,14 +700,6 @@ static ssize_t aio_run_iocb(struct kiocb *iocb)
iocb->ki_run_list.next = iocb->ki_run_list.prev = NULL;
spin_unlock_irq(&ctx->ctx_lock);
- /* Quit retrying if the i/o has been cancelled */
- if (kiocbIsCancelled(iocb)) {
- ret = -EINTR;
- aio_complete(iocb, ret, 0);
- /* must not access the iocb after this */
- goto out;
- }
-
/*
* Now we are all set to call the retry method in async
* context. By setting this thread's io_wait context
--
1.4.4.1
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel