Commit d346890bea062d697e24fb4e34591428021ad011

Authored by Trond Myklebust
1 parent 3b14d6542d

NFS: Reduce stack footprint of nfs_proc_remove()

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

Showing 6 changed files with 24 additions and 12 deletions Side-by-side Diff

... ... @@ -406,12 +406,17 @@
406 406 .rpc_argp = &arg,
407 407 .rpc_resp = &res,
408 408 };
409   - int status;
  409 + int status = -ENOMEM;
410 410  
411 411 dprintk("NFS call remove %s\n", name->name);
412   - nfs_fattr_init(&res.dir_attr);
  412 + res.dir_attr = nfs_alloc_fattr();
  413 + if (res.dir_attr == NULL)
  414 + goto out;
  415 +
413 416 status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
414   - nfs_post_op_update_inode(dir, &res.dir_attr);
  417 + nfs_post_op_update_inode(dir, res.dir_attr);
  418 + nfs_free_fattr(res.dir_attr);
  419 +out:
415 420 dprintk("NFS reply remove: %d\n", status);
416 421 return status;
417 422 }
... ... @@ -429,7 +434,7 @@
429 434 if (nfs3_async_handle_jukebox(task, dir))
430 435 return 0;
431 436 res = task->tk_msg.rpc_resp;
432   - nfs_post_op_update_inode(dir, &res->dir_attr);
  437 + nfs_post_op_update_inode(dir, res->dir_attr);
433 438 return 1;
434 439 }
435 440  
... ... @@ -762,7 +762,7 @@
762 762 static int
763 763 nfs3_xdr_removeres(struct rpc_rqst *req, __be32 *p, struct nfs_removeres *res)
764 764 {
765   - return nfs3_xdr_wccstat(req, p, &res->dir_attr);
  765 + return nfs3_xdr_wccstat(req, p, res->dir_attr);
766 766 }
767 767  
768 768 /*
... ... @@ -2599,14 +2599,19 @@
2599 2599 .rpc_argp = &args,
2600 2600 .rpc_resp = &res,
2601 2601 };
2602   - int status;
  2602 + int status = -ENOMEM;
2603 2603  
2604   - nfs_fattr_init(&res.dir_attr);
  2604 + res.dir_attr = nfs_alloc_fattr();
  2605 + if (res.dir_attr == NULL)
  2606 + goto out;
  2607 +
2605 2608 status = nfs4_call_sync(server, &msg, &args, &res, 1);
2606 2609 if (status == 0) {
2607 2610 update_changeattr(dir, &res.cinfo);
2608   - nfs_post_op_update_inode(dir, &res.dir_attr);
  2611 + nfs_post_op_update_inode(dir, res.dir_attr);
2609 2612 }
  2613 + nfs_free_fattr(res.dir_attr);
  2614 +out:
2610 2615 return status;
2611 2616 }
2612 2617  
... ... @@ -2641,7 +2646,7 @@
2641 2646 if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN)
2642 2647 return 0;
2643 2648 update_changeattr(dir, &res->cinfo);
2644   - nfs_post_op_update_inode(dir, &res->dir_attr);
  2649 + nfs_post_op_update_inode(dir, res->dir_attr);
2645 2650 return 1;
2646 2651 }
2647 2652  
... ... @@ -4815,7 +4815,7 @@
4815 4815 goto out;
4816 4816 if ((status = decode_remove(&xdr, &res->cinfo)) != 0)
4817 4817 goto out;
4818   - decode_getfattr(&xdr, &res->dir_attr, res->server,
  4818 + decode_getfattr(&xdr, res->dir_attr, res->server,
4819 4819 !RPC_IS_ASYNC(rqstp->rq_task));
4820 4820 out:
4821 4821 return status;
... ... @@ -23,6 +23,7 @@
23 23 struct nfs_removeres res;
24 24 struct inode *dir;
25 25 struct rpc_cred *cred;
  26 + struct nfs_fattr dir_attr;
26 27 };
27 28  
28 29 /**
... ... @@ -169,7 +170,7 @@
169 170 }
170 171 nfs_sb_active(dir->i_sb);
171 172 data->args.fh = NFS_FH(dir);
172   - nfs_fattr_init(&data->res.dir_attr);
  173 + nfs_fattr_init(data->res.dir_attr);
173 174  
174 175 NFS_PROTO(dir)->unlink_setup(&msg, dir);
175 176  
... ... @@ -259,6 +260,7 @@
259 260 goto out_free;
260 261 }
261 262 data->res.seq_res.sr_slotid = NFS4_MAX_SLOT_TABLE;
  263 + data->res.dir_attr = &data->dir_attr;
262 264  
263 265 status = -EBUSY;
264 266 spin_lock(&dentry->d_lock);
include/linux/nfs_xdr.h
... ... @@ -386,8 +386,8 @@
386 386  
387 387 struct nfs_removeres {
388 388 const struct nfs_server *server;
  389 + struct nfs_fattr *dir_attr;
389 390 struct nfs4_change_info cinfo;
390   - struct nfs_fattr dir_attr;
391 391 struct nfs4_sequence_res seq_res;
392 392 };
393 393