[AIO] fix iocb run deadlock introduced in lock_kiocb Calling __aio_run_iocbs can result in a deadlock if an iocb on the run list has its lock held by the caller. Fix this by only running the iocb list *after* having run and unlocked the iocb just submitted. Signed-off-by: Benjamin LaHaise diff -purN --exclude=description 815_dont_unlock/fs/aio.c 816_iocb_run_deadlock/fs/aio.c --- 815_dont_unlock/fs/aio.c 2005-08-15 15:34:25.000000000 -0400 +++ 816_iocb_run_deadlock/fs/aio.c 2005-08-17 13:46:21.000000000 -0400 @@ -1558,17 +1558,15 @@ int fastcall io_submit_one(struct kioctx goto out_put_req; spin_lock_irq(&ctx->ctx_lock); - if (likely(list_empty(&ctx->run_list))) { - aio_run_iocb(req); - } else { - list_add_tail(&req->ki_run_list, &ctx->run_list); + aio_run_iocb(req); + if (!kiocbIsDontUnlock(req)) + unlock_kiocb(req); + if (!list_empty(&ctx->run_list)) { /* drain the run list */ while (__aio_run_iocbs(ctx)) ; } spin_unlock_irq(&ctx->ctx_lock); - if (!kiocbIsDontUnlock(req)) - unlock_kiocb(req); aio_put_req(req); /* drop extra ref to req */ return 0;