aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/blocklayout
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
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')
-rw-r--r--fs/nfs/blocklayout/blocklayout.c54
-rw-r--r--fs/nfs/blocklayout/blocklayout.h3
-rw-r--r--fs/nfs/blocklayout/blocklayoutdev.c5
-rw-r--r--fs/nfs/blocklayout/blocklayoutdm.c7
4 files changed, 45 insertions, 24 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");
diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h
index 49c670b18a9e..0966b39bbcfb 100644
--- a/fs/nfs/blocklayout/blocklayout.h
+++ b/fs/nfs/blocklayout/blocklayout.h
@@ -37,6 +37,7 @@
37#include <linux/sunrpc/rpc_pipe_fs.h> 37#include <linux/sunrpc/rpc_pipe_fs.h>
38 38
39#include "../pnfs.h" 39#include "../pnfs.h"
40#include "../netns.h"
40 41
41#define PAGE_CACHE_SECTORS (PAGE_CACHE_SIZE >> SECTOR_SHIFT) 42#define PAGE_CACHE_SECTORS (PAGE_CACHE_SIZE >> SECTOR_SHIFT)
42#define PAGE_CACHE_SECTOR_SHIFT (PAGE_CACHE_SHIFT - SECTOR_SHIFT) 43#define PAGE_CACHE_SECTOR_SHIFT (PAGE_CACHE_SHIFT - SECTOR_SHIFT)
@@ -50,6 +51,7 @@ struct pnfs_block_dev {
50 struct list_head bm_node; 51 struct list_head bm_node;
51 struct nfs4_deviceid bm_mdevid; /* associated devid */ 52 struct nfs4_deviceid bm_mdevid; /* associated devid */
52 struct block_device *bm_mdev; /* meta device itself */ 53 struct block_device *bm_mdev; /* meta device itself */
54 struct net *net;
53}; 55};
54 56
55enum exstate4 { 57enum exstate4 {
@@ -161,7 +163,6 @@ struct bl_msg_hdr {
161 u16 totallen; /* length of entire message, including hdr itself */ 163 u16 totallen; /* length of entire message, including hdr itself */
162}; 164};
163 165
164extern struct rpc_pipe *bl_device_pipe;
165extern wait_queue_head_t bl_wq; 166extern wait_queue_head_t bl_wq;
166 167
167#define BL_DEVICE_UMOUNT 0x0 /* Umount--delete devices */ 168#define BL_DEVICE_UMOUNT 0x0 /* Umount--delete devices */
diff --git a/fs/nfs/blocklayout/blocklayoutdev.c b/fs/nfs/blocklayout/blocklayoutdev.c
index 949b62478799..94ed978860c0 100644
--- a/fs/nfs/blocklayout/blocklayoutdev.c
+++ b/fs/nfs/blocklayout/blocklayoutdev.c
@@ -120,6 +120,8 @@ nfs4_blk_decode_device(struct nfs_server *server,
120 DECLARE_WAITQUEUE(wq, current); 120 DECLARE_WAITQUEUE(wq, current);
121 struct bl_dev_msg *reply = &bl_mount_reply; 121 struct bl_dev_msg *reply = &bl_mount_reply;
122 int offset, len, i, rc; 122 int offset, len, i, rc;
123 struct net *net = server->nfs_client->net;
124 struct nfs_net *nn = net_generic(net, nfs_net_id);
123 125
124 dprintk("%s CREATING PIPEFS MESSAGE\n", __func__); 126 dprintk("%s CREATING PIPEFS MESSAGE\n", __func__);
125 dprintk("%s: deviceid: %s, mincount: %d\n", __func__, dev->dev_id.data, 127 dprintk("%s: deviceid: %s, mincount: %d\n", __func__, dev->dev_id.data,
@@ -146,7 +148,7 @@ nfs4_blk_decode_device(struct nfs_server *server,
146 148
147 dprintk("%s CALLING USERSPACE DAEMON\n", __func__); 149 dprintk("%s CALLING USERSPACE DAEMON\n", __func__);
148 add_wait_queue(&bl_wq, &wq); 150 add_wait_queue(&bl_wq, &wq);
149 rc = rpc_queue_upcall(bl_device_pipe, &msg); 151 rc = rpc_queue_upcall(nn->bl_device_pipe, &msg);
150 if (rc < 0) { 152 if (rc < 0) {
151 remove_wait_queue(&bl_wq, &wq); 153 remove_wait_queue(&bl_wq, &wq);
152 rv = ERR_PTR(rc); 154 rv = ERR_PTR(rc);
@@ -181,6 +183,7 @@ nfs4_blk_decode_device(struct nfs_server *server,
181 183
182 rv->bm_mdev = bd; 184 rv->bm_mdev = bd;
183 memcpy(&rv->bm_mdevid, &dev->dev_id, sizeof(struct nfs4_deviceid)); 185 memcpy(&rv->bm_mdevid, &dev->dev_id, sizeof(struct nfs4_deviceid));
186 rv->net = net;
184 dprintk("%s Created device %s with bd_block_size %u\n", 187 dprintk("%s Created device %s with bd_block_size %u\n",
185 __func__, 188 __func__,
186 bd->bd_disk->disk_name, 189 bd->bd_disk->disk_name,
diff --git a/fs/nfs/blocklayout/blocklayoutdm.c b/fs/nfs/blocklayout/blocklayoutdm.c
index 631f254d12ab..970490f556de 100644
--- a/fs/nfs/blocklayout/blocklayoutdm.c
+++ b/fs/nfs/blocklayout/blocklayoutdm.c
@@ -38,7 +38,7 @@
38 38
39#define NFSDBG_FACILITY NFSDBG_PNFS_LD 39#define NFSDBG_FACILITY NFSDBG_PNFS_LD
40 40
41static void dev_remove(dev_t dev) 41static void dev_remove(struct net *net, dev_t dev)
42{ 42{
43 struct rpc_pipe_msg msg; 43 struct rpc_pipe_msg msg;
44 struct bl_dev_msg bl_umount_request; 44 struct bl_dev_msg bl_umount_request;
@@ -48,6 +48,7 @@ static void dev_remove(dev_t dev)
48 }; 48 };
49 uint8_t *dataptr; 49 uint8_t *dataptr;
50 DECLARE_WAITQUEUE(wq, current); 50 DECLARE_WAITQUEUE(wq, current);
51 struct nfs_net *nn = net_generic(net, nfs_net_id);
51 52
52 dprintk("Entering %s\n", __func__); 53 dprintk("Entering %s\n", __func__);
53 54
@@ -66,7 +67,7 @@ static void dev_remove(dev_t dev)
66 msg.len = sizeof(bl_msg) + bl_msg.totallen; 67 msg.len = sizeof(bl_msg) + bl_msg.totallen;
67 68
68 add_wait_queue(&bl_wq, &wq); 69 add_wait_queue(&bl_wq, &wq);
69 if (rpc_queue_upcall(bl_device_pipe, &msg) < 0) { 70 if (rpc_queue_upcall(nn->bl_device_pipe, &msg) < 0) {
70 remove_wait_queue(&bl_wq, &wq); 71 remove_wait_queue(&bl_wq, &wq);
71 goto out; 72 goto out;
72 } 73 }
@@ -93,7 +94,7 @@ static void nfs4_blk_metadev_release(struct pnfs_block_dev *bdev)
93 printk(KERN_ERR "%s nfs4_blkdev_put returns %d\n", 94 printk(KERN_ERR "%s nfs4_blkdev_put returns %d\n",
94 __func__, rv); 95 __func__, rv);
95 96
96 dev_remove(bdev->bm_mdev->bd_dev); 97 dev_remove(bdev->net, bdev->bm_mdev->bd_dev);
97} 98}
98 99
99void bl_free_block_dev(struct pnfs_block_dev *bdev) 100void bl_free_block_dev(struct pnfs_block_dev *bdev)