diff options
-rw-r--r-- | fs/nfs/nfs4proc.c | 49 | ||||
-rw-r--r-- | fs/nfs/unlink.c | 9 | ||||
-rw-r--r-- | include/linux/sunrpc/sched.h | 3 | ||||
-rw-r--r-- | net/sunrpc/clnt.c | 36 | ||||
-rw-r--r-- | net/sunrpc/rpcb_clnt.c | 8 |
5 files changed, 67 insertions, 38 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index a51a7537f3f6..ff2c5f83ce87 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -779,12 +779,18 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) | |||
779 | { | 779 | { |
780 | struct nfs_server *server = NFS_SERVER(data->dir->d_inode); | 780 | struct nfs_server *server = NFS_SERVER(data->dir->d_inode); |
781 | struct rpc_task *task; | 781 | struct rpc_task *task; |
782 | struct rpc_task_setup task_setup_data = { | ||
783 | .rpc_client = server->client, | ||
784 | .callback_ops = &nfs4_open_confirm_ops, | ||
785 | .callback_data = data, | ||
786 | .flags = RPC_TASK_ASYNC, | ||
787 | }; | ||
782 | int status; | 788 | int status; |
783 | 789 | ||
784 | kref_get(&data->kref); | 790 | kref_get(&data->kref); |
785 | data->rpc_done = 0; | 791 | data->rpc_done = 0; |
786 | data->rpc_status = 0; | 792 | data->rpc_status = 0; |
787 | task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_confirm_ops, data); | 793 | task = rpc_run_task(&task_setup_data); |
788 | if (IS_ERR(task)) | 794 | if (IS_ERR(task)) |
789 | return PTR_ERR(task); | 795 | return PTR_ERR(task); |
790 | status = nfs4_wait_for_completion_rpc_task(task); | 796 | status = nfs4_wait_for_completion_rpc_task(task); |
@@ -908,13 +914,19 @@ static int _nfs4_proc_open(struct nfs4_opendata *data) | |||
908 | struct nfs_openargs *o_arg = &data->o_arg; | 914 | struct nfs_openargs *o_arg = &data->o_arg; |
909 | struct nfs_openres *o_res = &data->o_res; | 915 | struct nfs_openres *o_res = &data->o_res; |
910 | struct rpc_task *task; | 916 | struct rpc_task *task; |
917 | struct rpc_task_setup task_setup_data = { | ||
918 | .rpc_client = server->client, | ||
919 | .callback_ops = &nfs4_open_ops, | ||
920 | .callback_data = data, | ||
921 | .flags = RPC_TASK_ASYNC, | ||
922 | }; | ||
911 | int status; | 923 | int status; |
912 | 924 | ||
913 | kref_get(&data->kref); | 925 | kref_get(&data->kref); |
914 | data->rpc_done = 0; | 926 | data->rpc_done = 0; |
915 | data->rpc_status = 0; | 927 | data->rpc_status = 0; |
916 | data->cancelled = 0; | 928 | data->cancelled = 0; |
917 | task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data); | 929 | task = rpc_run_task(&task_setup_data); |
918 | if (IS_ERR(task)) | 930 | if (IS_ERR(task)) |
919 | return PTR_ERR(task); | 931 | return PTR_ERR(task); |
920 | status = nfs4_wait_for_completion_rpc_task(task); | 932 | status = nfs4_wait_for_completion_rpc_task(task); |
@@ -1309,6 +1321,11 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait) | |||
1309 | struct nfs4_closedata *calldata; | 1321 | struct nfs4_closedata *calldata; |
1310 | struct nfs4_state_owner *sp = state->owner; | 1322 | struct nfs4_state_owner *sp = state->owner; |
1311 | struct rpc_task *task; | 1323 | struct rpc_task *task; |
1324 | struct rpc_task_setup task_setup_data = { | ||
1325 | .rpc_client = server->client, | ||
1326 | .callback_ops = &nfs4_close_ops, | ||
1327 | .flags = RPC_TASK_ASYNC, | ||
1328 | }; | ||
1312 | int status = -ENOMEM; | 1329 | int status = -ENOMEM; |
1313 | 1330 | ||
1314 | calldata = kmalloc(sizeof(*calldata), GFP_KERNEL); | 1331 | calldata = kmalloc(sizeof(*calldata), GFP_KERNEL); |
@@ -1328,7 +1345,8 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait) | |||
1328 | calldata->path.mnt = mntget(path->mnt); | 1345 | calldata->path.mnt = mntget(path->mnt); |
1329 | calldata->path.dentry = dget(path->dentry); | 1346 | calldata->path.dentry = dget(path->dentry); |
1330 | 1347 | ||
1331 | task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_close_ops, calldata); | 1348 | task_setup_data.callback_data = calldata; |
1349 | task = rpc_run_task(&task_setup_data); | ||
1332 | if (IS_ERR(task)) | 1350 | if (IS_ERR(task)) |
1333 | return PTR_ERR(task); | 1351 | return PTR_ERR(task); |
1334 | status = 0; | 1352 | status = 0; |
@@ -3027,6 +3045,11 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co | |||
3027 | struct nfs4_delegreturndata *data; | 3045 | struct nfs4_delegreturndata *data; |
3028 | struct nfs_server *server = NFS_SERVER(inode); | 3046 | struct nfs_server *server = NFS_SERVER(inode); |
3029 | struct rpc_task *task; | 3047 | struct rpc_task *task; |
3048 | struct rpc_task_setup task_setup_data = { | ||
3049 | .rpc_client = server->client, | ||
3050 | .callback_ops = &nfs4_delegreturn_ops, | ||
3051 | .flags = RPC_TASK_ASYNC, | ||
3052 | }; | ||
3030 | int status; | 3053 | int status; |
3031 | 3054 | ||
3032 | data = kmalloc(sizeof(*data), GFP_KERNEL); | 3055 | data = kmalloc(sizeof(*data), GFP_KERNEL); |
@@ -3043,7 +3066,8 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co | |||
3043 | data->timestamp = jiffies; | 3066 | data->timestamp = jiffies; |
3044 | data->rpc_status = 0; | 3067 | data->rpc_status = 0; |
3045 | 3068 | ||
3046 | task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data); | 3069 | task_setup_data.callback_data = data; |
3070 | task = rpc_run_task(&task_setup_data); | ||
3047 | if (IS_ERR(task)) | 3071 | if (IS_ERR(task)) |
3048 | return PTR_ERR(task); | 3072 | return PTR_ERR(task); |
3049 | status = nfs4_wait_for_completion_rpc_task(task); | 3073 | status = nfs4_wait_for_completion_rpc_task(task); |
@@ -3260,6 +3284,11 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, | |||
3260 | struct nfs_seqid *seqid) | 3284 | struct nfs_seqid *seqid) |
3261 | { | 3285 | { |
3262 | struct nfs4_unlockdata *data; | 3286 | struct nfs4_unlockdata *data; |
3287 | struct rpc_task_setup task_setup_data = { | ||
3288 | .rpc_client = NFS_CLIENT(lsp->ls_state->inode), | ||
3289 | .callback_ops = &nfs4_locku_ops, | ||
3290 | .flags = RPC_TASK_ASYNC, | ||
3291 | }; | ||
3263 | 3292 | ||
3264 | /* Ensure this is an unlock - when canceling a lock, the | 3293 | /* Ensure this is an unlock - when canceling a lock, the |
3265 | * canceled lock is passed in, and it won't be an unlock. | 3294 | * canceled lock is passed in, and it won't be an unlock. |
@@ -3272,7 +3301,8 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, | |||
3272 | return ERR_PTR(-ENOMEM); | 3301 | return ERR_PTR(-ENOMEM); |
3273 | } | 3302 | } |
3274 | 3303 | ||
3275 | return rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data); | 3304 | task_setup_data.callback_data = data; |
3305 | return rpc_run_task(&task_setup_data); | ||
3276 | } | 3306 | } |
3277 | 3307 | ||
3278 | static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) | 3308 | static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) |
@@ -3438,6 +3468,11 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f | |||
3438 | { | 3468 | { |
3439 | struct nfs4_lockdata *data; | 3469 | struct nfs4_lockdata *data; |
3440 | struct rpc_task *task; | 3470 | struct rpc_task *task; |
3471 | struct rpc_task_setup task_setup_data = { | ||
3472 | .rpc_client = NFS_CLIENT(state->inode), | ||
3473 | .callback_ops = &nfs4_lock_ops, | ||
3474 | .flags = RPC_TASK_ASYNC, | ||
3475 | }; | ||
3441 | int ret; | 3476 | int ret; |
3442 | 3477 | ||
3443 | dprintk("%s: begin!\n", __FUNCTION__); | 3478 | dprintk("%s: begin!\n", __FUNCTION__); |
@@ -3449,8 +3484,8 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f | |||
3449 | data->arg.block = 1; | 3484 | data->arg.block = 1; |
3450 | if (reclaim != 0) | 3485 | if (reclaim != 0) |
3451 | data->arg.reclaim = 1; | 3486 | data->arg.reclaim = 1; |
3452 | task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC, | 3487 | task_setup_data.callback_data = data; |
3453 | &nfs4_lock_ops, data); | 3488 | task = rpc_run_task(&task_setup_data); |
3454 | if (IS_ERR(task)) | 3489 | if (IS_ERR(task)) |
3455 | return PTR_ERR(task); | 3490 | return PTR_ERR(task); |
3456 | ret = nfs4_wait_for_completion_rpc_task(task); | 3491 | ret = nfs4_wait_for_completion_rpc_task(task); |
diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c index 8e5428e0b86f..6660d9a53345 100644 --- a/fs/nfs/unlink.c +++ b/fs/nfs/unlink.c | |||
@@ -127,6 +127,11 @@ static const struct rpc_call_ops nfs_unlink_ops = { | |||
127 | 127 | ||
128 | static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct nfs_unlinkdata *data) | 128 | static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct nfs_unlinkdata *data) |
129 | { | 129 | { |
130 | struct rpc_task_setup task_setup_data = { | ||
131 | .callback_ops = &nfs_unlink_ops, | ||
132 | .callback_data = data, | ||
133 | .flags = RPC_TASK_ASYNC, | ||
134 | }; | ||
130 | struct rpc_task *task; | 135 | struct rpc_task *task; |
131 | struct dentry *alias; | 136 | struct dentry *alias; |
132 | 137 | ||
@@ -160,7 +165,9 @@ static int nfs_do_call_unlink(struct dentry *parent, struct inode *dir, struct n | |||
160 | data->args.fh = NFS_FH(dir); | 165 | data->args.fh = NFS_FH(dir); |
161 | nfs_fattr_init(&data->res.dir_attr); | 166 | nfs_fattr_init(&data->res.dir_attr); |
162 | 167 | ||
163 | task = rpc_run_task(NFS_CLIENT(dir), RPC_TASK_ASYNC, &nfs_unlink_ops, data); | 168 | task_setup_data.rpc_client = NFS_CLIENT(dir); |
169 | |||
170 | task = rpc_run_task(&task_setup_data); | ||
164 | if (!IS_ERR(task)) | 171 | if (!IS_ERR(task)) |
165 | rpc_put_task(task); | 172 | rpc_put_task(task); |
166 | return 1; | 173 | return 1; |
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 9efe045fc376..d974421d7647 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
@@ -244,8 +244,7 @@ struct rpc_wait_queue { | |||
244 | * Function prototypes | 244 | * Function prototypes |
245 | */ | 245 | */ |
246 | struct rpc_task *rpc_new_task(const struct rpc_task_setup *); | 246 | struct rpc_task *rpc_new_task(const struct rpc_task_setup *); |
247 | struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags, | 247 | struct rpc_task *rpc_run_task(const struct rpc_task_setup *); |
248 | const struct rpc_call_ops *ops, void *data); | ||
249 | void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *); | 248 | void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *); |
250 | void rpc_put_task(struct rpc_task *); | 249 | void rpc_put_task(struct rpc_task *); |
251 | void rpc_exit_task(struct rpc_task *); | 250 | void rpc_exit_task(struct rpc_task *); |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 7c80abd9263f..9aad45946d32 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -523,8 +523,11 @@ void rpc_clnt_sigunmask(struct rpc_clnt *clnt, sigset_t *oldset) | |||
523 | } | 523 | } |
524 | EXPORT_SYMBOL_GPL(rpc_clnt_sigunmask); | 524 | EXPORT_SYMBOL_GPL(rpc_clnt_sigunmask); |
525 | 525 | ||
526 | static | 526 | /** |
527 | struct rpc_task *rpc_do_run_task(const struct rpc_task_setup *task_setup_data) | 527 | * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it |
528 | * @task_setup_data: pointer to task initialisation data | ||
529 | */ | ||
530 | struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data) | ||
528 | { | 531 | { |
529 | struct rpc_task *task, *ret; | 532 | struct rpc_task *task, *ret; |
530 | sigset_t oldset; | 533 | sigset_t oldset; |
@@ -553,6 +556,7 @@ out: | |||
553 | rpc_restore_sigmask(&oldset); | 556 | rpc_restore_sigmask(&oldset); |
554 | return ret; | 557 | return ret; |
555 | } | 558 | } |
559 | EXPORT_SYMBOL_GPL(rpc_run_task); | ||
556 | 560 | ||
557 | /** | 561 | /** |
558 | * rpc_call_sync - Perform a synchronous RPC call | 562 | * rpc_call_sync - Perform a synchronous RPC call |
@@ -573,7 +577,7 @@ int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags) | |||
573 | 577 | ||
574 | BUG_ON(flags & RPC_TASK_ASYNC); | 578 | BUG_ON(flags & RPC_TASK_ASYNC); |
575 | 579 | ||
576 | task = rpc_do_run_task(&task_setup_data); | 580 | task = rpc_run_task(&task_setup_data); |
577 | if (IS_ERR(task)) | 581 | if (IS_ERR(task)) |
578 | return PTR_ERR(task); | 582 | return PTR_ERR(task); |
579 | status = task->tk_status; | 583 | status = task->tk_status; |
@@ -603,7 +607,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags, | |||
603 | .flags = flags|RPC_TASK_ASYNC, | 607 | .flags = flags|RPC_TASK_ASYNC, |
604 | }; | 608 | }; |
605 | 609 | ||
606 | task = rpc_do_run_task(&task_setup_data); | 610 | task = rpc_run_task(&task_setup_data); |
607 | if (IS_ERR(task)) | 611 | if (IS_ERR(task)) |
608 | return PTR_ERR(task); | 612 | return PTR_ERR(task); |
609 | rpc_put_task(task); | 613 | rpc_put_task(task); |
@@ -611,28 +615,6 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags, | |||
611 | } | 615 | } |
612 | EXPORT_SYMBOL_GPL(rpc_call_async); | 616 | EXPORT_SYMBOL_GPL(rpc_call_async); |
613 | 617 | ||
614 | /** | ||
615 | * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it | ||
616 | * @clnt: pointer to RPC client | ||
617 | * @flags: RPC flags | ||
618 | * @ops: RPC call ops | ||
619 | * @data: user call data | ||
620 | */ | ||
621 | struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags, | ||
622 | const struct rpc_call_ops *tk_ops, | ||
623 | void *data) | ||
624 | { | ||
625 | struct rpc_task_setup task_setup_data = { | ||
626 | .rpc_client = clnt, | ||
627 | .callback_ops = tk_ops, | ||
628 | .callback_data = data, | ||
629 | .flags = flags, | ||
630 | }; | ||
631 | |||
632 | return rpc_do_run_task(&task_setup_data); | ||
633 | } | ||
634 | EXPORT_SYMBOL_GPL(rpc_run_task); | ||
635 | |||
636 | void | 618 | void |
637 | rpc_call_setup(struct rpc_task *task, const struct rpc_message *msg, int flags) | 619 | rpc_call_setup(struct rpc_task *task, const struct rpc_message *msg, int flags) |
638 | { | 620 | { |
@@ -1550,7 +1532,7 @@ struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred, int | |||
1550 | .callback_ops = &rpc_default_ops, | 1532 | .callback_ops = &rpc_default_ops, |
1551 | .flags = flags, | 1533 | .flags = flags, |
1552 | }; | 1534 | }; |
1553 | return rpc_do_run_task(&task_setup_data); | 1535 | return rpc_run_task(&task_setup_data); |
1554 | } | 1536 | } |
1555 | EXPORT_SYMBOL_GPL(rpc_call_null); | 1537 | EXPORT_SYMBOL_GPL(rpc_call_null); |
1556 | 1538 | ||
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index a05493aedb68..7c362e5f6e1b 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
@@ -310,6 +310,10 @@ void rpcb_getport_async(struct rpc_task *task) | |||
310 | struct rpc_clnt *rpcb_clnt; | 310 | struct rpc_clnt *rpcb_clnt; |
311 | static struct rpcbind_args *map; | 311 | static struct rpcbind_args *map; |
312 | struct rpc_task *child; | 312 | struct rpc_task *child; |
313 | struct rpc_task_setup task_setup_data = { | ||
314 | .callback_ops = &rpcb_getport_ops, | ||
315 | .flags = RPC_TASK_ASYNC, | ||
316 | }; | ||
313 | struct sockaddr addr; | 317 | struct sockaddr addr; |
314 | int status; | 318 | int status; |
315 | struct rpcb_info *info; | 319 | struct rpcb_info *info; |
@@ -395,7 +399,9 @@ void rpcb_getport_async(struct rpc_task *task) | |||
395 | sizeof(map->r_addr)); | 399 | sizeof(map->r_addr)); |
396 | map->r_owner = RPCB_OWNER_STRING; /* ignored for GETADDR */ | 400 | map->r_owner = RPCB_OWNER_STRING; /* ignored for GETADDR */ |
397 | 401 | ||
398 | child = rpc_run_task(rpcb_clnt, RPC_TASK_ASYNC, &rpcb_getport_ops, map); | 402 | task_setup_data.rpc_client = rpcb_clnt; |
403 | task_setup_data.callback_data = map; | ||
404 | child = rpc_run_task(&task_setup_data); | ||
399 | rpc_release_client(rpcb_clnt); | 405 | rpc_release_client(rpcb_clnt); |
400 | if (IS_ERR(child)) { | 406 | if (IS_ERR(child)) { |
401 | status = -EIO; | 407 | status = -EIO; |