diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-02-19 20:04:23 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-02-26 00:40:37 -0500 |
commit | 101070ca2fe67186f5f5517b66cb4757b17f4e29 (patch) | |
tree | b131c97e3033fc4c848e8cb3d76f675735b95085 /fs/nfs/direct.c | |
parent | 5746006f1d17d9d5a3015051ea54de4341cb31f9 (diff) |
NFS: Ensure that the asynchronous RPC calls complete on nfsiod.
We want to ensure that rpc_call_ops that involve mntput() are run on nfsiod
rather than on rpciod, so that they don't deadlock when the resulting
umount calls rpc_shutdown_client(). Hence we specify that read, write and
commit calls must complete on nfsiod.
Ditto for NFSv4 open, lock, locku and close asynchronous calls.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/direct.c')
-rw-r--r-- | fs/nfs/direct.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index e0170407a885..e44200579c8d 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -280,6 +280,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, | |||
280 | .rpc_client = NFS_CLIENT(inode), | 280 | .rpc_client = NFS_CLIENT(inode), |
281 | .rpc_message = &msg, | 281 | .rpc_message = &msg, |
282 | .callback_ops = &nfs_read_direct_ops, | 282 | .callback_ops = &nfs_read_direct_ops, |
283 | .workqueue = nfsiod_workqueue, | ||
283 | .flags = RPC_TASK_ASYNC, | 284 | .flags = RPC_TASK_ASYNC, |
284 | }; | 285 | }; |
285 | unsigned int pgbase; | 286 | unsigned int pgbase; |
@@ -446,6 +447,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) | |||
446 | struct rpc_task_setup task_setup_data = { | 447 | struct rpc_task_setup task_setup_data = { |
447 | .rpc_client = NFS_CLIENT(inode), | 448 | .rpc_client = NFS_CLIENT(inode), |
448 | .callback_ops = &nfs_write_direct_ops, | 449 | .callback_ops = &nfs_write_direct_ops, |
450 | .workqueue = nfsiod_workqueue, | ||
449 | .flags = RPC_TASK_ASYNC, | 451 | .flags = RPC_TASK_ASYNC, |
450 | }; | 452 | }; |
451 | 453 | ||
@@ -537,6 +539,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq) | |||
537 | .rpc_message = &msg, | 539 | .rpc_message = &msg, |
538 | .callback_ops = &nfs_commit_direct_ops, | 540 | .callback_ops = &nfs_commit_direct_ops, |
539 | .callback_data = data, | 541 | .callback_data = data, |
542 | .workqueue = nfsiod_workqueue, | ||
540 | .flags = RPC_TASK_ASYNC, | 543 | .flags = RPC_TASK_ASYNC, |
541 | }; | 544 | }; |
542 | 545 | ||
@@ -683,6 +686,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, | |||
683 | .rpc_client = NFS_CLIENT(inode), | 686 | .rpc_client = NFS_CLIENT(inode), |
684 | .rpc_message = &msg, | 687 | .rpc_message = &msg, |
685 | .callback_ops = &nfs_write_direct_ops, | 688 | .callback_ops = &nfs_write_direct_ops, |
689 | .workqueue = nfsiod_workqueue, | ||
686 | .flags = RPC_TASK_ASYNC, | 690 | .flags = RPC_TASK_ASYNC, |
687 | }; | 691 | }; |
688 | size_t wsize = NFS_SERVER(inode)->wsize; | 692 | size_t wsize = NFS_SERVER(inode)->wsize; |