shakeloosevcaches drop xvcache during dentry ops

denote that we slept and drop xvcache while doing dentry
flushing.

Change-Id: If597e4153bddce4631383d4c2e1da1faacb720a5
Reviewed-on: http://gerrit.openafs.org/2944
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
Derrick Brashear 2010-10-07 13:41:22 -04:00
parent 78502b61b3
commit 98688ddf70

View File

@ -22,6 +22,8 @@ osi_TryEvictVCache(struct vcache *avc, int *slept) {
/* First, see if we can evict the inode from the dcache */ /* First, see if we can evict the inode from the dcache */
if (avc != afs_globalVp && VREFCOUNT(avc) > 1 && avc->opens == 0) { if (avc != afs_globalVp && VREFCOUNT(avc) > 1 && avc->opens == 0) {
*slept = 1;
ReleaseWriteLock(&afs_xvcache);
AFS_GUNLOCK(); AFS_GUNLOCK();
spin_lock(&dcache_lock); spin_lock(&dcache_lock);
head = &(AFSTOV(avc))->i_dentry; head = &(AFSTOV(avc))->i_dentry;
@ -49,15 +51,21 @@ restart:
spin_unlock(&dcache_lock); spin_unlock(&dcache_lock);
inuse: inuse:
AFS_GLOCK(); AFS_GLOCK();
ObtainWriteLock(&afs_xvcache, 733);
} }
/* See if we can evict it from the VLRUQ */ /* See if we can evict it from the VLRUQ */
if (VREFCOUNT_GT(avc,0) && !VREFCOUNT_GT(avc,1) && avc->opens == 0 if (VREFCOUNT_GT(avc,0) && !VREFCOUNT_GT(avc,1) && avc->opens == 0
&& (avc->f.states & CUnlinkedDel) == 0) { && (avc->f.states & CUnlinkedDel) == 0) {
int didsleep = *slept;
code = afs_FlushVCache(avc, slept); code = afs_FlushVCache(avc, slept);
/* flushvcache wipes slept; restore slept if we did before */
if (didsleep)
*slept = didsleep;
if (code == 0) if (code == 0)
return 1; return 1;
} }
return 0; return 0;