From 74698fbcdbf2a9adfcdd152952e18a10f2c6e80f Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Thu, 15 Apr 2010 00:13:43 -0400 Subject: [PATCH] darwin bulk race needs an iocount if another user raced with us, we need an iocount back since finalize will have dropped one. Change-Id: I93b2bb5b6004b39436684e78c4620f4d7d9d0c8e Reviewed-on: http://gerrit.openafs.org/1756 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/afs/VNOPS/afs_vnop_lookup.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index e0db9ae55..40d0f3195 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -1082,9 +1082,11 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) flagIndex++; ReleaseWriteLock(&tvcp->lock); #ifdef AFS_DARWIN80_ENV - if (!isdead) - /* re-acquire the usecount that the other finalizevnode disposed of */ + if (!isdead) { + /* re-acquire the io&usecount that the other finalizevnode disposed of */ + vnode_get(AFSTOV(tvcp)); vnode_ref(AFSTOV(tvcp)); + } #endif afs_PutVCache(tvcp); continue; @@ -1142,9 +1144,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)&&!(tvcp->f.states & CVInit))) - /* re-acquire the usecount that the other finalizevnode disposed of */ + if ((!(tvcp->f.states & CDeadVnode)&&!(tvcp->f.states & CVInit))) { + /* re-acquire the io&usecount that the other finalizevnode disposed of */ + vnode_get(AFSTOV(tvcp)); vnode_ref(AFSTOV(tvcp)); + } #endif ReleaseWriteLock(&tvcp->lock); ReleaseWriteLock(&afs_xcbhash); @@ -1214,9 +1218,11 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) afs_DequeueCallback(tvcp); if ((tvcp->f.states & CForeign) || (vType(tvcp) == VDIR)) osi_dnlc_purgedp(tvcp); /* if it (could be) a directory */ - } else - /* re-acquire the usecount that finalizevnode disposed of */ + } else { + /* re-acquire the io&usecount that finalizevnode disposed of */ + vnode_get(AFSTOV(tvcp)); vnode_ref(AFSTOV(tvcp)); + } } #endif @@ -1256,9 +1262,11 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) } if (tvcp != NULL) { #ifdef AFS_DARWIN80_ENV - if ((!(tvcp->f.states & CDeadVnode)&&!(tvcp->f.states & CVInit))) - /* re-acquire the usecount that the other finalizevnode disposed of */ + if ((!(tvcp->f.states & CDeadVnode)&&!(tvcp->f.states & CVInit))) { + /* re-acquire the io&usecount that the other finalizevnode disposed of */ + vnode_get(AFSTOV(tvcp)); vnode_ref(AFSTOV(tvcp)); + } #endif afs_PutVCache(tvcp); } -- 2.39.5