diff options
author | Stanislav Kinsbursky <skinsbursky@parallels.com> | 2012-01-10 08:04:24 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-01-31 18:20:27 -0500 |
commit | 9e2e74dba6ddce94da187369b50a27536147d5df (patch) | |
tree | b4c2e7570775f0d9b0477fdf26e5f99c91e61ac4 /fs/nfs/blocklayout/blocklayout.c | |
parent | 332dfab6f4e02d3c5897e9470492bee7d14f29cc (diff) |
NFS: blocklayout pipe creation per network namespace context introduced
This patch implements blocklayout pipe creation and registration per each
existent network namespace.
This was achived by registering NFS per-net operations, responsible for
blocklayout pipe allocation/register and unregister/destruction instead of
initialization and destruction of static "bl_device_pipe" pipe (this one was
removed).
Note, than pointer to network blocklayout pipe is stored in per-net "nfs_net"
structure, because allocating of one more per-net structure for blocklayout
module looks redundant.
This patch also changes dev_remove() function prototype (and all it's callers,
where it' requied) by adding network namespace pointer parameter, which is used
to discover proper blocklayout pipe for rpc_queue_upcall() call.
Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/blocklayout/blocklayout.c')
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.c | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 80b0c4a40485..9da72b8a5542 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c | |||
@@ -46,7 +46,6 @@ MODULE_LICENSE("GPL"); | |||
46 | MODULE_AUTHOR("Andy Adamson <andros@citi.umich.edu>"); | 46 | MODULE_AUTHOR("Andy Adamson <andros@citi.umich.edu>"); |
47 | MODULE_DESCRIPTION("The NFSv4.1 pNFS Block layout driver"); | 47 | MODULE_DESCRIPTION("The NFSv4.1 pNFS Block layout driver"); |
48 | 48 | ||
49 | struct rpc_pipe *bl_device_pipe; | ||
50 | wait_queue_head_t bl_wq; | 49 | wait_queue_head_t bl_wq; |
51 | 50 | ||
52 | static void print_page(struct page *page) | 51 | static void print_page(struct page *page) |
@@ -1071,6 +1070,37 @@ static void nfs4blocklayout_unregister_net(struct net *net, | |||
1071 | } | 1070 | } |
1072 | } | 1071 | } |
1073 | 1072 | ||
1073 | static int nfs4blocklayout_net_init(struct net *net) | ||
1074 | { | ||
1075 | struct nfs_net *nn = net_generic(net, nfs_net_id); | ||
1076 | struct dentry *dentry; | ||
1077 | |||
1078 | nn->bl_device_pipe = rpc_mkpipe_data(&bl_upcall_ops, 0); | ||
1079 | if (IS_ERR(nn->bl_device_pipe)) | ||
1080 | return PTR_ERR(nn->bl_device_pipe); | ||
1081 | dentry = nfs4blocklayout_register_net(net, nn->bl_device_pipe); | ||
1082 | if (IS_ERR(dentry)) { | ||
1083 | rpc_destroy_pipe_data(nn->bl_device_pipe); | ||
1084 | return PTR_ERR(dentry); | ||
1085 | } | ||
1086 | nn->bl_device_pipe->dentry = dentry; | ||
1087 | return 0; | ||
1088 | } | ||
1089 | |||
1090 | static void nfs4blocklayout_net_exit(struct net *net) | ||
1091 | { | ||
1092 | struct nfs_net *nn = net_generic(net, nfs_net_id); | ||
1093 | |||
1094 | nfs4blocklayout_unregister_net(net, nn->bl_device_pipe); | ||
1095 | rpc_destroy_pipe_data(nn->bl_device_pipe); | ||
1096 | nn->bl_device_pipe = NULL; | ||
1097 | } | ||
1098 | |||
1099 | static struct pernet_operations nfs4blocklayout_net_ops = { | ||
1100 | .init = nfs4blocklayout_net_init, | ||
1101 | .exit = nfs4blocklayout_net_exit, | ||
1102 | }; | ||
1103 | |||
1074 | static int __init nfs4blocklayout_init(void) | 1104 | static int __init nfs4blocklayout_init(void) |
1075 | { | 1105 | { |
1076 | struct vfsmount *mnt; | 1106 | struct vfsmount *mnt; |
@@ -1089,24 +1119,12 @@ static int __init nfs4blocklayout_init(void) | |||
1089 | ret = PTR_ERR(mnt); | 1119 | ret = PTR_ERR(mnt); |
1090 | goto out_remove; | 1120 | goto out_remove; |
1091 | } | 1121 | } |
1092 | bl_device_pipe = rpc_mkpipe_data(&bl_upcall_ops, 0); | 1122 | ret = register_pernet_subsys(&nfs4blocklayout_net_ops); |
1093 | if (IS_ERR(bl_device_pipe)) { | 1123 | if (ret) |
1094 | ret = PTR_ERR(bl_device_pipe); | 1124 | goto out_remove; |
1095 | goto out_putrpc; | ||
1096 | } | ||
1097 | bl_device_pipe->dentry = nfs4blocklayout_register_net(&init_net, | ||
1098 | bl_device_pipe); | ||
1099 | if (IS_ERR(bl_device_pipe->dentry)) { | ||
1100 | ret = PTR_ERR(bl_device_pipe->dentry); | ||
1101 | goto out_destroy_pipe; | ||
1102 | } | ||
1103 | out: | 1125 | out: |
1104 | return ret; | 1126 | return ret; |
1105 | 1127 | ||
1106 | out_destroy_pipe: | ||
1107 | rpc_destroy_pipe_data(bl_device_pipe); | ||
1108 | out_putrpc: | ||
1109 | rpc_put_mount(); | ||
1110 | out_remove: | 1128 | out_remove: |
1111 | pnfs_unregister_layoutdriver(&blocklayout_type); | 1129 | pnfs_unregister_layoutdriver(&blocklayout_type); |
1112 | return ret; | 1130 | return ret; |
@@ -1117,10 +1135,8 @@ static void __exit nfs4blocklayout_exit(void) | |||
1117 | dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n", | 1135 | dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n", |
1118 | __func__); | 1136 | __func__); |
1119 | 1137 | ||
1138 | unregister_pernet_subsys(&nfs4blocklayout_net_ops); | ||
1120 | pnfs_unregister_layoutdriver(&blocklayout_type); | 1139 | pnfs_unregister_layoutdriver(&blocklayout_type); |
1121 | nfs4blocklayout_unregister_net(&init_net, bl_device_pipe); | ||
1122 | rpc_destroy_pipe_data(bl_device_pipe); | ||
1123 | rpc_put_mount(); | ||
1124 | } | 1140 | } |
1125 | 1141 | ||
1126 | MODULE_ALIAS("nfs-layouttype4-3"); | 1142 | MODULE_ALIAS("nfs-layouttype4-3"); |