[PATCH] aio: remove aio_max_nr accounting race
authorZach Brown <zach.brown@oracle.com>
Mon, 7 Nov 2005 08:59:31 +0000 (00:59 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 7 Nov 2005 15:53:38 +0000 (07:53 -0800)
commitd55b5fdaf40846221d543937b786956e27837fda
treeecdf572d7d2b08b4f7b31d804542a920934b6d9a
parent0f6ed7c2641fe4cea83cd09c21928ca30c0983ec
[PATCH] aio: remove aio_max_nr accounting race

AIO was adding a new context's max requests to the global total before
testing if that resulting total was over the global limit.  This let
innocent tasks get their new limit tested along with a racing guilty task
that was crossing the limit.  This serializes the _nr accounting with a
spinlock It also switches to using unsigned long for the global totals.
Individual contexts are still limited to an unsigned int's worth of
requests by the syscall interface.

The problem and fix were verified with a simple program that spun creating
and destroying a context while holding on to another long lived context.
Before the patch a task creating a tiny context could get a spurious EAGAIN
if it raced with a task creating a very large context that overran the
limit.

Signed-off-by: Zach Brown <zach.brown@oracle.com>
Cc: Benjamin LaHaise <bcrl@kvack.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/aio.c
include/linux/aio.h
kernel/sysctl.c