tru64-avoid-leaking-vnodes-when-failure-20020320
authorMattias Amnefelt <mattiasa@e.kth.se>
Wed, 20 Mar 2002 18:38:28 +0000 (18:38 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 20 Mar 2002 18:38:28 +0000 (18:38 +0000)
tru64 needs vrele when an error happens, rather than just returning. make
sure we do so

src/afs/VNOPS/afs_vnop_create.c
src/afs/VNOPS/afs_vnop_dirops.c
src/afs/VNOPS/afs_vnop_link.c
src/afs/VNOPS/afs_vnop_remove.c
src/afs/VNOPS/afs_vnop_symlink.c

index 57c956e..dc7c713 100644 (file)
@@ -77,7 +77,9 @@ afs_create(OSI_VC_ARG(adp), aname, attrs, aexcl, amode, avcp, acred)
 
 
     AFS_STATCNT(afs_create);
-    if (code = afs_InitReq(&treq, acred)) return code;
+    if (code = afs_InitReq(&treq, acred)) 
+       goto done2;
+
     afs_Trace3(afs_iclSetp, CM_TRACE_CREATE, ICL_TYPE_POINTER, adp,
               ICL_TYPE_STRING, aname, ICL_TYPE_INT32, amode);
 
@@ -460,10 +462,15 @@ done:
 #ifdef AFS_OSF_ENV
     if (!code && !strcmp(aname, "core"))
        tvc->states |= CCore1;
+#endif
+
+    code = afs_CheckCode(code, &treq, 20);
+
+done2:
+#ifdef AFS_OSF_ENV
     afs_PutVCache(adp, 0);
 #endif /* AFS_OSF_ENV */
 
-    code = afs_CheckCode(code, &treq, 20);
     return code;
 }
 
index 096aebf..3f8dce8 100644 (file)
@@ -69,7 +69,8 @@ afs_mkdir(OSI_VC_ARG(adp), aname, attrs, avcp, acred)
     afs_Trace2(afs_iclSetp, CM_TRACE_MKDIR, ICL_TYPE_POINTER, adp,
               ICL_TYPE_STRING, aname);
 
-    if (code = afs_InitReq(&treq, acred)) return code;
+    if (code = afs_InitReq(&treq, acred)) 
+       goto done2;
 
     if (!afs_ENameOK(aname)) {
        code = EINVAL;
@@ -153,10 +154,11 @@ afs_mkdir(OSI_VC_ARG(adp), aname, attrs, avcp, acred)
     }
     else code = ENOENT;
 done:
+    code = afs_CheckCode(code, &treq, 26);
+done2:
 #ifdef AFS_OSF_ENV
     AFS_RELE(ndp->ni_dvp);
 #endif /* AFS_OSF_ENV */
-    code = afs_CheckCode(code, &treq, 26);
     return code;
 }
 
@@ -195,7 +197,9 @@ afs_rmdir(adp, aname, acred)
     afs_Trace2(afs_iclSetp, CM_TRACE_RMDIR, ICL_TYPE_POINTER, adp, 
               ICL_TYPE_STRING, aname);
 
-    if (code = afs_InitReq(&treq, acred)) return code;
+    if (code = afs_InitReq(&treq, acred)) 
+       goto done2;
+
     code = afs_VerifyVCache(adp, &treq);
     if (code) goto done;
 
@@ -300,10 +304,11 @@ afs_rmdir(adp, aname, acred)
     code = 0;
 
 done:
+    code = afs_CheckCode(code, &treq, 27); 
+done2:
 #ifdef AFS_OSF_ENV
     afs_PutVCache(adp, 0);
     afs_PutVCache(ndp->ni_vp, 0);
 #endif /* AFS_OSF_ENV */
-    code = afs_CheckCode(code, &treq, 27); 
     return code;
 }
index 88c6ad4..493363c 100644 (file)
@@ -63,7 +63,9 @@ afs_link(avc, OSI_VC_ARG(adp), aname, acred)
     afs_Trace3(afs_iclSetp, CM_TRACE_LINK, ICL_TYPE_POINTER, adp,
               ICL_TYPE_POINTER, avc, ICL_TYPE_STRING, aname);
     /* create a hard link; new entry is aname in dir adp */
