DAFS: Wait for exclusive ops in FSYNC_VOL_OFF
authorAndrew Deason <adeason@sinenomine.net>
Mon, 2 Nov 2009 23:18:19 +0000 (17:18 -0600)
committerDerrick Brashear <shadow|account-1000005@unknown>
Tue, 3 Nov 2009 19:40:58 +0000 (11:40 -0800)
commit5e6842283f5c2fdf0fe3306993a6e18c2e590716
treeac637f3881c8f5f940d6709eb15cf1ced8cee59f
parent93d48b1735b88b3051357307bdbebf5da9872d69
DAFS: Wait for exclusive ops in FSYNC_VOL_OFF

In the FSYNC_VOL_OFF handler, fssync-server.c errors out if the call to
VGetVolumeByVp_r fails. However, this can fail if the volume is in an
error state such as SALVAGING. Normally we don't even call GetVolume
when the volume is salvaging, but the volume state can change to
SALVAGING inside GetVolume. This is particularly likely to happen on a
demand salvage, since we switch to the SALVSYNC_REQ state when
scheduling the salvage, and if we are still in that state when the
salvaged child requests a VOL_OFF, we will fail to get the heavyweight
ref.

Fix this in two ways. First, we VWaitExclusiveState_r before examining
states for the short-circuit logic so our view of the volume state is
more accurate. Second, re-examine the volume state after the call to
GetVolume, and perform the same short-circuit logic, since the volume
state may have changed during GetVolume.

Change-Id: I4ebb87691c28170b42e0056b342477a12d0f6888
Reviewed-on: http://gerrit.openafs.org/769
Tested-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/vol/fssync-server.c