Commit d346890bea062d697e24fb4e34591428021ad011
1 parent
3b14d6542d
Exists in
master
and in
7 other branches
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
fs/nfs/nfs3proc.c
... | ... | @@ -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 |
fs/nfs/nfs3xdr.c
fs/nfs/nfs4proc.c
... | ... | @@ -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 |
fs/nfs/nfs4xdr.c
... | ... | @@ -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; |
fs/nfs/unlink.c
... | ... | @@ -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