From fdd218bd91dc4e96d23ede5c9f2e8a1642d4df61 Mon Sep 17 00:00:00 2001 From: Mattias Amnefelt Date: Sun, 21 Apr 2002 21:45:56 +0000 Subject: [PATCH] tru64 needs vrele when an error happens, rather than just returning. make sure we do so (cherry picked from commit 7ffbc40b212a38de92da562d285e715150e9d771) --- 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 32135b769..37ca0ff15 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); @@ -445,10 +447,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 6512b599a..10ebcfaca 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; @@ -151,10 +152,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; } @@ -193,7 +195,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; @@ -292,10 +296,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 2c652227e..5c9de0676 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; @@ -144,9 +146,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); + return code; } diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c index d7aa15552..93fd43c85 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -234,11 +234,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 @@ -260,6 +270,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 3fe6c993b..5a0cf7e38 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -78,16 +78,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 @@ -95,7 +97,7 @@ afs_symlink */ if ( adp->states & CRO ) { code = EROFS; - return code; + goto done2; } InStatus.Mask = AFS_SETMODTIME | AFS_SETMODE; @@ -210,12 +212,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