]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE12-darwin-updates-20040623
authorDerrick Brashear <shadow@dementia.org>
Mon, 18 Oct 2004 06:45:36 +0000 (06:45 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 18 Oct 2004 06:45:36 +0000 (06:45 +0000)
this should be switched to use the freebsd style getnewvnode

perhaps it will be

12 files changed:
src/afs/DARWIN/osi_vm.c
src/afs/DARWIN/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_remove.c
src/afs/afs_vcache.c
src/config/param.ppc_darwin_12.h
src/config/param.ppc_darwin_12_usr.h
src/config/param.ppc_darwin_13.h
src/config/param.ppc_darwin_13_usr.h
src/config/param.ppc_darwin_14.h
src/config/param.ppc_darwin_14_usr.h
src/config/param.ppc_darwin_70.h
src/config/param.ppc_darwin_70_usr.h

index 8f924183ec39594d8719bbfbb5e7b160a6a22421..78324189e19bc75b3bff9ce48d879a6ae59b0d52 100644 (file)
@@ -43,7 +43,7 @@ osi_VM_FlushVCache(avc, slept)
     if (UBCINFOEXISTS(vp))
        return EBUSY;
 #endif
-    if (avc->vrefCount)
+    if (avc->vrefCount > DARWIN_REFBASE)
        return EBUSY;
 
     if (avc->opens)
@@ -179,6 +179,9 @@ void osi_VM_TryReclaim(avc, slept)
     struct proc *p=current_proc();
     struct vnode *vp=AFSTOV(avc);
     void *obj;
+#ifdef AFS_DARWIN14_ENV
+    int didhold;
+#endif
 
     if (slept)
        *slept=0;
@@ -187,7 +190,7 @@ void osi_VM_TryReclaim(avc, slept)
         AFS_RELE(vp);
         return;
     }
