From: Al Viro Date: Tue, 20 Mar 2012 20:27:57 +0000 (-0400) Subject: aio: take final put_ioctx() into callers of io_destroy() X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=a2e1859adb3b05fa99f87a67df9ef2a4b7b04a13;p=openwrt%2Fstaging%2Fblogic.git aio: take final put_ioctx() into callers of io_destroy() Signed-off-by: Al Viro --- diff --git a/fs/aio.c b/fs/aio.c index fe37a94127e7..da887604dfc5 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -1270,7 +1270,6 @@ static void io_destroy(struct kioctx *ioctx) * locking done by the above calls to ensure this consistency. */ wake_up_all(&ioctx->wait); - put_ioctx(ioctx); /* once for the lookup */ } /* sys_io_setup: @@ -1307,11 +1306,9 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp) ret = PTR_ERR(ioctx); if (!IS_ERR(ioctx)) { ret = put_user(ioctx->user_id, ctxp); - if (!ret) { - put_ioctx(ioctx); - return 0; - } - io_destroy(ioctx); + if (ret) + io_destroy(ioctx); + put_ioctx(ioctx); } out: @@ -1329,6 +1326,7 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) struct kioctx *ioctx = lookup_ioctx(ctx); if (likely(NULL != ioctx)) { io_destroy(ioctx); + put_ioctx(ioctx); return 0; } pr_debug("EINVAL: io_destroy: invalid context id\n");