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 | |
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')
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.c | 54 | ||||
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.h | 3 | ||||
-rw-r--r-- | fs/nfs/blocklayout/blocklayoutdev.c | 5 | ||||
-rw-r--r-- | fs/nfs/blocklayout/blocklayoutdm.c | 7 |
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"); | |||
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"); |
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 | ||
55 | enum exstate4 { | 57 | enum 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 | ||
164 | extern struct rpc_pipe *bl_device_pipe; | ||
165 | extern wait_queue_head_t bl_wq; | 166 | extern 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 | ||
41 | static void dev_remove(dev_t dev) | 41 | static 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 | ||
99 | void bl_free_block_dev(struct pnfs_block_dev *bdev) | 100 | void bl_free_block_dev(struct pnfs_block_dev *bdev) |