aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/blocklayout/blocklayout.c
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-01-10 08:04:24 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-01-31 18:20:27 -0500
commit9e2e74dba6ddce94da187369b50a27536147d5df (patch)
treeb4c2e7570775f0d9b0477fdf26e5f99c91e61ac4 /fs/nfs/blocklayout/blocklayout.c
parent332dfab6f4e02d3c5897e9470492bee7d14f29cc (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.c54
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");
46MODULE_AUTHOR("Andy Adamson <andros@citi.umich.edu>"); 46MODULE_AUTHOR("Andy Adamson <andros@citi.umich.edu>");
47MODULE_DESCRIPTION("The NFSv4.1 pNFS Block layout driver"); 47MODULE_DESCRIPTION("The NFSv4.1 pNFS Block layout driver");
48 48
49struct rpc_pipe *bl_device_pipe;
50wait_queue_head_t bl_wq; 49wait_queue_head_t bl_wq;
51 50
52static void print_page(struct page *page) 51static void print_page(struct page *page)
@@ -1071,6 +1070,37 @@ static void nfs4blocklayout_unregister_net(struct net *net,
1071 } 1070 }
1072} 1071}
1073 1072
1073static 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
1090static 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
1099static struct pernet_operations nfs4blocklayout_net_ops = {
1100 .init = nfs4blocklayout_net_init,
1101 .exit = nfs4blocklayout_net_exit,
1102};
1103
1074static int __init nfs4blocklayout_init(void) 1104static 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 }
1103out: 1125out:
1104 return ret; 1126 return ret;
1105 1127
1106out_destroy_pipe:
1107 rpc_destroy_pipe_data(bl_device_pipe);
1108out_putrpc:
1109 rpc_put_mount();
1110out_remove: 1128out_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
1126MODULE_ALIAS("nfs-layouttype4-3"); 1142MODULE_ALIAS("nfs-layouttype4-3");