-    if (!UBCINFOEXISTS(vp) || vp->v_count != 2) {
+    if (!UBCINFOEXISTS(vp) || vp->v_usecount != 2+DARWIN_REFBASE) {
         simple_unlock(&vp->v_interlock);
         AFS_RELE(vp);
         return;
@@ -198,6 +201,11 @@ void osi_VM_TryReclaim(avc, slept)
         AFS_RELE(vp);
         return;
     }
+    if (ISSET(vp->v_flag, VORECLAIM)) {
+       simple_unlock(&vp->v_interlock);
+       AFS_RELE(vp);
+       return;
+    }
 #else
     if (vp->v_ubcinfo->ui_holdcnt) {
         simple_unlock(&vp->v_interlock);
@@ -212,7 +220,9 @@ void osi_VM_TryReclaim(avc, slept)
         return;
     }
 
+#ifndef AFS_DARWIN14_ENV
     vp->v_usecount--; /* we want the usecount to be 1 */
+#endif
 
     if (slept) {
         ReleaseWriteLock(&afs_xvcache);
@@ -229,48 +239,92 @@ void osi_VM_TryReclaim(avc, slept)
         ubc_release(vp);
 #endif
         if (ubc_issetflags(vp, UI_HASOBJREF))
-            printf("ubc_release didn't release the reference?!\n");
-    } else if (!vn_lock(vp, LK_EXCLUSIVE|LK_INTERLOCK,current_proc())) {
+           printf("ubc_release didn't release the reference?!\n");
+    } else {
+#ifdef AFS_DARWIN14_ENV
+       SET(vp->v_flag, VORECLAIM);
+#endif
+       if (!vn_lock(vp, LK_EXCLUSIVE|LK_INTERLOCK,current_proc())) {
 #ifdef AFS_DARWIN14_ENV
-        obj = ubc_getobject(vp,UBC_HOLDOBJECT);
+           obj = ubc_getobject(vp,UBC_HOLDOBJECT);
+           if ((didhold = ubc_hold(vp)))
+               (void)ubc_clean(vp, 0);
 #else
 #ifdef AFS_DARWIN13_ENV
-        obj = ubc_getobject(vp,(UBC_NOREACTIVATE|UBC_HOLDOBJECT));
+           obj = ubc_getobject(vp,(UBC_NOREACTIVATE|UBC_HOLDOBJECT));
 #else
-        obj = ubc_getobject(vp);
+           obj = ubc_getobject(vp);
 #endif
+           (void)ubc_clean(vp, 1);
 #endif
-        (void)ubc_clean(vp, 1);
-        vinvalbuf(vp, V_SAVE, &afs_osi_cred, p, 0, 0);
-        if (vp->v_usecount == 1)
-           VOP_INACTIVE(vp, p);
-        else
-           VOP_UNLOCK(vp, 0, p);
-        if (obj) {
-        if (ISSET(vp->v_flag, VTERMINATE))
-            panic("afs_vnreclaim: already teminating");
-        SET(vp->v_flag, VTERMINATE);
-        memory_object_destroy(obj, 0);
-        while (ISSET(vp->v_flag, VTERMINATE)) {
-              SET(vp->v_flag, VTERMWANT);
-              tsleep((caddr_t)&vp->v_ubcinfo, PINOD, "afs_vnreclaim", 0);
-        }
-        }
-   } else {
-        if (simple_lock_try(&vp->v_interlock))
-            panic("afs_vnreclaim: slept, but did no work :(");
-        if (UBCINFOEXISTS(vp) && vp->v_count == 1) {
-           vp->v_usecount++;
-           simple_unlock(&vp->v_interlock);
-           VN_RELE(vp);
-        } else 
-           simple_unlock(&vp->v_interlock);
-   }
-   AFS_GLOCK();
-   if (slept)
-      ObtainWriteLock(&afs_xvcache,175);
-   else
-      ObtainReadLock(&afs_xvcache);
+           vinvalbuf(vp, V_SAVE, &afs_osi_cred, p, 0, 0);
+           if (vp->v_usecount ==
+#ifdef AFS_DARWIN14_ENV
+               2 + DARWIN_REFBASE
+#else
+               1
+#endif
+               )
+               VOP_INACTIVE(vp, p);
+           else
+               VOP_UNLOCK(vp, 0, p);
+#ifdef AFS_DARWIN14_ENV
+           if (didhold)
+               ubc_rele(vp);
+#endif
+           if (obj) {
+               if (ISSET(vp->v_flag, VTERMINATE))
+                   panic("afs_vnreclaim: already teminating");
+               SET(vp->v_flag, VTERMINATE);
+               memory_object_destroy(obj, 0);
+               while (ISSET(vp->v_flag, VTERMINATE)) {
+                   SET(vp->v_flag, VTERMWANT);
+                   tsleep((caddr_t)&vp->v_ubcinfo, PINOD, "afs_vnreclaim", 0);
+               }
+           }
+#ifdef AFS_DARWIN14_ENV
+           simple_lock(&vp->v_interlock);
+           CLR(vp->v_flag, VORECLAIM);
+           if (ISSET((vp)->v_flag, VXWANT)) {
+               CLR((vp)->v_flag, VXWANT);
+               wakeup((caddr_t)(vp));
+           }       
+           vp->v_usecount--;
+           simple_unlock(&vp->v_interlock);
+#endif
+       } else {
+#ifdef AFS_DARWIN14_ENV
+           CLR(vp->v_flag, VORECLAIM);
+#endif
+           if (simple_lock_try(&vp->v_interlock))
+               panic("afs_vnreclaim: slept, but did no work :(");
+           if (UBCINFOEXISTS(vp) && vp->v_count == DARWIN_REFBASE +
+#ifdef AFS_DARWIN14_ENV
+               2
+#else
+               1
+#endif
+               ) {
+#ifndef AFS_DARWIN14_ENV
+               /* We left the refcount high in 1.4 */
+               vp->v_usecount++;
+#endif
+               simple_unlock(&vp->v_interlock);
+               VN_RELE(vp);
+           } else {
+#ifdef AFS_DARWIN14_ENV
+               /* We left the refcount high in 1.4 */
+               vp->v_usecount--;
+#endif
+               simple_unlock(&vp->v_interlock);
+           }
+       }
+    }
+    AFS_GLOCK();
+    if (slept)
+        ObtainWriteLock(&afs_xvcache,175);
+    else
+        ObtainReadLock(&afs_xvcache);
 }
 
 void osi_VM_NukePages(struct vnode *vp, off_t offset, off_t size) {
index 0a1fb4007f53dad1afa71b737ee156ef50a5ac77..3dd79ea5abd86738b1793f7027875dcd418847f0 100644 (file)
@@ -352,6 +352,17 @@ afs_vop_close(ap)
          printf("afs: WARNING: ui_refcount panic averted\n");
        }
     }
