[AIO] introduce Dont Unlock functionality for kiocbs In order to set up an iocb's cancel function race free in one of the following aio thread fallback patches, it is necessary to defer unlocking the kiocb until the thread executing the request has come to life. Make this possible by introducing a flag to defer unlocking the kiocb. Signed-off-by: Benjamin LaHaise diff -purN --exclude=description 80_no_net_aio/fs/aio.c 815_dont_unlock/fs/aio.c --- 80_no_net_aio/fs/aio.c 2005-08-08 17:16:06.000000000 -0400 +++ 815_dont_unlock/fs/aio.c 2005-08-15 15:34:25.000000000 -0400 @@ -1567,7 +1567,8 @@ int fastcall io_submit_one(struct kioctx ; } spin_unlock_irq(&ctx->ctx_lock); - unlock_kiocb(req); + if (!kiocbIsDontUnlock(req)) + unlock_kiocb(req); aio_put_req(req); /* drop extra ref to req */ return 0; diff -purN --exclude=description 80_no_net_aio/include/linux/aio.h 815_dont_unlock/include/linux/aio.h --- 80_no_net_aio/include/linux/aio.h 2005-08-08 17:16:06.000000000 -0400 +++ 815_dont_unlock/include/linux/aio.h 2005-08-15 15:32:51.000000000 -0400 @@ -29,6 +29,7 @@ struct kioctx; #define KIF_CANCELLED 2 #define KIF_INTR 3 /* use TASK_INTERRUPTIBLE waits */ #define KIF_SYNCED 4 +#define KIF_DONT_UNLOCK 5 /* don't unlock the iocb after submit */ #define kiocbTryLock(iocb) test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags) #define kiocbTryKick(iocb) test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags) @@ -39,6 +40,7 @@ struct kioctx; #define kiocbSetCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags) #define kiocbSetIntr(iocb) set_bit(KIF_INTR, &(iocb)->ki_flags) #define kiocbSetSynced(iocb) set_bit(KIF_SYNCED, &(iocb)->ki_flags) +#define kiocbSetDontUnlock(iocb) set_bit(KIF_DONT_UNLOCK, &(iocb)->ki_flags) #define kiocbClearLocked(iocb) clear_bit(KIF_LOCKED, &(iocb)->ki_flags) #define kiocbClearKicked(iocb) clear_bit(KIF_KICKED, &(iocb)->ki_flags) @@ -51,6 +53,7 @@ struct kioctx; #define kiocbIsCancelled(iocb) test_bit(KIF_CANCELLED, &(iocb)->ki_flags) #define kiocbIsIntr(iocb) test_bit(KIF_INTR, &(iocb)->ki_flags) #define kiocbIsSynced(iocb) test_bit(KIF_SYNCED, &(iocb)->ki_flags) +#define kiocbIsDontUnlock(iocb) test_bit(KIF_DONT_UNLOCK, &(iocb)->ki_flags) struct kiocb { struct list_head ki_run_list;