discon remove dirty vcaches from queue when discarding

the discardall loop was not dequeueing vcaches, meaning we would loop.
caught by Simon Wilkinson

Change-Id: I80256ef5f91d7030e0cb11e78a79f137a217a29a
Reviewed-on: http://gerrit.openafs.org/2513
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
Derrick Brashear 2010-08-04 09:04:34 -04:00
parent 6d0b97c7ac
commit 7556326e01

View File

@ -1338,14 +1338,15 @@ afs_DisconDiscardAll(afs_ucred_t *acred)
ObtainWriteLock(&afs_disconDirtyLock, 717); ObtainWriteLock(&afs_disconDirtyLock, 717);
while (!QEmpty(&afs_disconDirty)) { while (!QEmpty(&afs_disconDirty)) {
tvc = QEntry(QPrev(&afs_disconDirty), struct vcache, dirtyq); tvc = QEntry(QPrev(&afs_disconDirty), struct vcache, dirtyq);
QRemove(&tvc->dirtyq);
ReleaseWriteLock(&afs_disconDirtyLock); ReleaseWriteLock(&afs_disconDirtyLock);
ObtainWriteLock(&tvc->lock, 718); ObtainWriteLock(&tvc->lock, 718);
afs_ResetVCache(tvc, acred); afs_ResetVCache(tvc, acred);
tvc->f.truncPos = AFS_NOTRUNC; tvc->f.truncPos = AFS_NOTRUNC;
ReleaseWriteLock(&tvc->lock); ReleaseWriteLock(&tvc->lock);
afs_PutVCache(tvc);
ObtainWriteLock(&afs_disconDirtyLock, 719); ObtainWriteLock(&afs_disconDirtyLock, 719);
afs_PutVCache(tvc);
} }
afs_DisconDiscardAllShadows(1, acred); afs_DisconDiscardAllShadows(1, acred);