From: Derrick Brashear Date: Thu, 25 Feb 2010 21:52:02 +0000 (-0500) Subject: macos bulkstat cleanup after racing stats X-Git-Tag: openafs-devel-1_5_73~129 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=93e9964039a1b627f991e796495be49ea0b6fdb1;p=packages%2Fo%2Fopenafs.git macos bulkstat cleanup after racing stats if someone else stats it before we finish, make sure we clean up after ourselves properly Change-Id: I4a7257a403cccb02a114c60f5bb340dba6bb16cb Reviewed-on: http://gerrit.openafs.org/1399 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index 1e314fa5c..7dd104ef8 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -1052,8 +1052,16 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) * file. Leave the entry alone. */ if (!(tvcp->f.states & CBulkFetching) || (tvcp->f.m.Length != statSeqNo)) { +#ifdef AFS_DARWIN80_ENV + int isdead = (tvcp->f.states & CDeadVnode); +#endif flagIndex++; ReleaseWriteLock(&tvcp->lock); +#ifdef AFS_DARWIN80_ENV + if (!isdead) + /* re-acquire the usecount that the other finalizevnode disposed of */ + vnode_ref(AFSTOV(tvcp)); +#endif afs_PutVCache(tvcp); continue; } @@ -1104,6 +1112,11 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) */ if (!(tvcp->f.states & CBulkFetching) || (tvcp->f.m.Length != statSeqNo)) { flagIndex++; +#ifdef AFS_DARWIN80_ENV + if ((tvcp->f.states & CDeadVnode) == 0) + /* re-acquire the usecount that the other finalizevnode disposed of */ + vnode_ref(AFSTOV(tvcp)); +#endif ReleaseWriteLock(&tvcp->lock); ReleaseWriteLock(&afs_xcbhash); afs_PutVCache(tvcp); @@ -1211,6 +1224,11 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) tvcp->f.states &= ~CBulkFetching; } if (tvcp != NULL) { +#ifdef AFS_DARWIN80_ENV + if ((tvcp->f.states & CDeadVnode) == 0) + /* re-acquire the usecount that the other finalizevnode disposed of */ + vnode_ref(AFSTOV(tvcp)); +#endif afs_PutVCache(tvcp); } } @@ -1611,7 +1629,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, afs_ucred_t *acr /* if the vcache isn't usable, release it */ if (tvc && !(tvc->f.states & CStatd)) { #ifndef AFS_FBSD80_ENV - afs_PutVCache(tvc); + afs_PutVCache(tvc); #endif tvc = NULL; }