FBSD CM: don't call afs_close when recycling
[openafs.git] / src / afs / VNOPS / afs_vnop_write.c
index 3bb53e2..ac0894e 100644 (file)
@@ -36,8 +36,8 @@ extern unsigned char *afs_indexFlags;
  * avc->lock must be write-locked.
  */
 int
-afs_StoreOnLastReference(register struct vcache *avc,
-                        register struct vrequest *treq)
+afs_StoreOnLastReference(struct vcache *avc,
+                        struct vrequest *treq)
 {
     int code = 0;
 
@@ -95,7 +95,7 @@ afs_StoreOnLastReference(register struct vcache *avc,
 }
 
 int
-afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
+afs_MemWrite(struct vcache *avc, struct uio *auio, int aio,
             afs_ucred_t *acred, int noLock)
 {
     afs_size_t totalLength;
@@ -105,7 +105,7 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
     afs_int32 tlen, trimlen;
     afs_int32 startDate;
     afs_int32 max;
-    register struct dcache *tdc;
+    struct dcache *tdc;
 #ifdef _HIGHC_
     volatile
 #endif
@@ -117,7 +117,7 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
     struct uio *tuiop = &tuio;
     struct iovec *tvec;                /* again, should have define */
 #endif
-    register afs_int32 code;
+    afs_int32 code;
     struct vrequest treq;
 
     AFS_STATCNT(afs_MemWrite);
@@ -188,7 +188,7 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
      * high-level write op.
      */
     if (avc->execsOrWriters <= 0) {
-       printf("WARNING: afs_ufswr vp=%lx, exOrW=%d\n", (unsigned long)avc,
+       afs_warn("WARNING: afs_ufswr vp=%lx, exOrW=%d\n", (unsigned long)avc,
               avc->execsOrWriters);
     }
 #else
@@ -261,10 +261,8 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
        osi_Assert(filePos <= avc->f.m.Length);
 #else
        if (filePos > avc->f.m.Length) {
-#if defined(AFS_DISCON_ENV)
            if (AFS_IS_DISCON_RW)
                afs_PopulateDCache(avc, filePos, &treq);
-#endif
            afs_Trace4(afs_iclSetp, CM_TRACE_SETLENGTH, ICL_TYPE_STRING,
                       __FILE__, ICL_TYPE_LONG, __LINE__, ICL_TYPE_OFFSET,
                       ICL_HANDLE_OFFSET(avc->f.m.Length), ICL_TYPE_OFFSET,
@@ -307,7 +305,7 @@ afs_MemWrite(register struct vcache *avc, struct uio *auio, int aio,
 
 /* called on writes */
 int
-afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
+afs_UFSWrite(struct vcache *avc, struct uio *auio, int aio,
             afs_ucred_t *acred, int noLock)
 {
     afs_size_t totalLength;
@@ -318,7 +316,7 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
     afs_int32 trimlen;
     afs_int32 startDate;
     afs_int32 max;
-    register struct dcache *tdc;
+    struct dcache *tdc;
 #ifdef _HIGHC_
     volatile
 #endif
@@ -331,7 +329,7 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
     struct iovec *tvec;                /* again, should have define */
 #endif
     struct osi_file *tfile;
-    register afs_int32 code;
+    afs_int32 code;
     struct vrequest treq;
 
     AFS_STATCNT(afs_UFSWrite);
@@ -405,7 +403,7 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
      * high-level write op.
      */
     if (avc->execsOrWriters <= 0) {
-       printf("WARNING: afs_ufswr vcp=%lx, exOrW=%d\n", (unsigned long)avc,
+       afs_warn("WARNING: afs_ufswr vcp=%lx, exOrW=%d\n", (unsigned long)avc,
               avc->execsOrWriters);
     }
 #else
@@ -510,12 +508,18 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
        code = VOP_WRITE(tfile->vnode, &tuio, 0, afs_osi_credp);
        VOP_UNLOCK(tfile->vnode, 0);
        AFS_GLOCK();
-#elif defined(AFS_FBSD50_ENV)
+#elif defined(AFS_FBSD_ENV)
        AFS_GUNLOCK();
        VOP_LOCK(tfile->vnode, LK_EXCLUSIVE, curthread);
        code = VOP_WRITE(tfile->vnode, &tuio, 0, afs_osi_credp);
        VOP_UNLOCK(tfile->vnode, 0, curthread);
        AFS_GLOCK();
+#elif defined(AFS_NBSD_ENV)
+       AFS_GUNLOCK();
+       VOP_LOCK(tfile->vnode, LK_EXCLUSIVE);
+       code = VOP_WRITE(tfile->vnode, &tuio, 0, afs_osi_credp);
+       VOP_UNLOCK(tfile->vnode, 0);
+       AFS_GLOCK();
 #elif defined(AFS_XBSD_ENV)
        AFS_GUNLOCK();
        VOP_LOCK(tfile->vnode, LK_EXCLUSIVE, curproc);
@@ -559,10 +563,8 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
        osi_Assert(filePos <= avc->f.m.Length);
 #else
        if (filePos > avc->f.m.Length) {
-#if defined(AFS_DISCON_ENV)
            if (AFS_IS_DISCON_RW)
                afs_PopulateDCache(avc, filePos, &treq);
-#endif
            afs_Trace4(afs_iclSetp, CM_TRACE_SETLENGTH, ICL_TYPE_STRING,
                       __FILE__, ICL_TYPE_LONG, __LINE__, ICL_TYPE_OFFSET,
                       ICL_HANDLE_OFFSET(avc->f.m.Length), ICL_TYPE_OFFSET,
@@ -628,9 +630,9 @@ afs_UFSWrite(register struct vcache *avc, struct uio *auio, int aio,
 
 /* do partial write if we're low on unmodified chunks */
 int
-afs_DoPartialWrite(register struct vcache *avc, struct vrequest *areq)
+afs_DoPartialWrite(struct vcache *avc, struct vrequest *areq)
 {
-    register afs_int32 code;
+    afs_int32 code;
 
     if (afs_stats_cmperf.cacheCurrDirtyChunks <=
        afs_stats_cmperf.cacheMaxDirtyChunks
@@ -666,8 +668,8 @@ afs_close(OSI_VC_DECL(avc), afs_int32 aflags, int count, offset_t offset,
 afs_close(OSI_VC_DECL(avc), afs_int32 aflags, afs_ucred_t *acred)
 #endif
 {
-    register afs_int32 code;
-    register struct brequest *tb;
+    afs_int32 code;
+    struct brequest *tb;
     struct vrequest treq;
 #ifdef AFS_SGI65_ENV
     struct flid flid;
@@ -771,7 +773,7 @@ afs_close(OSI_VC_DECL(avc), afs_int32 aflags, afs_ucred_t *acred)
 #ifdef AFS_AIX32_ENV
            osi_ReleaseVM(avc, acred);
 #endif
-           printf("avc->vc_error=%d\n", avc->vc_error);
+           /* printf("avc->vc_error=%d\n", avc->vc_error); */
            code = avc->vc_error;
            avc->vc_error = 0;
        }
@@ -813,6 +815,22 @@ afs_close(OSI_VC_DECL(avc), afs_int32 aflags, afs_ucred_t *acred)
            code = avc->vc_error;
            avc->vc_error = 0;
        }
+#if defined(AFS_FBSD80_ENV)
+        /* XXX */
+        if (!avc->opens) {
+            afs_int32 opens, is_free, is_gone, is_doomed, iflag;
+            struct vnode *vp = AFSTOV(avc);
+            VI_LOCK(vp);
+            is_doomed =  vp->v_iflag & VI_DOOMED;
+            is_free = vp->v_iflag & VI_FREE;
+            is_gone = vp->v_iflag & VI_DOINGINACT;
+            iflag = vp->v_iflag;
+            VI_UNLOCK(vp);
+            opens = avc->opens;
+            afs_warn("afs_close avc %p vp %p opens %d free %d doinginact %d doomed %d iflag %d\n",
+                     avc, vp, opens, is_free, is_gone, is_doomed, iflag);
+        }
+#endif
        avc->opens--;
        ReleaseWriteLock(&avc->lock);
     }
@@ -834,7 +852,7 @@ afs_fsync(OSI_VC_DECL(avc), int flag, afs_ucred_t *acred
 afs_fsync(OSI_VC_DECL(avc), afs_ucred_t *acred)
 #endif 
 {
-    register afs_int32 code;
+    afs_int32 code;
     struct vrequest treq;
     OSI_VC_CONVERT(avc);
 
@@ -861,22 +879,17 @@ afs_fsync(OSI_VC_DECL(avc), afs_ucred_t *acred)
     ObtainSharedLock(&avc->lock, 18);
     code = 0;
     if (avc->execsOrWriters > 0) {
-
        if (!AFS_IS_DISCONNECTED && !AFS_IS_DISCON_RW) {
-               /* Your average flush. */
-
-               /* put the file back */
-               UpgradeSToWLock(&avc->lock, 41);
-               code = afs_StoreAllSegments(avc, &treq, AFS_SYNC);
-               ConvertWToSLock(&avc->lock);
-
-#if defined(AFS_DISCON_ENV)
+           /* Your average flush. */
+           
+           /* put the file back */
+           UpgradeSToWLock(&avc->lock, 41);
+           code = afs_StoreAllSegments(avc, &treq, AFS_SYNC);
+           ConvertWToSLock(&avc->lock);
        } else {
-
            UpgradeSToWLock(&avc->lock, 711);
            afs_DisconAddDirty(avc, VDisconWriteFlush, 1);
            ConvertWToSLock(&avc->lock);
-#endif
        }               /* if not disconnected */
     }                  /* if (avc->execsOrWriters > 0) */