afs/VNOPS: reduce stack usage
authorChas Williams (CONTRACTOR) <chas@cmf.nrl.navy.mil>
Fri, 28 Mar 2014 20:46:32 +0000 (16:46 -0400)
committerD Brashear <shadow@your-file-system.com>
Wed, 2 Apr 2014 14:05:55 +0000 (07:05 -0700)
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 <kaduk@mit.edu>
Tested-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: D Brashear <shadow@your-file-system.com>

src/afs/VNOPS/afs_vnop_create.c
src/afs/VNOPS/afs_vnop_dirops.c
src/afs/VNOPS/afs_vnop_link.c
src/afs/VNOPS/afs_vnop_rename.c
src/afs/VNOPS/afs_vnop_symlink.c

index 304987f..daaa9f0 100644 (file)
@@ -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;
 }
 
index f4e4e45..47c71a7 100644 (file)
@@ -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;
 }
 
index 26b6c71..3457998 100644 (file)
@@ -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;
 }
index 72c3598..cc3f1f5 100644 (file)
@@ -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;
 }
 
index dfb9e4c..8d4c17a 100644 (file)
@@ -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;
 }