From 7ffbc40b212a38de92da562d285e715150e9d771 Mon Sep 17 00:00:00 2001 From: Mattias Amnefelt Date: Wed, 20 Mar 2002 18:38:28 +0000 Subject: [PATCH] tru64-avoid-leaking-vnodes-when-failure-20020320 tru64 needs vrele when an error happens, rather than just returning. make sure we do so --- src/afs/VNOPS/afs_vnop_create.c | 11 +++++++++-- src/afs/VNOPS/afs_vnop_dirops.c | 13 +++++++++---- src/afs/VNOPS/afs_vnop_link.c | 8 ++++++-- src/afs/VNOPS/afs_vnop_remove.c | 18 ++++++++++++++++-- src/afs/VNOPS/afs_vnop_symlink.c | 19 +++++++++++-------- 5 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/afs/VNOPS/afs_vnop_create.c b/src/afs/VNOPS/afs_vnop_create.c index 57c956ecd..dc7c7134d 100644 --- a/src/afs/VNOPS/afs_vnop_create.c +++ b/src/afs/VNOPS/afs_vnop_create.c @@ -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; } diff --git a/src/afs/VNOPS/afs_vnop_dirops.c b/src/afs/VNOPS/afs_vnop_dirops.c index 096aebf90..3f8dce80f 100644 --- a/src/afs/VNOPS/afs_vnop_dirops.c +++ b/src/afs/VNOPS/afs_vnop_dirops.c @@ -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; } diff --git a/src/afs/VNOPS/afs_vnop_link.c b/src/afs/VNOPS/afs_vnop_link.c index 88c6ad48d..493363cef 100644 --- a/src/afs/VNOPS/afs_vnop_link.c +++ b/src/afs/VNOPS/afs_vnop_link.c @@ -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; } diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c index 8e52b441b..8886da3d6 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -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; } diff --git a/src/afs/VNOPS/afs_vnop_symlink.c b/src/afs/VNOPS/afs_vnop_symlink.c index 2e1826424..678b0a778 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -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; } -- 2.39.5