afs: Clear VHardMount on ResetVolumeInfo

afs_Analyze sets VHardMount on a volume struct when a hard-mount
scenario is encountered, and clears it after sleeping. However, if the
volume struct has VRecheck set, or if it's not in memory, afs_Analyze
cannot retrieve the volume struct in order to clear VHardMount again.

For the VRecheck case, this can results in VHardMount never getting
cleared, and so hard-mount messages for the volume seem to disappear.
So, clear VHardMount when we set VRecheck so this does not occur.

For the case where the volume struct is not in memory, this is not a
problem, since when we allocate a volume struct again, the VHardMount
state will not be retained.

Reviewed-on: http://gerrit.openafs.org/6335
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
(cherry picked from commit f469be407789e696c0b9e9a431b4879798a00e2a)

Change-Id: If13769445f20336dfba9755f3af0a1499ce16a6d
Reviewed-on: http://gerrit.openafs.org/6348
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: Derrick Brashear <shadow@dementix.org>
This commit is contained in:
Andrew Deason 2011-12-14 14:42:08 -06:00 committed by Derrick Brashear
parent 09fe35b1f3
commit f8818eb569

View File

@ -1194,6 +1194,11 @@ afs_ResetVolumeInfo(struct volume *tv)
AFS_STATCNT(afs_ResetVolumeInfo);
ObtainWriteLock(&tv->lock, 117);
tv->states |= VRecheck;
/* the hard-mount code in afs_Analyze may not be able to reset this flag
* when VRecheck is set, so clear it here to ensure it gets cleared. */
tv->states &= ~VHardMount;
for (i = 0; i < AFS_MAXHOSTS; i++)
tv->status[i] = not_busy;
if (tv->name) {