[AIO] handle signals when running sync iocbs For pipe iocbs, we need to have the ability to have signals interrupt the execution of a sync iocb read/write. Allow iocbs to signal to the sync iocb path that an interruptible sleep should be performed instead of the normal uninterruptible sleep. Signed-off-by: Benjamin LaHaise diff -purN --exclude=description 52_aio_down_reset_wakefn/fs/read_write.c 55_iocb_intr/fs/read_write.c --- 52_aio_down_reset_wakefn/fs/read_write.c 2005-08-04 15:55:57.000000000 -0400 +++ 55_iocb_intr/fs/read_write.c 2005-08-08 17:15:42.000000000 -0400 @@ -205,11 +205,13 @@ Einval: static void wait_on_retry_sync_kiocb(struct kiocb *iocb) { - set_current_state(TASK_UNINTERRUPTIBLE); + set_current_state(kiocbIsIntr(iocb) ? TASK_INTERRUPTIBLE + : TASK_UNINTERRUPTIBLE); if (!kiocbIsKicked(iocb)) schedule(); else kiocbClearKicked(iocb); + kiocbClearIntr(iocb); __set_current_state(TASK_RUNNING); } diff -purN --exclude=description 52_aio_down_reset_wakefn/include/linux/aio.h 55_iocb_intr/include/linux/aio.h --- 52_aio_down_reset_wakefn/include/linux/aio.h 2005-08-08 17:15:41.000000000 -0400 +++ 55_iocb_intr/include/linux/aio.h 2005-08-08 17:15:42.000000000 -0400 @@ -27,6 +27,7 @@ struct kioctx; #define KIF_LOCKED 0 #define KIF_KICKED 1 #define KIF_CANCELLED 2 +#define KIF_INTR 3 /* use TASK_INTERRUPTIBLE waits */ #define kiocbTryLock(iocb) test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags) #define kiocbTryKick(iocb) test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags) @@ -34,14 +35,17 @@ struct kioctx; #define kiocbSetLocked(iocb) set_bit(KIF_LOCKED, &(iocb)->ki_flags) #define kiocbSetKicked(iocb) set_bit(KIF_KICKED, &(iocb)->ki_flags) #define kiocbSetCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags) +#define kiocbSetIntr(iocb) set_bit(KIF_INTR, &(iocb)->ki_flags) #define kiocbClearLocked(iocb) clear_bit(KIF_LOCKED, &(iocb)->ki_flags) #define kiocbClearKicked(iocb) clear_bit(KIF_KICKED, &(iocb)->ki_flags) #define kiocbClearCancelled(iocb) clear_bit(KIF_CANCELLED, &(iocb)->ki_flags) +#define kiocbClearIntr(iocb) clear_bit(KIF_INTR, &(iocb)->ki_flags) #define kiocbIsLocked(iocb) test_bit(KIF_LOCKED, &(iocb)->ki_flags) #define kiocbIsKicked(iocb) test_bit(KIF_KICKED, &(iocb)->ki_flags) #define kiocbIsCancelled(iocb) test_bit(KIF_CANCELLED, &(iocb)->ki_flags) +#define kiocbIsIntr(iocb) test_bit(KIF_INTR, &(iocb)->ki_flags) struct kiocb { struct list_head ki_run_list;