From 65682542456058462ff9cfa41543a6d5024721c6 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Fri, 13 May 2005 04:00:24 +0000 Subject: [PATCH] macos104-not-yet-20050512 virtualize vnode refcount "greater than" testing so we can use tiger primitive --- src/afs/DARWIN/osi_machdep.h | 14 +++++++++ src/afs/DARWIN/osi_vnodeops.c | 9 +++--- src/afs/FBSD/osi_vm.c | 2 +- src/afs/VNOPS/afs_vnop_lookup.c | 24 ++------------- src/afs/VNOPS/afs_vnop_remove.c | 7 ++--- src/afs/afs.h | 16 ++++++---- src/afs/afs_vcache.c | 53 ++++++++++++++------------------- 7 files changed, 59 insertions(+), 66 deletions(-) diff --git a/src/afs/DARWIN/osi_machdep.h b/src/afs/DARWIN/osi_machdep.h index 14bc7dd09..8028a935c 100644 --- a/src/afs/DARWIN/osi_machdep.h +++ b/src/afs/DARWIN/osi_machdep.h @@ -58,6 +58,20 @@ enum vcexcl { EXCL, NONEXCL }; #define ifnet_metric(x) (x?(x)->if_data.ifi_metric:0) #endif +#ifndef AFS_DARWIN80_ENV +#define ifaddr_address_family(x) (x)->ifa_addr->sa_family +#define ifaddr_address(x, y, z) memcpy(y, (x)->ifa_addr, z) +#define ifaddr_netmask(x, y, z) memcpy(y, (x)->ifa_netmask, z) +#define ifaddr_dstaddress(x, y, z) memcpy(y, (x)->ifa_dstaddr, z) +#define ifaddr_ifnet(x) (x?(x)->ifa_ifp:0) +#define ifnet_flags(x) (x?(x)->if_flags:0) +#define ifnet_metric(x) (x?(x)->if_data.ifi_metric:0) + +#define vnode_clearfsnode(x) ((x)->v_data = 0) +#define vnode_fsnode(x) (x)->v_data +#define vnode_lock(x) vn_lock(x, LK_EXCLUSIVE | LK_RETRY, current_proc()); +#endif + #ifdef AFS_DARWIN80_ENV #define vrele vnode_rele #define vput vnode_put diff --git a/src/afs/DARWIN/osi_vnodeops.c b/src/afs/DARWIN/osi_vnodeops.c index d632336bc..71e65e41c 100644 --- a/src/afs/DARWIN/osi_vnodeops.c +++ b/src/afs/DARWIN/osi_vnodeops.c @@ -153,15 +153,16 @@ darwin_vn_hold(struct vnode *vp) ourselves during vop_inactive, except we also need to not reinst the ubc... so we just call VREF there now anyway. */ + if (VREFCOUNT_GT(tvc, 0)) #ifdef AFS_DARWIN80_ENV - if (vnode_isinuse(vp)) vnode_ref(vp); - else - vnode_get(vp); #else - if (VREFCOUNT(tvc) > 0) VREF(((struct vnode *)(vp))); +#endif else +#ifdef AFS_DARWIN80_ENV + vnode_get(vp); +#else afs_vget(afs_globalVFS, 0, (vp)); #endif diff --git a/src/afs/FBSD/osi_vm.c b/src/afs/FBSD/osi_vm.c index 563465847..f58436881 100644 --- a/src/afs/FBSD/osi_vm.c +++ b/src/afs/FBSD/osi_vm.c @@ -86,7 +86,7 @@ osi_VM_FlushVCache(struct vcache *avc, int *slept) { struct vm_object *obj; struct vnode *vp; - if (VREFCOUNT(avc) > 1) + if (VREFCOUNT_GT(avc, 1)) return EBUSY; if (avc->opens) diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index 271b639e3..90fa84ef2 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -1177,15 +1177,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED *avcp = tvc; code = (tvc ? 0 : ENOENT); hit = 1; -#ifdef AFS_DARWIN80_ENV - if (tvc && !vnode_isinuse(AFSTOV(tvc))) { + if (tvc && !VREFCOUNT_GT(tvc, 0)) { osi_Panic("TT1"); } -#else - if (tvc && !VREFCOUNT(tvc)) { - osi_Panic("TT1"); - } -#endif if (code) { /*printf("LOOKUP GETVCDOTDOT -> %d\n", code); */ } @@ -1219,15 +1213,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED code = 0; *avcp = tvc = adp; hit = 1; -#ifdef AFS_DARWIN80_ENV - if (adp && !vnode_isinuse(AFSTOV(adp))) { - osi_Panic("TT2"); - } -#else - if (adp && !VREFCOUNT(adp)) { + if (adp && !VREFCOUNT_GT(adp, 0)) { osi_Panic("TT2"); } -#endif goto done; } @@ -1509,15 +1497,9 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, struct AFS_UCRED } } *avcp = tvc; -#ifdef AFS_DARWIN80_ENV - if (tvc && !vnode_isinuse(AFSTOV(tvc))) { - osi_Panic("TT3"); - } -#else - if (tvc && !VREFCOUNT(tvc)) { + if (tvc && !VREFCOUNT_GT(tvc, 0)) { osi_Panic("TT3"); } -#endif code = 0; } else { /* if we get here, we found something in a directory that couldn't diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c index 8a6323120..d78554c8a 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -375,15 +375,12 @@ afs_remove(OSI_VC_ARG(adp), aname, acred) if (tvc) #ifndef AFS_DARWIN80_ENV Ttvcr = VREFCOUNT(tvc); +#endif #ifdef AFS_AIX_ENV if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0 && !(tvc->states & CUnlinked)) #else - if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0 - && !(tvc->states & CUnlinked)) -#endif -#else - if (tvc && (vnode_isinuse(AFSTOV(tvc))) && tvc->opens > 0 + if (tvc && (VREFCOUNT_GT(tvc), 1) && tvc->opens > 0 && !(tvc->states & CUnlinked)) #endif { diff --git a/src/afs/afs.h b/src/afs/afs.h index ab81b9b0a..b0d8c2dc5 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -557,13 +557,20 @@ struct SimpleLocks { #define vrefCount v.v_count #endif /* AFS_XBSD_ENV */ -#if defined(AFS_LINUX24_ENV) +/* VREFCOUNT_GT works on vnodes, not vcaches. maybe this is bad? */ +#if defined(AFS_DARWIN80_ENV) +#define VREFCOUNT_GT(v, y) vnode_isinuse(AFSTOV(v), y) +#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) +#define VREFCOUNT_GT(v, y) (AFSTOV(v)->v_usecount>y?1:0) +#elif defined(AFS_LINUX24_ENV) #define VREFCOUNT(v) atomic_read(&((vnode_t *) v)->v_count) +#define VREFCOUNT_GT(v, y) ((atomic_read(&((vnode_t *) v)->v_count)>y)?1:0) #define VREFCOUNT_SET(v, c) atomic_set(&((vnode_t *) v)->v_count, c) #define VREFCOUNT_DEC(v) atomic_dec(&((vnode_t *) v)->v_count) #define VREFCOUNT_INC(v) atomic_inc(&((vnode_t *) v)->v_count) #else #define VREFCOUNT(v) ((v)->vrefCount) +#define VREFCOUNT_GT(v,y) ((v).v_count>y?1:0) #define VREFCOUNT_SET(v, c) (v)->vrefCount = c; #define VREFCOUNT_DEC(v) (v)->vrefCount--; #define VREFCOUNT_INC(v) (v)->vrefCount++; @@ -594,12 +601,11 @@ struct vtodc { extern afs_uint32 afs_stampValue; /* stamp for pair's usage */ #define MakeStamp() (++afs_stampValue) -#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) -#ifdef AFS_DARWIN80_ENV +#if defined(AFS_DARWIN_ENV) #define VTOAFS(v) ((struct vcache *)vnode_fsnode((v))) -#else +#define AFSTOV(vc) ((vc)->v) +#elif defined(AFS_XBSD_ENV) #define VTOAFS(v) ((struct vcache *)(v)->v_data) -#endif #define AFSTOV(vc) ((vc)->v) #else #define VTOAFS(V) ((struct vcache *)(V)) diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 70ff4914e..0d1999451 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -187,8 +187,12 @@ afs_FlushVCache(struct vcache *avc, int *slept) /* OK, there are no internal vrefCounts, so there shouldn't * be any more refs here. */ if (avc->v) { +#ifdef AFS_DARWIN_ENV + vnode_clearfsnode(AFSTOV(avc)); +#else avc->v->v_data = NULL; /* remove from vnode */ - avc->v = NULL; /* also drop the ptr to vnode */ +#endif + AFSTOV(avc) = NULL; /* also drop the ptr to vnode */ } #endif afs_FreeAllAxs(&(avc->Access)); @@ -231,11 +235,7 @@ afs_FlushVCache(struct vcache *avc, int *slept) /* This should put it back on the vnode free list since usecount is 1 */ afs_vcount--; vSetType(avc, VREG); -#ifdef AFS_DARWIN80_ENV - if (vnode_isinuse(AFSTOV(avc), 0)) { -#else - if (VREFCOUNT(avc) > 0) { -#endif + if (VREFCOUNT_GT(avc,0)) { VN_UNLOCK(AFSTOV(avc)); AFS_RELE(AFSTOV(avc)); } else { @@ -619,18 +619,10 @@ afs_NewVCache(struct VenusFid *afid, struct server *serverp) refpanic("Exceeded pool of AFS vnodes(VLRU cycle?)"); else if (QNext(uq) != tq) refpanic("VLRU inconsistent"); -#ifdef AFS_DARWIN80_ENV - else if (!vnode_isinuse(AFSTOV(tvc), 0)) -#else - else if (VREFCOUNT(tvc) < 1) -#endif - refpanic("refcnt 0 on VLRU"); - -#ifdef AFS_DARWIN80_ENV - if (vnode_isinuse(AFSTOV(tvc), 0) && -#else - if (VREFCOUNT(tvc) == 1 && -#endif + else if (!VREFCOUNT_GT(tvc,0)) + refpanic("refcnt 0 on VLRU"); + + if (VREFCOUNT_GT(tvc,0) && !VREFCOUNT_GT(tvc,1) && tvc->opens == 0 && (tvc->states & CUnlinkedDel) == 0) { code = afs_FlushVCache(tvc, &fv_slept); @@ -724,16 +716,13 @@ restart: } #endif -#ifdef AFS_DARWIN80_ENV - if (!vnode_isinuse(AFSTOV(tvc), 0 -#else - if (((VREFCOUNT(tvc) == 0) -#if defined(AFS_DARWIN_ENV) && !defined(UKERNEL) - || ((VREFCOUNT(tvc) == 1) && - (UBCINFOEXISTS(AFSTOV(tvc)))) + + if (!VREFCOUNT_GT(tvc,0) +#if defined(AFS_DARWIN_ENV) && !defined(UKERNEL) && !defined(AFS_DARWIN80_ENV) + || ((VREFCOUNT(tvc) == 1) && + (UBCINFOEXISTS(AFSTOV(tvc)))) #endif -#endif - ) && tvc->opens == 0 && (tvc->states & CUnlinkedDel) == 0) { + && tvc->opens == 0 && (tvc->states & CUnlinkedDel) == 0) { #if defined (AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV) /* * vgone() reclaims the vnode, which calls afs_FlushVCache(), @@ -1189,7 +1178,7 @@ afs_FlushActiveVcaches(register afs_int32 doflocks) /* * That's because if we come in via the CUnlinkedDel bit state path we'll be have 0 refcnt */ - osi_Assert(VREFCOUNT(tvc) > 0); + osi_Assert(VREFCOUNT_GT(tvc,0)); AFS_RWLOCK((vnode_t *) tvc, VRWLOCK_WRITE); #endif ObtainWriteLock(&tvc->lock, 52); @@ -1749,7 +1738,7 @@ afs_GetVCache(register struct VenusFid *afid, struct vrequest *areq, #if defined(AFS_DARWIN_ENV) iheldthelock = VOP_ISLOCKED(vp); if (!iheldthelock) - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, current_proc()); + vnode_lock(vp); /* this is messy. we can call fsync which will try to reobtain this */ if (VTOAFS(vp) == tvc) ReleaseWriteLock(&tvc->lock); @@ -1759,7 +1748,11 @@ afs_GetVCache(register struct VenusFid *afid, struct vrequest *areq, if (VTOAFS(vp) == tvc) ObtainWriteLock(&tvc->lock, 954); if (!iheldthelock) +#ifdef AFS_DARWIN80_ENV + vnode_unlock(vp); +#else VOP_UNLOCK(vp, LK_EXCLUSIVE, current_proc()); +#endif #elif defined(AFS_FBSD60_ENV) iheldthelock = VOP_ISLOCKED(vp, curthread); if (!iheldthelock) @@ -2860,7 +2853,7 @@ shutdown_vcache(void) vms_delete(tvc->segid); AFS_GLOCK(); tvc->segid = tvc->vmh = NULL; - if (VREFCOUNT(tvc)) + if (VREFCOUNT_GT(tvc,0)) osi_Panic("flushVcache: vm race"); } if (tvc->credp) { -- 2.39.5