aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/blocklayout
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-01-10 08:04:32 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-01-31 18:20:27 -0500
commit627f30668fac12f5bd555a2cc22af2323762fe8d (patch)
treeaa7b87018cff8bbfd4d7dfb47fc8d1f4e264ee61 /fs/nfs/blocklayout
parent9e2e74dba6ddce94da187369b50a27536147d5df (diff)
NFS: blocklayout PipeFS notifier introduced
This patch subscribes blocklayout pipes to RPC pipefs notifications. Notifier is registering on blocklayout module load. This notifier callback is responsible for creation/destruction of PipeFS blocklayout pipe dentry. Note that no locking required in notifier callback because PipeFS superblock pointer is passed as an argument from it's creation or destruction routine and thus we can be sure about it's validity. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/blocklayout')
-rw-r--r--fs/nfs/blocklayout/blocklayout.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 9da72b8a5542..df05b9465146 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -1044,6 +1044,48 @@ static void nfs4blocklayout_unregister_sb(struct super_block *sb,
1044 rpc_unlink(pipe->dentry); 1044 rpc_unlink(pipe->dentry);
1045} 1045}
1046 1046
1047static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event,
1048 void *ptr)
1049{
1050 struct super_block *sb = ptr;
1051 struct net *net = sb->s_fs_info;
1052 struct nfs_net *nn = net_generic(net, nfs_net_id);
1053 struct dentry *dentry;
1054 int ret = 0;
1055
1056 if (!try_module_get(THIS_MODULE))
1057 return 0;
1058
1059 if (nn->bl_device_pipe == NULL) {
1060 module_put(THIS_MODULE);
1061 return 0;
1062 }
1063
1064 switch (event) {
1065 case RPC_PIPEFS_MOUNT:
1066 dentry = nfs4blocklayout_register_sb(sb, nn->bl_device_pipe);
1067 if (IS_ERR(dentry)) {
1068 ret = PTR_ERR(dentry);
1069 break;
1070 }
1071 nn->bl_device_pipe->dentry = dentry;
1072 break;
1073 case RPC_PIPEFS_UMOUNT:
1074 if (nn->bl_device_pipe->dentry)
1075 nfs4blocklayout_unregister_sb(sb, nn->bl_device_pipe);
1076 break;
1077 default:
1078 ret = -ENOTSUPP;
1079 break;
1080 }
1081 module_put(THIS_MODULE);
1082 return ret;
1083}
1084
1085static struct notifier_block nfs4blocklayout_block = {
1086 .notifier_call = rpc_pipefs_event,
1087};
1088
1047static struct dentry *nfs4blocklayout_register_net(struct net *net, 1089static struct dentry *nfs4blocklayout_register_net(struct net *net,
1048 struct rpc_pipe *pipe) 1090 struct rpc_pipe *pipe)
1049{ 1091{
@@ -1119,12 +1161,17 @@ static int __init nfs4blocklayout_init(void)
1119 ret = PTR_ERR(mnt); 1161 ret = PTR_ERR(mnt);
1120 goto out_remove; 1162 goto out_remove;
1121 } 1163 }
1122 ret = register_pernet_subsys(&nfs4blocklayout_net_ops); 1164 ret = rpc_pipefs_notifier_register(&nfs4blocklayout_block);
1123 if (ret) 1165 if (ret)
1124 goto out_remove; 1166 goto out_remove;
1167 ret = register_pernet_subsys(&nfs4blocklayout_net_ops);
1168 if (ret)
1169 goto out_notifier;
1125out: 1170out:
1126 return ret; 1171 return ret;
1127 1172
1173out_notifier:
1174 rpc_pipefs_notifier_unregister(&nfs4blocklayout_block);
1128out_remove: 1175out_remove:
1129 pnfs_unregister_layoutdriver(&blocklayout_type); 1176 pnfs_unregister_layoutdriver(&blocklayout_type);
1130 return ret; 1177 return ret;
@@ -1135,6 +1182,7 @@ static void __exit nfs4blocklayout_exit(void)
1135 dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n", 1182 dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n",
1136 __func__); 1183 __func__);
1137 1184
1185 rpc_pipefs_notifier_unregister(&nfs4blocklayout_block);
1138 unregister_pernet_subsys(&nfs4blocklayout_net_ops); 1186 unregister_pernet_subsys(&nfs4blocklayout_net_ops);
1139 pnfs_unregister_layoutdriver(&blocklayout_type); 1187 pnfs_unregister_layoutdriver(&blocklayout_type);
1140} 1188}