libafs: reset all the volumes with fs flushall
[openafs.git] / src / afs / afs_pioctl.c
index 7f0329a..53681e5 100644 (file)
@@ -1287,7 +1287,7 @@ afs_HandlePioctl(struct vnode *avp, afs_int32 acom,
                 afs_ucred_t **acred)
 {
     struct vcache *avc;
-    struct vrequest treq;
+    struct vrequest *treq = NULL;
     afs_int32 code;
     afs_int32 function, device;
     struct afs_pdata input, output;
@@ -1305,13 +1305,13 @@ afs_HandlePioctl(struct vnode *avp, afs_int32 acom,
               ICL_TYPE_POINTER, avc, ICL_TYPE_INT32, afollow);
     AFS_STATCNT(HandlePioctl);
 
-    code = afs_InitReq(&treq, *acred);
+    code = afs_CreateReq(&treq, *acred);
     if (code)
        return code;
 
     afs_InitFakeStat(&fakestate);
     if (avc) {
-       code = afs_EvalFakeStat(&avc, &fakestate, &treq);
+       code = afs_EvalFakeStat(&avc, &fakestate, treq);
        if (code)
            goto out;
     }
@@ -1370,7 +1370,7 @@ afs_HandlePioctl(struct vnode *avp, afs_int32 acom,
     copyOutput = output;
 
     code =
-       (*pioctlSw[function]) (avc, function, &treq, &copyInput,
+       (*pioctlSw[function]) (avc, function, treq, &copyInput,
                               &copyOutput, acred);
 
     outSize = copyOutput.ptr - output.ptr;
@@ -1388,7 +1388,9 @@ out:
     afs_pd_free(&output);
 
     afs_PutFakeStat(&fakestate);
-    return afs_CheckCode(code, &treq, 41);
+    code = afs_CheckCode(code, treq, 41);
+    afs_DestroyReq(treq);
+    return code;
 }
 
 /*!
@@ -1871,7 +1873,7 @@ DECL_PIOCTL(PSetTokens)
     char *stp;
     char *cellName;
     int stLen;
-    struct vrequest treq;
+    struct vrequest *treq = NULL;
     afs_int32 flag, set_parent_pag = 0;
 
     AFS_STATCNT(PSetTokens);
@@ -1928,8 +1930,11 @@ DECL_PIOCTL(PSetTokens)
 
     if (set_parent_pag) {
        if (_settok_setParentPag(acred) == 0) {
-           afs_InitReq(&treq, *acred);
-           areq = &treq;
+           code = afs_CreateReq(&treq, *acred);
+           if (code) {
+               return code;
+           }
+           areq = treq;
        }
     }
 
@@ -1949,6 +1954,7 @@ DECL_PIOCTL(PSetTokens)
     afs_ResetUserConns(tu);
     afs_NotifyUser(tu, UTokensObtained);
     afs_PutUser(tu, WRITE_LOCK);
+    afs_DestroyReq(treq);
 
     return 0;
 }
@@ -2152,15 +2158,9 @@ DECL_PIOCTL(PFlush)
     AFS_STATCNT(PFlush);
     if (!avc)
        return EINVAL;
-#ifdef AFS_BOZONLOCK_ENV
-    afs_BozonLock(&avc->pvnLock, avc); /* Since afs_TryToSmush will do a pvn_vptrunc */
-#endif
     ObtainWriteLock(&avc->lock, 225);
     afs_ResetVCache(avc, *acred, 0);
     ReleaseWriteLock(&avc->lock);
-#ifdef AFS_BOZONLOCK_ENV
-    afs_BozonUnlock(&avc->pvnLock, avc);
-#endif
     return 0;
 }
 
@@ -3502,15 +3502,9 @@ FlushVolumeData(struct VenusFid *afid, afs_ucred_t * acred)
                AFS_FAST_HOLD(tvc);
 #endif
                ReleaseReadLock(&afs_xvcache);
-#ifdef AFS_BOZONLOCK_ENV
-               afs_BozonLock(&tvc->pvnLock, tvc);      /* Since afs_TryToSmush will do a pvn_vptrunc */
-#endif
                ObtainWriteLock(&tvc->lock, 232);
                afs_ResetVCache(tvc, acred, 1);
                ReleaseWriteLock(&tvc->lock);
-#ifdef AFS_BOZONLOCK_ENV
-               afs_BozonUnlock(&tvc->pvnLock, tvc);
-#endif
 #ifdef AFS_DARWIN80_ENV
                vnode_put(AFSTOV(tvc));
 #endif
@@ -3556,14 +3550,16 @@ FlushVolumeData(struct VenusFid *afid, afs_ucred_t * acred)
     ReleaseWriteLock(&afs_xdcache);
 
     ObtainReadLock(&afs_xvolume);
-    for (i = 0; i < NVOLS; i++) {
+    for (i = all ? 0 : VHash(volume); i < NVOLS; i++) {
        for (tv = afs_volumes[i]; tv; tv = tv->next) {
            if (all || tv->volume == volume) {
                afs_ResetVolumeInfo(tv);
-               break;
+               if (!all)
+                   goto last;
            }
        }
     }
+ last:
     ReleaseReadLock(&afs_xvolume);
 
     /* probably, a user is doing this, probably, because things are screwed up.
@@ -4853,9 +4849,6 @@ DECL_PIOCTL(PFlushMount)
        code = EINVAL;
        goto out;
     }
-#ifdef AFS_BOZONLOCK_ENV
-    afs_BozonLock(&tvc->pvnLock, tvc); /* Since afs_TryToSmush will do a pvn_vptrunc */
-#endif
     ObtainWriteLock(&tvc->lock, 649);
     ObtainWriteLock(&afs_xcbhash, 650);
     afs_DequeueCallback(tvc);
@@ -4869,9 +4862,6 @@ DECL_PIOCTL(PFlushMount)
        tvc->linkData = NULL;
     }
     ReleaseWriteLock(&tvc->lock);
-#ifdef AFS_BOZONLOCK_ENV
-    afs_BozonUnlock(&tvc->pvnLock, tvc);
-#endif
     afs_PutVCache(tvc);
   out:
     if (sysState.allocked)
@@ -5339,7 +5329,7 @@ DECL_PIOCTL(PSetTokens2)
     int i, cellNum, primaryFlag;
     XDR xdrs;
     struct unixuser *tu;
-    struct vrequest treq;
+    struct vrequest *treq = NULL;
     struct ktc_setTokenData tokenSet;
     struct ktc_tokenUnion decodedToken;
 
@@ -5383,8 +5373,12 @@ DECL_PIOCTL(PSetTokens2)
            *acred = crref();
            crfree(old_cred);
 #endif
-           afs_InitReq(&treq, *acred);
-           areq = &treq;
+           code = afs_CreateReq(&treq, *acred);
+           if (code) {
+               xdr_free((xdrproc_t) xdr_ktc_setTokenData, &tokenSet);
+               return code;
+           }
+           areq = treq;
        }
     }
 
@@ -5439,6 +5433,7 @@ DECL_PIOCTL(PSetTokens2)
 out:
     afs_ResetUserConns(tu);
     afs_PutUser(tu, WRITE_LOCK);
+    afs_DestroyReq(treq);
 
     return code;
 }