-    if (code = afs_InitReq(&treq, acred)) return code;
+    if (code = afs_InitReq(&treq, acred)) 
+       goto done2;
+
     if (avc->fid.Cell != adp->fid.Cell || avc->fid.Fid.Volume != adp->fid.Fid.Volume) {
        code = EXDEV;
        goto done;
@@ -146,9 +148,11 @@ afs_link(avc, OSI_VC_ARG(adp), aname, acred)
     ReleaseWriteLock(&avc->lock);
     code = 0;
 done:
+    code = afs_CheckCode(code, &treq, 24);
+done2:
 #ifdef AFS_OSF_ENV
     afs_PutVCache(adp, WRITE_LOCK);
 #endif /* AFS_OSF_ENV */
-    return afs_CheckCode(code, &treq, 24);
+    return code;
 }
 
index 8e52b44..8886da3 100644 (file)
@@ -238,11 +238,21 @@ afs_remove(OSI_VC_ARG(adp), aname, acred)
               ICL_TYPE_STRING, aname);
 
     /* Check if this is dynroot */
-    if (afs_IsDynroot(adp))
+    if (afs_IsDynroot(adp)) {
+#ifdef  AFS_OSF_ENV
+        afs_PutVCache(adp, 0);
+        afs_PutVCache(tvc, 0);
+#endif
        return afs_DynrootVOPRemove(adp, acred, aname);
+    }
 
-    if (code = afs_InitReq(&treq, acred))
+    if (code = afs_InitReq(&treq, acred)) {
+#ifdef  AFS_OSF_ENV
+        afs_PutVCache(adp, 0);
+        afs_PutVCache(tvc, 0);
+#endif
       return code;
+    }
 tagain:
     code = afs_VerifyVCache(adp, &treq);
 #ifdef AFS_OSF_ENV
@@ -264,6 +274,10 @@ tagain:
       * fileserver
       */
     if ( adp->states & CRO ) {
+#ifdef  AFS_OSF_ENV
+        afs_PutVCache(adp, 0);
+        afs_PutVCache(tvc, 0);
+#endif
         code = EROFS;
        return code;
     }
index 2e18264..678b0a7 100644 (file)
@@ -79,16 +79,18 @@ afs_symlink
     afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp,
                 ICL_TYPE_STRING, aname);
 
-    if (afs_IsDynroot(adp))
-       return afs_DynrootVOPSymlink(adp, acred, aname, atargetName);
+    if (afs_IsDynroot(adp)) {
+       code = afs_DynrootVOPSymlink(adp, acred, aname, atargetName);
+       goto done2;
+    }
 
     if (code = afs_InitReq(&treq, acred))
-       return code;
+       goto done2;
 
     code = afs_VerifyVCache(adp, &treq);
     if (code) { 
       code = afs_CheckCode(code, &treq, 30);
-      return code;
+      goto done2;
     }
 
     /** If the volume is read-only, return error without making an RPC to the
@@ -96,7 +98,7 @@ afs_symlink
       */
     if ( adp->states & CRO ) {
         code = EROFS;
-       return code;
+       goto done2;
     }
 
     InStatus.Mask = AFS_SETMODTIME | AFS_SETMODE;
@@ -216,12 +218,13 @@ afs_symlink
     afs_PutVCache(tvc, WRITE_LOCK);
     code = 0;
 done:
-#ifdef  AFS_OSF_ENV
-    AFS_RELE(ndp->ni_dvp);
-#endif  /* AFS_OSF_ENV */
     if ( volp ) 
        afs_PutVolume(volp, READ_LOCK);
     code = afs_CheckCode(code, &treq, 31);
+done2:
+#ifdef  AFS_OSF_ENV
+    AFS_RELE(ndp->ni_dvp);
+#endif  /* AFS_OSF_ENV */
     return code;
 }