+    if (UBCINFOMISSING(ap->a_vp) ||
+       UBCINFORECLAIMED(ap->a_vp)) {
+      if (UBCINFORECLAIMED(ap->a_vp) && ISSET(ap->a_vp->v_flag, 
+                                             (VXLOCK|VORECLAIM))) {
+       printf("no ubc for %x in close, reclaim set\n", ap->a_vp);
+       return (ENXIO);
+      } else {
+       printf("no ubc for %x in close, put back\n", ap->a_vp);
+       ubc_info_init(ap->a_vp);
+      }
+    }
 #endif
 
     return code;
@@ -445,7 +456,6 @@ afs_vop_pagein(ap)
     struct iovec    aiov;
     struct uio * uio = &auio;
     int nocommit = flags & UPL_NOCOMMIT;
-    int iosize;
 
     int code;
     struct vcache *tvc=VTOAFS(vp);
@@ -569,6 +579,7 @@ afs_vop_pageout(ap)
     struct iovec    aiov;
     struct uio * uio = &auio;
     int nocommit = flags & UPL_NOCOMMIT;
+    int iosize;
 
     int code;
     struct vcache *tvc=VTOAFS(vp);
@@ -821,7 +832,8 @@ afs_vop_remove(ap)
     cache_purge(vp);
     if (!error && UBCINFOEXISTS(vp)) {
 #ifdef AFS_DARWIN14_ENV
-             (void) ubc_uncache(vp); 
+       /* If crashes continue in ubc_hold, comment this out */
+       /* (void)ubc_uncache(vp);*/
 #else
              int wasmapped=ubc_issetflags(vp, UI_WASMAPPED);
              int hasobjref=ubc_issetflags(vp, UI_HASOBJREF);
index f4668e3ea259481a67d0c6a134562c3ec9903e56..b9e634c2d6152ced14a5e9a8e35085f8488f4d56 100644 (file)
@@ -367,10 +367,18 @@ tagain:
     Tadp1 = adp; Tadpr = VREFCOUNT(adp); Ttvc = tvc; Tnam = aname; Tnam1 = 0;
     if (tvc) Ttvcr = VREFCOUNT(tvc);
 #ifdef AFS_AIX_ENV
-    if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
+    if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0
+       && !(tvc->states & CUnlinked)) 
 #else
-    if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
+#ifdef AFS_DARWIN14_ENV
+      if (tvc && (VREFCOUNT(tvc) > 1 + DARWIN_REFBASE) && tvc->opens > 0 && !*tvc->states & CUnlinked)) 
+#else
+      if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0
+         && !(tvc->states & CUnlinked)) 
+#endif
 #endif
