]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Fix a vcache refcount leak in afs_root() on all platforms.
authorNickolai Zeldovich <kolya@mit.edu>
Mon, 12 Aug 2002 22:32:39 +0000 (22:32 +0000)
committerNickolai Zeldovich <kolya@mit.edu>
Mon, 12 Aug 2002 22:32:39 +0000 (22:32 +0000)
src/afs/AIX/osi_vfsops.c
src/afs/DARWIN/osi_vfsops.c
src/afs/DUX/osi_vfsops.c
src/afs/FBSD/osi_vfsops.c
src/afs/HPUX/osi_vfsops.c
src/afs/IRIX/osi_vfsops.c
src/afs/LINUX/osi_vfsops.c
src/afs/NBSD/osi_vfsops.c
src/afs/SOLARIS/osi_vfsops.c
src/afs/UKERNEL/osi_vfsops.c

index e8712f9dab42c5b249510ee3a0bbef846b72c195..ac8985771b58a411025354e812c41cb7c401b1eb 100644 (file)
@@ -110,6 +110,10 @@ static int afs_root_nolock (struct vfs *afsp, struct vnode **avpp)
        tvp = afs_globalVp;
     } else {
        struct ucred *credp;
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
        credp = crref();
        if (!(code = afs_InitReq(&treq, credp)) &&
            !(code = afs_CheckInit())) {
index 785e8cec698ec25be6815f508e46a4be17bc30f2..2c32894b04efb545ff0242c2089e9d356ca7917b 100644 (file)
@@ -123,7 +123,11 @@ afs_root(struct mount *mp,
        tvp = afs_globalVp;
         error=0;
     } else {
-       
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(error = afs_InitReq(&treq, &cr)) &&
            !(error = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index c5e4a04a77dbae084dffc07e9260a5a87cac7ead..c1199dd177076930a0fd15396109b81429c7cbf6 100644 (file)
@@ -136,6 +136,11 @@ int mp_afs_root (struct mount *afsp, struct vnode **avpp)
     if (afs_globalVp && (afs_globalVp->states & CStatd)) {
        tvp = afs_globalVp;
     } else {
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq, u.u_cred)) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index 605e399f7c3e948550887d958481c3606353763f..faa0fb72f7e17e6119b77b14a678f168c32e21d3 100644 (file)
@@ -122,7 +122,11 @@ afs_root(struct mount *mp,
        tvp = afs_globalVp;
         error=0;
     } else {
-       
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(error = afs_InitReq(&treq, &cr)) &&
            !(error = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index 26624c3b55714d67dc349fee32ff8002c051d21e..189202ebeb507fd0a5267d56944c8fbc589a1cc0 100644 (file)
@@ -78,6 +78,11 @@ int afs_root (struct vfs *afsp, struct vnode **avpp, char *unused1)
     if (afs_globalVp && (afs_globalVp->states & CStatd)) {
        tvp = afs_globalVp;
     } else {
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq,  p_cred(u.u_procp))) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index e93fe01bbe871aff7fc9a933dc8029cccb65954d..5c6caf9d6a0aacf2a229ff655bfa2f1dc1948f9d 100644 (file)
@@ -277,6 +277,11 @@ afs_root (OSI_VFS_ARG(afsp), avpp)
     if (afs_globalVp && (afs_globalVp->states & CStatd)) {
        tvp = afs_globalVp;
     } else {
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq, OSI_GET_CURRENT_CRED())) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index fd200623e16566463c384e42948e414efd11ce8f..ba3064875a6fe1a4869f94afd207805ad2c3de5a 100644 (file)
@@ -122,7 +122,12 @@ static int afs_root(struct super_block *afsp)
        tvp = afs_globalVp;
     } else {
        cred_t *credp = crref();
-       afs_globalVp = 0;
+
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq, credp)) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index 2157691bd2e6d07b93e5a1da7a5f1339f6286a57..efe15c003e72ab4d1ed90f9f140d635078e67d0c 100644 (file)
@@ -136,6 +136,11 @@ int mp_afs_root (struct mount *afsp, struct vnode **avpp)
     if (afs_globalVp && (afs_globalVp->states & CStatd)) {
        tvp = afs_globalVp;
     } else {
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq, cred)) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index 0707ca1e49a9c9c75f81055fd3e754fdec309084..8a30878843aedb07dbd33efdcb8957f90be112d3 100644 (file)
@@ -110,6 +110,12 @@ int afs_root (struct vfs *afsp, struct vnode **avpp)
            locked = 1;
            mutex_exit(&vp->v_lock);
        }
+
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq, proc->p_cred)) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,
index 8d945364e8877475c15ed433827ecdfc4d30103c..6c9e2ce7faf2ff8f88cb53d0dabb43341b3a5884 100644 (file)
@@ -78,6 +78,11 @@ afs_root (OSI_VFS_ARG(afsp), avpp)
     if (afs_globalVp && (afs_globalVp->states & CStatd)) {
        tvp = afs_globalVp;
     } else {
+       if (afs_globalVp) {
+           afs_PutVCache(afs_globalVp);
+           afs_globalVp = NULL;
+       }
+
        if (!(code = afs_InitReq(&treq, u.u_cred)) &&
            !(code = afs_CheckInit())) {
            tvp = afs_GetVCache(&afs_rootFid, &treq, (afs_int32 *)0,