NFS: Reduce the stack footprint of nfs_rmdir
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 16 Apr 2010 20:22:50 +0000 (16:22 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 14 May 2010 19:09:26 +0000 (15:09 -0400)
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs3proc.c

index 80378d1283cb58be680a42ef6fbd080336fb3233..fabb4f2849a119b0d62745ad9f6aacb2e27cca1a 100644 (file)
@@ -574,7 +574,7 @@ out:
 static int
 nfs3_proc_rmdir(struct inode *dir, struct qstr *name)
 {
-       struct nfs_fattr        dir_attr;
+       struct nfs_fattr        *dir_attr;
        struct nfs3_diropargs   arg = {
                .fh             = NFS_FH(dir),
                .name           = name->name,
@@ -583,14 +583,19 @@ nfs3_proc_rmdir(struct inode *dir, struct qstr *name)
        struct rpc_message msg = {
                .rpc_proc       = &nfs3_procedures[NFS3PROC_RMDIR],
                .rpc_argp       = &arg,
-               .rpc_resp       = &dir_attr,
        };
-       int                     status;
+       int status = -ENOMEM;
 
        dprintk("NFS call  rmdir %s\n", name->name);
-       nfs_fattr_init(&dir_attr);
+       dir_attr = nfs_alloc_fattr();
+       if (dir_attr == NULL)
+               goto out;
+
+       msg.rpc_resp = dir_attr;
        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
-       nfs_post_op_update_inode(dir, &dir_attr);
+       nfs_post_op_update_inode(dir, dir_attr);
+       nfs_free_fattr(dir_attr);
+out:
        dprintk("NFS reply rmdir: %d\n", status);
        return status;
 }