+      {
+
        char *unlname = newname();
 
        ReleaseWriteLock(&adp->lock);
@@ -417,6 +425,7 @@ afs_remunlink(avc, doit)
     struct VenusFid dirFid;
     register struct dcache *tdc;
     afs_int32 offset, len, code=0;
+    int oldref;
 
     if (NBObtainWriteLock(&avc->lock, 423))
        return 0;
@@ -434,7 +443,7 @@ afs_remunlink(avc, doit)
            cred = avc->uncred;
            avc->uncred = NULL;
 
-#ifdef AFS_DARWIN_ENV
+#if defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN14_ENV)
            /* this is called by vrele (via VOP_INACTIVE) when the refcount
               is 0. we can't just call VN_HOLD since vref will panic.
               we can't just call osi_vnhold because a later AFS_RELE will call
@@ -452,6 +461,12 @@ afs_remunlink(avc, doit)
             */
            avc->states  &= ~(CUnlinked | CUnlinkedDel);
 
+#ifdef AFS_DARWIN14_ENV
+           if (VREFCOUNT(avc) < 4) {
+               oldref = 4 - VREFCOUNT(avc);
+               VREFCOUNT_SET(avc, 4);
+           }
+#endif
            ReleaseWriteLock(&avc->lock);
 
            dirFid.Cell = avc->fid.Cell;
@@ -475,8 +490,15 @@ afs_remunlink(avc, doit)
            osi_FreeSmallSpace(unlname);
            crfree(cred);
 #ifdef AFS_DARWIN_ENV
+#ifndef AFS_DARWIN14_ENV
            osi_Assert(VREFCOUNT(avc) == 1);
            VREFCOUNT_SET(avc, 0);
+#else
+           if (oldref) {
+               int newref = VREFCOUNT(avc) - oldref;
+               VREFCOUNT_SET(avc, newref);
+           }
+#endif
 #endif
         }
     }
index 58bdfb4fbff3d09ee71c65e1de4e16b4d4acfe7b..5052d483e36e21a459961e46d937d4f38969f6c8 100644 (file)
@@ -787,8 +787,15 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
                refpanic("VLRU inconsistent");
 
 #ifdef AFS_DARWIN_ENV
