NFSv4.1: Fix the callback 'highest_used_slotid' behaviour
commitf4bc412bc2f46d644375403b601f42d8487949da
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 2 Aug 2011 18:46:29 +0000 (2 14:46 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 29 Aug 2011 20:29:08 +0000 (29 13:29 -0700)
tree29dd599a646a6d11a16109ae566e971549cbed7b
parentb861a2580da034f6a57517c687ded68e20f99763
NFSv4.1: Fix the callback 'highest_used_slotid' behaviour

commit 55a673990ec04cf63005318bcf08c2b0046e5778 upstream.

Currently, there is no guarantee that we will call nfs4_cb_take_slot() even
though nfs4_callback_compound() will consistently call
nfs4_cb_free_slot() provided the cb_process_state has set the 'clp' field.
The result is that we can trigger the BUG_ON() upon the next call to
nfs4_cb_take_slot().

This patch fixes the above problem by using the slot id that was taken in
the CB_SEQUENCE operation as a flag for whether or not we need to call
nfs4_cb_free_slot().
It also fixes an atomicity problem: we need to set tbl->highest_used_slotid
atomically with the check for NFS4_SESSION_DRAINING, otherwise we end up
racing with the various tests in nfs4_begin_drain_session().

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/nfs/callback.h
fs/nfs/callback_proc.c
fs/nfs/callback_xdr.c