linux/include
Trond Myklebust bf294b41ce SUNRPC: Close a race in __rpc_wait_for_completion_task()
Although they run as rpciod background tasks, under normal operation
(i.e. no SIGKILL), functions like nfs_sillyrename(), nfs4_proc_unlck()
and nfs4_do_close() want to be fully synchronous. This means that when we
exit, we want all references to the rpc_task to be gone, and we want
any dentry references etc. held by that task to be released.

For this reason these functions call __rpc_wait_for_completion_task(),
followed by rpc_put_task() in the expectation that the latter will be
releasing the last reference to the rpc_task, and thus ensuring that the
callback_ops->rpc_release() has been called synchronously.

This patch fixes a race which exists due to the fact that
rpciod calls rpc_complete_task() (in order to wake up the callers of
__rpc_wait_for_completion_task()) and then subsequently calls
rpc_put_task() without ensuring that these two steps are done atomically.

In order to avoid adding new spin locks, the patch uses the existing
waitqueue spin lock to order the rpc_task reference count releases between
the waiting process and rpciod.
The common case where nobody is waiting for completion is optimised for by
checking if the RPC_TASK_ASYNC flag is cleared and/or if the rpc_task
reference count is 1: in those cases we drop trying to grab the spin lock,
and immediately free up the rpc_task.

Those few processes that need to put the rpc_task from inside an
asynchronous context and that do not care about ordering are given a new
helper: rpc_put_task_async().

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
2011-03-10 15:04:52 -05:00
..
acpi Merge branch 'acpica' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2011-01-20 16:28:34 -08:00
asm-generic mm: <asm-generic/pgtable.h> must include <linux/mm_types.h> 2011-02-28 17:46:49 -08:00
crypto crypto: padlock - Move padlock.h into include/crypto 2011-01-07 14:52:00 +11:00
drm drm: fix unsigned vs signed comparison issue in modeset ctl ioctl. 2011-02-28 15:24:35 +10:00
keys RxRPC: Fix v1 keys 2011-03-02 22:18:53 -08:00
linux SUNRPC: Close a race in __rpc_wait_for_completion_task() 2011-03-10 15:04:52 -05:00
math-emu
media [media] v4l: Include linux/videodev2.h in media/v4l2-ctrls.h 2011-01-19 11:52:09 -02:00
mtd
net net_sched: long word align struct qdisc_skb_cb data 2011-02-23 14:17:02 -08:00
pcmcia pcmcia: re-enable Zoomed Video support 2011-02-20 12:47:34 +01:00
rdma RDMA: Update workqueue usage 2011-01-16 21:16:31 -08:00
rxrpc
scsi [SCSI] fix incorrect value of SCSI_MAX_SG_CHAIN_SEGMENTS due to include file ordering 2011-01-24 11:49:34 -06:00
sound ASoC: WM8903: Fix mic detection register definitions 2011-02-13 19:38:06 +00:00
target [SCSI] target: fix use after free detected by SLUB poison 2011-02-12 12:32:41 -06:00
trace blktrace: Remove blk_fill_rwbs_rq. 2011-03-03 10:53:20 -05:00
video Merge branch 'fbdev/udlfb' 2011-01-06 18:10:09 +09:00
xen Merge branch 'stable/gntdev' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen 2011-01-13 18:46:48 -08:00
Kbuild