macos104-not-yet-20050512
authorDerrick Brashear <shadow@dementia.org>
Fri, 13 May 2005 04:00:24 +0000 (04:00 +0000)
committerDerrick Brashear <shadow@dementia.org>
Fri, 13 May 2005 04:00:24 +0000 (04:00 +0000)
virtualize vnode refcount "greater than" testing so we can use tiger primitive

src/afs/DARWIN/osi_machdep.h
src/afs/DARWIN/osi_vnodeops.c
src/afs/FBSD/osi_vm.c
src/afs/VNOPS/afs_vnop_lookup.c
src/afs/VNOPS/afs_vnop_remove.c
src/afs/afs.h
src/afs/afs_vcache.c

index 14bc7dd..8028a93 100644 (file)
@@ -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
index d632336..71e65e4 100644 (file)
@@ -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
 
index 5634658..f584368 100644 (file)
@@ -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)
index 271b639..90fa84e 100644 (file)
@@ -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
index 8a63231..d78554c 100644 (file)
@@ -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
     {
index ab81b9b..b0d8c2d 100644 (file)
@@ -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))
index 70ff491..0d19994 100644 (file)
@@ -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) {