-          if (tvc->opens == 0 && ((tvc->states & CUnlinkedDel) == 0) &&
-                VREFCOUNT(tvc) == 1 && UBCINFOEXISTS(&tvc->v)) {
+           if ((VREFCOUNT(tvc) < DARWIN_REFBASE) || 
+               (VREFCOUNT(tvc) < 1+DARWIN_REFBASE && 
+                UBCINFOEXISTS(&tvc->v))) {
+               VREFCOUNT_SET(tvc, 
+                             DARWIN_REFBASE + (UBCINFOEXISTS(&tvc->v) ? 1 : 0));
+           }
+          if (tvc->opens == 0 && ((tvc->states & CUnlinkedDel) == 0)
+               && VREFCOUNT(tvc) == DARWIN_REFBASE+1 
+               && UBCINFOEXISTS(&tvc->v)) {
                osi_VM_TryReclaim(tvc, &fv_slept);
                if (fv_slept) {
                   uq = VLRU.prev;
@@ -802,8 +809,14 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
                afs_TryFlushDcacheChildren(tvc);
 #endif
 
-          if (VREFCOUNT(tvc) == 0 && tvc->opens == 0
-              && (tvc->states & CUnlinkedDel) == 0) {
+           if (VREFCOUNT(tvc) == 
+#ifdef AFS_DARWIN_ENV
+               DARWIN_REFBASE
+#else
+               0 
+#endif
+               && tvc->opens == 0
+               && (tvc->states & CUnlinkedDel) == 0) {
                code = afs_FlushVCache(tvc, &fv_slept);
                if (code == 0) {
                  anumber--;
@@ -975,7 +988,7 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
     /* VLISTNONE(&tvc->v); */
     tvc->v.v_freelist.tqe_next=0;
     tvc->v.v_freelist.tqe_prev=(struct vnode **)0xdeadb;
-    /*tvc->vrefCount++;*/
+    tvc->vrefCount+=DARWIN_REFBASE;
 #endif 
 #ifdef AFS_FBSD_ENV
     lockinit(&tvc->rwlock, PINOD, "vcache rwlock", 0, 0);
@@ -1250,7 +1263,8 @@ afs_FlushActiveVcaches(doflocks)
                }
            }          
 #ifdef AFS_DARWIN_ENV
-            if (VREFCOUNT(tvc) == 1 && UBCINFOEXISTS(&tvc->v)) {
+           if (VREFCOUNT(tvc) == 1+DARWIN_REFBASE 
+               && UBCINFOEXISTS(&tvc->v)) {
                if (tvc->opens) panic("flushactive open, hasubc, but refcnt 1");
                osi_VM_TryReclaim(tvc,0);
            }
@@ -2035,6 +2049,22 @@ struct vcache *afs_GetRootVCache(struct VenusFid *afid,
            if (vg)
                 continue;
 #endif /* AFS_OSF_ENV */
+#ifdef AFS_DARWIN14_ENV
+           /* It'd really suck if we allowed duplicate vcaches for the 
+              same fid to happen. Wonder if this will work? */
+           struct vnode *vp = AFSTOV(tvc);
+           if (vp->v_flag & (VXLOCK|VORECLAIM|VTERMINATE)) {
+               printf("precluded FindVCache on %x (%d:%d:%d)\n", 
+                      vp, tvc->fid.Fid.Volume, tvc->fid.Fid.Vnode,
+                      tvc->fid.Fid.Unique);
+               simple_lock(&vp->v_interlock);
+               SET(vp->v_flag, VTERMWANT);
+               simple_unlock(&vp->v_interlock);
+               (void)tsleep((caddr_t)&vp->v_ubcinfo, PINOD, "vget1", 0);
+               printf("VTERMWANT ended on %x\n", vp);
+               continue;
+           }
+#endif
            break;
        }
     }
index de44b567c1557898bad305096c6625e4a68510e3..50165f7928d622bcaf33220593432b9a4a573f6c 100644 (file)
@@ -11,6 +11,7 @@
 #define AFS_DARWIN_ENV
 #define AFS_NONFSTRANS
 #define AFS_SYSCALL             230
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index 2a1c7e777d7d19d6ced39dc62d8baa8cc8546782..5bd6f537abf17aeedc5f74a574abed19f02ffb86 100644 (file)
@@ -11,6 +11,7 @@
 #define AFS_USR_DARWIN_ENV
 #define AFS_NONFSTRANS 
 #define AFS_SYSCALL             230
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index b2df4fa5cae70a35ae0233d1882e458f5510b296..07dca4316ccdda042d81e1789ec9f907b6e7d2d3 100644 (file)
@@ -12,6 +12,7 @@
 #define AFS_DARWIN13_ENV
 #define AFS_NONFSTRANS
 #define AFS_SYSCALL             230
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index 7a70c4858969f204d7270c0c6171688f9b0b0ea4..19f8ed7c017b528179d71429ce99aa48098e585d 100644 (file)
@@ -12,6 +12,7 @@
 #define AFS_USR_DARWIN13_ENV
 #define AFS_NONFSTRANS 
 #define AFS_SYSCALL             230
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index 8a6ed1779f5a31dba2d8c71675f5b92a95a57e41..bed7b27e20a9ba1d9fee2c024a588a1119586202 100644 (file)
@@ -14,6 +14,7 @@
 #define AFS_NONFSTRANS
 #define AFS_SYSCALL             230
 #define AFS_NAMEI_ENV 1
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index ca107f5236d08167b172ee679e523ddb7171569b..b473bc10fd880ea59cc2f17fc808b815c8e232fc 100644 (file)
@@ -13,6 +13,7 @@
 #define AFS_USR_DARWIN14_ENV
 #define AFS_NONFSTRANS 
 #define AFS_SYSCALL             230
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index e13e24e4c5fff2b675ca61a1c793493f815ecc7b..473c1acf72bd94b5e8618bbe079365b1fe72beb4 100644 (file)
@@ -20,6 +20,7 @@
 #define AFS_NONFSTRANS
 #define AFS_SYSCALL             230
 #define AFS_NAMEI_ENV 1
+#define DARWIN_REFBASE 3
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"
index 1167c80bdcf46db7fc9cbf83131f46a9e9f15742..3d18c33d172b26e7786ef0025a6c85e8d8c3218f 100644 (file)
@@ -18,6 +18,7 @@
 #define AFS_USR_DARWIN70_ENV
 #define AFS_NONFSTRANS 
 #define AFS_SYSCALL             230
+#define DARWIN_REFBASE 0
 
 /* File system entry (used if mount.h doesn't define MOUNT_AFS */
 #define AFS_MOUNT_AFS    "afs"