linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] aio: fix kiocb_cancel() funcition
@ 2014-01-27  8:45 Robert Baldyga
  2014-01-27 17:36 ` Benjamin LaHaise
  0 siblings, 1 reply; 2+ messages in thread
From: Robert Baldyga @ 2014-01-27  8:45 UTC (permalink / raw)
  To: viro
  Cc: bcrl, kmo, linux-fsdevel, linux-aio, linux-kernel, m.szyprowski,
	Robert Baldyga

This patch solves problem related with lack of possibility to call
aio_complete() from cancel callback. It was because it needs to lock
ctx->ctx_lock which is always locked before kiocb_cancel() call. So there
was no way to complete request properly.

Now spinlock is unlocked before cancel callback function call, so spinlock
recursion will not occur in case of aio_complete() call. After cancel function
call spinlock is locked back.

There is also __must_hold() macro added for kiocb_cancel() function, to allow
sparse spin lock checking.

Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
---

This patch was created according to suggestions of Benjamin LaHaise
(https://lkml.org/lkml/2014/1/23/336).

 fs/aio.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/fs/aio.c b/fs/aio.c
index 062a5f6..6d5cd9e 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -472,8 +472,10 @@ void kiocb_set_cancel_fn(struct kiocb *req, kiocb_cancel_fn *cancel)
 EXPORT_SYMBOL(kiocb_set_cancel_fn);
 
 static int kiocb_cancel(struct kioctx *ctx, struct kiocb *kiocb)
+			__must_hold(&ctx->ctx_lock)
 {
 	kiocb_cancel_fn *old, *cancel;
+	int ret;
 
 	/*
 	 * Don't want to set kiocb->ki_cancel = KIOCB_CANCELLED unless it
@@ -489,7 +491,15 @@ static int kiocb_cancel(struct kioctx *ctx, struct kiocb *kiocb)
 		cancel = cmpxchg(&kiocb->ki_cancel, old, KIOCB_CANCELLED);
 	} while (cancel != old);
 
-	return cancel(kiocb);
+	/*
+	 * cancel() function may call aio_complete function, which needs to
+	 * lock ctx->ctx_lock, so we call cancel() with spinlock unlocked
+	 */
+	spin_unlock(&ctx->ctx_lock);
+	ret = cancel(kiocb);
+	spin_lock(&ctx->ctx_lock);
+
+	return ret;
 }
 
 static void free_ioctx(struct work_struct *work)
-- 
1.7.9.5

--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org.  For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-01-27 17:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-27  8:45 [PATCH] aio: fix kiocb_cancel() funcition Robert Baldyga
2014-01-27 17:36 ` Benjamin LaHaise

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).