From 972585c24b5c193a982570ff9264a1971760f48f Mon Sep 17 00:00:00 2001 From: "Chas Williams (CONTRACTOR)" Date: Fri, 28 Mar 2014 16:46:32 -0400 Subject: [PATCH] afs/VNOPS: reduce stack usage AFSFetchStatus is rather large and is in the stack twice. Allocating with osi_AllocSmallSpace will save about 160 bytes of stack. Change-Id: I13ac31814d9d5975f245ba8c66a7befac471503e Reviewed-on: http://gerrit.openafs.org/10964 Reviewed-by: Benjamin Kaduk Tested-by: Benjamin Kaduk Reviewed-by: D Brashear --- src/afs/VNOPS/afs_vnop_create.c | 15 ++++++++++----- src/afs/VNOPS/afs_vnop_dirops.c | 15 ++++++++++----- src/afs/VNOPS/afs_vnop_link.c | 18 ++++++++++++------ src/afs/VNOPS/afs_vnop_rename.c | 21 +++++++++++++-------- src/afs/VNOPS/afs_vnop_symlink.c | 15 ++++++++++----- 5 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/afs/VNOPS/afs_vnop_create.c b/src/afs/VNOPS/afs_vnop_create.c index 304987f4a..daaa9f06a 100644 --- a/src/afs/VNOPS/afs_vnop_create.c +++ b/src/afs/VNOPS/afs_vnop_create.c @@ -46,7 +46,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, struct afs_conn *tc; struct VenusFid newFid; struct AFSStoreStatus InStatus; - struct AFSFetchStatus OutFidStatus, OutDirStatus; + struct AFSFetchStatus *OutFidStatus, *OutDirStatus; struct AFSVolSync tsync; struct AFSCallBack CallBack; afs_int32 now; @@ -60,8 +60,11 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, XSTATS_DECLS; OSI_VC_CONVERT(adp); - AFS_STATCNT(afs_create); + + OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + if ((code = afs_InitReq(&treq, acred))) goto done2; @@ -307,7 +310,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, code = RXAFS_CreateFile(rxconn, (struct AFSFid *)&adp->f.fid.Fid, aname, &InStatus, (struct AFSFid *) - &newFid.Fid, &OutFidStatus, &OutDirStatus, + &newFid.Fid, OutFidStatus, OutDirStatus, &CallBack, &tsync); RX_AFS_GLOCK(); XSTATS_END_TIME; @@ -372,7 +375,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, /* otherwise, we should see if we can make the change to the dir locally */ if (tdc) UpgradeSToWLock(&tdc->lock, 631); - if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { + if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) { /* we can do it locally */ ObtainWriteLock(&afs_xdcache, 291); code = afs_dir_Create(tdc, aname, &newFid.Fid); @@ -454,7 +457,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, afs_DisconAddDirty(tvc, VDisconCreate, 0); afs_GenDisconStatus(adp, tvc, &newFid, attrs, &treq, VREG); } else { - afs_ProcessFS(tvc, &OutFidStatus, &treq); + afs_ProcessFS(tvc, OutFidStatus, &treq); } tvc->f.parent.vnode = adp->f.fid.Fid.Vnode; @@ -498,6 +501,8 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, code = afs_CheckCode(code, &treq, 20); done2: + osi_FreeSmallSpace(OutFidStatus); + osi_FreeSmallSpace(OutDirStatus); return code; } diff --git a/src/afs/VNOPS/afs_vnop_dirops.c b/src/afs/VNOPS/afs_vnop_dirops.c index f4e4e4565..47c71a773 100644 --- a/src/afs/VNOPS/afs_vnop_dirops.c +++ b/src/afs/VNOPS/afs_vnop_dirops.c @@ -47,7 +47,7 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, afs_size_t offset, len; struct vcache *tvc; struct AFSStoreStatus InStatus; - struct AFSFetchStatus OutFidStatus, OutDirStatus; + struct AFSFetchStatus *OutFidStatus, *OutDirStatus; struct AFSCallBack CallBack; struct AFSVolSync tsync; afs_int32 now; @@ -59,6 +59,9 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, afs_Trace2(afs_iclSetp, CM_TRACE_MKDIR, ICL_TYPE_POINTER, adp, ICL_TYPE_STRING, aname); + OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + if ((code = afs_InitReq(&treq, acred))) goto done2; afs_InitFakeStat(&fakestate); @@ -115,8 +118,8 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, aname, &InStatus, (struct AFSFid *)&newFid.Fid, - &OutFidStatus, - &OutDirStatus, + OutFidStatus, + OutDirStatus, &CallBack, &tsync); RX_AFS_GLOCK(); @@ -163,7 +166,7 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, /* otherwise, we should see if we can make the change to the dir locally */ if (tdc) ObtainWriteLock(&tdc->lock, 632); - if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { + if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) { /* we can do it locally */ ObtainWriteLock(&afs_xdcache, 294); code = afs_dir_Create(tdc, aname, &newFid.Fid); @@ -182,7 +185,7 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, /* We will have to settle with the local link count. */ adp->f.m.LinkCount++; else - adp->f.m.LinkCount = OutDirStatus.LinkCount; + adp->f.m.LinkCount = OutDirStatus->LinkCount; newFid.Cell = adp->f.fid.Cell; newFid.Fid.Volume = adp->f.fid.Fid.Volume; ReleaseWriteLock(&adp->lock); @@ -242,6 +245,8 @@ afs_mkdir(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, afs_PutFakeStat(&fakestate); code = afs_CheckCode(code, &treq, 26); done2: + osi_FreeSmallSpace(OutFidStatus); + osi_FreeSmallSpace(OutDirStatus); return code; } diff --git a/src/afs/VNOPS/afs_vnop_link.c b/src/afs/VNOPS/afs_vnop_link.c index 26b6c71a2..345799857 100644 --- a/src/afs/VNOPS/afs_vnop_link.c +++ b/src/afs/VNOPS/afs_vnop_link.c @@ -43,7 +43,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname, afs_int32 code; struct afs_conn *tc; afs_size_t offset, len; - struct AFSFetchStatus OutFidStatus, OutDirStatus; + struct AFSFetchStatus *OutFidStatus, *OutDirStatus; struct AFSVolSync tsync; struct afs_fakestat_state vfakestate, dfakestate; struct rx_connection *rxconn; @@ -53,13 +53,17 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname, AFS_STATCNT(afs_link); afs_Trace3(afs_iclSetp, CM_TRACE_LINK, ICL_TYPE_POINTER, adp, ICL_TYPE_POINTER, avc, ICL_TYPE_STRING, aname); + + OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + /* create a hard link; new entry is aname in dir adp */ if ((code = afs_InitReq(&treq, acred))) goto done2; afs_InitFakeStat(&vfakestate); afs_InitFakeStat(&dfakestate); - + AFS_DISCON_LOCK(); code = afs_EvalFakeStat(&avc, &vfakestate, &treq); @@ -89,7 +93,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname, code = EROFS; goto done; } - + if (AFS_IS_DISCONNECTED) { code = ENETDOWN; goto done; @@ -104,8 +108,8 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname, RX_AFS_GUNLOCK(); code = RXAFS_Link(rxconn, (struct AFSFid *)&adp->f.fid.Fid, aname, - (struct AFSFid *)&avc->f.fid.Fid, &OutFidStatus, - &OutDirStatus, &tsync); + (struct AFSFid *)&avc->f.fid.Fid, OutFidStatus, + OutDirStatus, &tsync); RX_AFS_GLOCK(); XSTATS_END_TIME; @@ -130,7 +134,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname, } if (tdc) ObtainWriteLock(&tdc->lock, 635); - if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { + if (afs_LocalHero(adp, tdc, OutDirStatus, 1)) { /* we can do it locally */ ObtainWriteLock(&afs_xdcache, 290); code = afs_dir_Create(tdc, aname, &avc->f.fid.Fid); @@ -168,5 +172,7 @@ afs_link(struct vcache *avc, OSI_VC_DECL(adp), char *aname, afs_PutFakeStat(&dfakestate); AFS_DISCON_UNLOCK(); done2: + osi_FreeSmallSpace(OutFidStatus); + osi_FreeSmallSpace(OutDirStatus); return code; } diff --git a/src/afs/VNOPS/afs_vnop_rename.c b/src/afs/VNOPS/afs_vnop_rename.c index 72c3598ad..cc3f1f5ea 100644 --- a/src/afs/VNOPS/afs_vnop_rename.c +++ b/src/afs/VNOPS/afs_vnop_rename.c @@ -42,7 +42,7 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, struct VenusFid unlinkFid, fileFid; struct vcache *tvc; struct dcache *tdc1, *tdc2; - struct AFSFetchStatus OutOldDirStatus, OutNewDirStatus; + struct AFSFetchStatus *OutOldDirStatus, *OutNewDirStatus; struct AFSVolSync tsync; struct rx_connection *rxconn; XSTATS_DECLS; @@ -51,6 +51,9 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, ICL_TYPE_STRING, aname1, ICL_TYPE_POINTER, andp, ICL_TYPE_STRING, aname2); + OutOldDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + OutNewDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + if (strlen(aname1) > AFSNAMEMAX || strlen(aname2) > AFSNAMEMAX) { code = ENAMETOOLONG; goto done; @@ -179,8 +182,8 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, aname1, (struct AFSFid *)&andp->f.fid.Fid, aname2, - &OutOldDirStatus, - &OutNewDirStatus, + OutOldDirStatus, + OutNewDirStatus, &tsync); RX_AFS_GLOCK(); XSTATS_END_TIME; @@ -246,14 +249,14 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, if (!AFS_IS_DISCON_RW) { if (oneDir) { /* number increases by 1 for whole rename operation */ - if (!afs_LocalHero(aodp, tdc1, &OutOldDirStatus, 1)) { + if (!afs_LocalHero(aodp, tdc1, OutOldDirStatus, 1)) { doLocally = 0; } } else { /* two separate dirs, each increasing by 1 */ - if (!afs_LocalHero(aodp, tdc1, &OutOldDirStatus, 1)) + if (!afs_LocalHero(aodp, tdc1, OutOldDirStatus, 1)) doLocally = 0; - if (!afs_LocalHero(andp, tdc2, &OutNewDirStatus, 1)) + if (!afs_LocalHero(andp, tdc2, OutNewDirStatus, 1)) doLocally = 0; if (!doLocally) { if (tdc1) { @@ -307,9 +310,9 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, } /* If we're in the same directory, link count doesn't change */ } else { - aodp->f.m.LinkCount = OutOldDirStatus.LinkCount; + aodp->f.m.LinkCount = OutOldDirStatus->LinkCount; if (!oneDir) - andp->f.m.LinkCount = OutNewDirStatus.LinkCount; + andp->f.m.LinkCount = OutNewDirStatus->LinkCount; } } else { /* operation failed (code != 0) */ @@ -436,6 +439,8 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp, } code = returnCode; done: + osi_FreeSmallSpace(OutOldDirStatus); + osi_FreeSmallSpace(OutNewDirStatus); return code; } diff --git a/src/afs/VNOPS/afs_vnop_symlink.c b/src/afs/VNOPS/afs_vnop_symlink.c index dfb9e4c2c..8d4c17a93 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -79,7 +79,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, struct server *hostp = 0; struct vcache *tvc; struct AFSStoreStatus InStatus; - struct AFSFetchStatus OutFidStatus, OutDirStatus; + struct AFSFetchStatus *OutFidStatus, *OutDirStatus; struct AFSCallBack CallBack; struct AFSVolSync tsync; struct volume *volp = 0; @@ -92,6 +92,9 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp, ICL_TYPE_STRING, aname); + OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ); + if ((code = afs_InitReq(&treq, acred))) goto done2; @@ -169,7 +172,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, (struct AFSFid *)&adp->f.fid.Fid, aname, atargetName, &InStatus, (struct AFSFid *)&newFid.Fid, - &OutFidStatus, &OutDirStatus, + OutFidStatus, OutDirStatus, &CallBack, &tsync); RX_AFS_GLOCK(); } else { @@ -178,7 +181,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, RXAFS_Symlink(rxconn, (struct AFSFid *)&adp->f.fid.Fid, aname, atargetName, &InStatus, (struct AFSFid *)&newFid.Fid, - &OutFidStatus, &OutDirStatus, &tsync); + OutFidStatus, OutDirStatus, &tsync); RX_AFS_GLOCK(); } XSTATS_END_TIME; @@ -211,7 +214,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, goto done; } /* otherwise, we should see if we can make the change to the dir locally */ - if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) { + if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) { /* we can do it locally */ ObtainWriteLock(&afs_xdcache, 293); /* If the following fails because the name has been created in the meantime, the @@ -273,7 +276,7 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, } afs_DisconAddDirty(tvc, VDisconCreate, 0); } else { - afs_ProcessFS(tvc, &OutFidStatus, &treq); + afs_ProcessFS(tvc, OutFidStatus, &treq); } if (!tvc->linkData) { @@ -296,6 +299,8 @@ afs_symlink(OSI_VC_DECL(adp), char *aname, struct vattr *attrs, AFS_DISCON_UNLOCK(); code = afs_CheckCode(code, &treq, 31); done2: + osi_FreeSmallSpace(OutFidStatus); + osi_FreeSmallSpace(OutDirStatus); return code; } -- 2.39.5