diff options
author | David Teigland <teigland@redhat.com> | 2008-03-14 16:09:15 -0400 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2008-04-21 12:22:28 -0400 |
commit | 2402211a8389282fd2942fad4511f02c0eeeffc5 (patch) | |
tree | 853e5818a29816e642689d7e793a845d2519711b | |
parent | d44e0fc704143624b3e88fbf8fbcfda7a83fd299 (diff) |
dlm: move plock code from gfs2
Move the code that handles cluster posix locks from gfs2 into the dlm
so that it can be used by both gfs2 and ocfs2.
Signed-off-by: David Teigland <teigland@redhat.com>
-rw-r--r-- | fs/dlm/Makefile | 1 | ||||
-rw-r--r-- | fs/dlm/dlm_internal.h | 2 | ||||
-rw-r--r-- | fs/dlm/main.c | 7 | ||||
-rw-r--r-- | fs/dlm/plock.c (renamed from fs/gfs2/locking/dlm/plock.c) | 169 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/Makefile | 2 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/lock_dlm.h | 12 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/main.c | 8 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/mount.c | 21 | ||||
-rw-r--r-- | include/linux/Kbuild | 2 | ||||
-rw-r--r-- | include/linux/dlm_plock.h | 50 | ||||
-rw-r--r-- | include/linux/lock_dlm_plock.h | 41 |
11 files changed, 185 insertions, 130 deletions
diff --git a/fs/dlm/Makefile b/fs/dlm/Makefile index d248e60951ba..ca1c9124c8ce 100644 --- a/fs/dlm/Makefile +++ b/fs/dlm/Makefile | |||
@@ -10,6 +10,7 @@ dlm-y := ast.o \ | |||
10 | midcomms.o \ | 10 | midcomms.o \ |
11 | netlink.o \ | 11 | netlink.o \ |
12 | lowcomms.o \ | 12 | lowcomms.o \ |
13 | plock.o \ | ||
13 | rcom.o \ | 14 | rcom.o \ |
14 | recover.o \ | 15 | recover.o \ |
15 | recoverd.o \ | 16 | recoverd.o \ |
diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h index c70c8e58358f..caa1581e158f 100644 --- a/fs/dlm/dlm_internal.h +++ b/fs/dlm/dlm_internal.h | |||
@@ -582,6 +582,8 @@ static inline int dlm_no_directory(struct dlm_ls *ls) | |||
582 | int dlm_netlink_init(void); | 582 | int dlm_netlink_init(void); |
583 | void dlm_netlink_exit(void); | 583 | void dlm_netlink_exit(void); |
584 | void dlm_timeout_warn(struct dlm_lkb *lkb); | 584 | void dlm_timeout_warn(struct dlm_lkb *lkb); |
585 | int dlm_plock_init(void); | ||
586 | void dlm_plock_exit(void); | ||
585 | 587 | ||
586 | #ifdef CONFIG_DLM_DEBUG | 588 | #ifdef CONFIG_DLM_DEBUG |
587 | int dlm_register_debugfs(void); | 589 | int dlm_register_debugfs(void); |
diff --git a/fs/dlm/main.c b/fs/dlm/main.c index 58487fb95a4c..b80e0aa3cfa5 100644 --- a/fs/dlm/main.c +++ b/fs/dlm/main.c | |||
@@ -46,10 +46,16 @@ static int __init init_dlm(void) | |||
46 | if (error) | 46 | if (error) |
47 | goto out_user; | 47 | goto out_user; |
48 | 48 | ||
49 | error = dlm_plock_init(); | ||
50 | if (error) | ||
51 | goto out_netlink; | ||
52 | |||
49 | printk("DLM (built %s %s) installed\n", __DATE__, __TIME__); | 53 | printk("DLM (built %s %s) installed\n", __DATE__, __TIME__); |
50 | 54 | ||
51 | return 0; | 55 | return 0; |
52 | 56 | ||
57 | out_netlink: | ||
58 | dlm_netlink_exit(); | ||
53 | out_user: | 59 | out_user: |
54 | dlm_user_exit(); | 60 | dlm_user_exit(); |
55 | out_debug: | 61 | out_debug: |
@@ -66,6 +72,7 @@ static int __init init_dlm(void) | |||
66 | 72 | ||
67 | static void __exit exit_dlm(void) | 73 | static void __exit exit_dlm(void) |
68 | { | 74 | { |
75 | dlm_plock_exit(); | ||
69 | dlm_netlink_exit(); | 76 | dlm_netlink_exit(); |
70 | dlm_user_exit(); | 77 | dlm_user_exit(); |
71 | dlm_config_exit(); | 78 | dlm_config_exit(); |
diff --git a/fs/gfs2/locking/dlm/plock.c b/fs/dlm/plock.c index 2ebd374b3143..d6d6e370f89c 100644 --- a/fs/gfs2/locking/dlm/plock.c +++ b/fs/dlm/plock.c | |||
@@ -1,17 +1,19 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2005 Red Hat, Inc. All rights reserved. | 2 | * Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. |
3 | * | 3 | * |
4 | * This copyrighted material is made available to anyone wishing to use, | 4 | * This copyrighted material is made available to anyone wishing to use, |
5 | * modify, copy, or redistribute it subject to the terms and conditions | 5 | * modify, copy, or redistribute it subject to the terms and conditions |
6 | * of the GNU General Public License version 2. | 6 | * of the GNU General Public License version 2. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/fs.h> | ||
9 | #include <linux/miscdevice.h> | 10 | #include <linux/miscdevice.h> |
10 | #include <linux/lock_dlm_plock.h> | ||
11 | #include <linux/poll.h> | 11 | #include <linux/poll.h> |
12 | #include <linux/dlm.h> | ||
13 | #include <linux/dlm_plock.h> | ||
12 | 14 | ||
13 | #include "lock_dlm.h" | 15 | #include "dlm_internal.h" |
14 | 16 | #include "lockspace.h" | |
15 | 17 | ||
16 | static spinlock_t ops_lock; | 18 | static spinlock_t ops_lock; |
17 | static struct list_head send_list; | 19 | static struct list_head send_list; |
@@ -22,7 +24,7 @@ static wait_queue_head_t recv_wq; | |||
22 | struct plock_op { | 24 | struct plock_op { |
23 | struct list_head list; | 25 | struct list_head list; |
24 | int done; | 26 | int done; |
25 | struct gdlm_plock_info info; | 27 | struct dlm_plock_info info; |
26 | }; | 28 | }; |
27 | 29 | ||
28 | struct plock_xop { | 30 | struct plock_xop { |
@@ -34,22 +36,22 @@ struct plock_xop { | |||
34 | }; | 36 | }; |
35 | 37 | ||
36 | 38 | ||
37 | static inline void set_version(struct gdlm_plock_info *info) | 39 | static inline void set_version(struct dlm_plock_info *info) |
38 | { | 40 | { |
39 | info->version[0] = GDLM_PLOCK_VERSION_MAJOR; | 41 | info->version[0] = DLM_PLOCK_VERSION_MAJOR; |
40 | info->version[1] = GDLM_PLOCK_VERSION_MINOR; | 42 | info->version[1] = DLM_PLOCK_VERSION_MINOR; |
41 | info->version[2] = GDLM_PLOCK_VERSION_PATCH; | 43 | info->version[2] = DLM_PLOCK_VERSION_PATCH; |
42 | } | 44 | } |
43 | 45 | ||
44 | static int check_version(struct gdlm_plock_info *info) | 46 | static int check_version(struct dlm_plock_info *info) |
45 | { | 47 | { |
46 | if ((GDLM_PLOCK_VERSION_MAJOR != info->version[0]) || | 48 | if ((DLM_PLOCK_VERSION_MAJOR != info->version[0]) || |
47 | (GDLM_PLOCK_VERSION_MINOR < info->version[1])) { | 49 | (DLM_PLOCK_VERSION_MINOR < info->version[1])) { |
48 | log_error("plock device version mismatch: " | 50 | log_print("plock device version mismatch: " |
49 | "kernel (%u.%u.%u), user (%u.%u.%u)", | 51 | "kernel (%u.%u.%u), user (%u.%u.%u)", |
50 | GDLM_PLOCK_VERSION_MAJOR, | 52 | DLM_PLOCK_VERSION_MAJOR, |
51 | GDLM_PLOCK_VERSION_MINOR, | 53 | DLM_PLOCK_VERSION_MINOR, |
52 | GDLM_PLOCK_VERSION_PATCH, | 54 | DLM_PLOCK_VERSION_PATCH, |
53 | info->version[0], | 55 | info->version[0], |
54 | info->version[1], | 56 | info->version[1], |
55 | info->version[2]); | 57 | info->version[2]); |
@@ -68,25 +70,31 @@ static void send_op(struct plock_op *op) | |||
68 | wake_up(&send_wq); | 70 | wake_up(&send_wq); |
69 | } | 71 | } |
70 | 72 | ||
71 | int gdlm_plock(void *lockspace, struct lm_lockname *name, | 73 | int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file, |
72 | struct file *file, int cmd, struct file_lock *fl) | 74 | int cmd, struct file_lock *fl) |
73 | { | 75 | { |
74 | struct gdlm_ls *ls = lockspace; | 76 | struct dlm_ls *ls; |
75 | struct plock_op *op; | 77 | struct plock_op *op; |
76 | struct plock_xop *xop; | 78 | struct plock_xop *xop; |
77 | int rv; | 79 | int rv; |
78 | 80 | ||
81 | ls = dlm_find_lockspace_local(lockspace); | ||
82 | if (!ls) | ||
83 | return -EINVAL; | ||
84 | |||
79 | xop = kzalloc(sizeof(*xop), GFP_KERNEL); | 85 | xop = kzalloc(sizeof(*xop), GFP_KERNEL); |
80 | if (!xop) | 86 | if (!xop) { |
81 | return -ENOMEM; | 87 | rv = -ENOMEM; |
88 | goto out; | ||
89 | } | ||
82 | 90 | ||
83 | op = &xop->xop; | 91 | op = &xop->xop; |
84 | op->info.optype = GDLM_PLOCK_OP_LOCK; | 92 | op->info.optype = DLM_PLOCK_OP_LOCK; |
85 | op->info.pid = fl->fl_pid; | 93 | op->info.pid = fl->fl_pid; |
86 | op->info.ex = (fl->fl_type == F_WRLCK); | 94 | op->info.ex = (fl->fl_type == F_WRLCK); |
87 | op->info.wait = IS_SETLKW(cmd); | 95 | op->info.wait = IS_SETLKW(cmd); |
88 | op->info.fsid = ls->id; | 96 | op->info.fsid = ls->ls_global_id; |
89 | op->info.number = name->ln_number; | 97 | op->info.number = number; |
90 | op->info.start = fl->fl_start; | 98 | op->info.start = fl->fl_start; |
91 | op->info.end = fl->fl_end; | 99 | op->info.end = fl->fl_end; |
92 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) { | 100 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) { |
@@ -107,12 +115,15 @@ int gdlm_plock(void *lockspace, struct lm_lockname *name, | |||
107 | 115 | ||
108 | if (xop->callback == NULL) | 116 | if (xop->callback == NULL) |
109 | wait_event(recv_wq, (op->done != 0)); | 117 | wait_event(recv_wq, (op->done != 0)); |
110 | else | 118 | else { |
111 | return -EINPROGRESS; | 119 | rv = -EINPROGRESS; |
120 | goto out; | ||
121 | } | ||
112 | 122 | ||
113 | spin_lock(&ops_lock); | 123 | spin_lock(&ops_lock); |
114 | if (!list_empty(&op->list)) { | 124 | if (!list_empty(&op->list)) { |
115 | printk(KERN_INFO "plock op on list\n"); | 125 | log_error(ls, "dlm_posix_lock: op on list %llx", |
126 | (unsigned long long)number); | ||
116 | list_del(&op->list); | 127 | list_del(&op->list); |
117 | } | 128 | } |
118 | spin_unlock(&ops_lock); | 129 | spin_unlock(&ops_lock); |
@@ -121,17 +132,19 @@ int gdlm_plock(void *lockspace, struct lm_lockname *name, | |||
121 | 132 | ||
122 | if (!rv) { | 133 | if (!rv) { |
123 | if (posix_lock_file_wait(file, fl) < 0) | 134 | if (posix_lock_file_wait(file, fl) < 0) |
124 | log_error("gdlm_plock: vfs lock error %x,%llx", | 135 | log_error(ls, "dlm_posix_lock: vfs lock error %llx", |
125 | name->ln_type, | 136 | (unsigned long long)number); |
126 | (unsigned long long)name->ln_number); | ||
127 | } | 137 | } |
128 | 138 | ||
129 | kfree(xop); | 139 | kfree(xop); |
140 | out: | ||
141 | dlm_put_lockspace(ls); | ||
130 | return rv; | 142 | return rv; |
131 | } | 143 | } |
144 | EXPORT_SYMBOL_GPL(dlm_posix_lock); | ||
132 | 145 | ||
133 | /* Returns failure iff a succesful lock operation should be canceled */ | 146 | /* Returns failure iff a succesful lock operation should be canceled */ |
134 | static int gdlm_plock_callback(struct plock_op *op) | 147 | static int dlm_plock_callback(struct plock_op *op) |
135 | { | 148 | { |
136 | struct file *file; | 149 | struct file *file; |
137 | struct file_lock *fl; | 150 | struct file_lock *fl; |
@@ -142,7 +155,8 @@ static int gdlm_plock_callback(struct plock_op *op) | |||
142 | 155 | ||
143 | spin_lock(&ops_lock); | 156 | spin_lock(&ops_lock); |
144 | if (!list_empty(&op->list)) { | 157 | if (!list_empty(&op->list)) { |
145 | printk(KERN_INFO "plock op on list\n"); | 158 | log_print("dlm_plock_callback: op on list %llx", |
159 | (unsigned long long)op->info.number); | ||
146 | list_del(&op->list); | 160 | list_del(&op->list); |
147 | } | 161 | } |
148 | spin_unlock(&ops_lock); | 162 | spin_unlock(&ops_lock); |
@@ -165,19 +179,19 @@ static int gdlm_plock_callback(struct plock_op *op) | |||
165 | * This can only happen in the case of kmalloc() failure. | 179 | * This can only happen in the case of kmalloc() failure. |
166 | * The filesystem's own lock is the authoritative lock, | 180 | * The filesystem's own lock is the authoritative lock, |
167 | * so a failure to get the lock locally is not a disaster. | 181 | * so a failure to get the lock locally is not a disaster. |
168 | * As long as GFS cannot reliably cancel locks (especially | 182 | * As long as the fs cannot reliably cancel locks (especially |
169 | * in a low-memory situation), we're better off ignoring | 183 | * in a low-memory situation), we're better off ignoring |
170 | * this failure than trying to recover. | 184 | * this failure than trying to recover. |
171 | */ | 185 | */ |
172 | log_error("gdlm_plock: vfs lock error file %p fl %p", | 186 | log_print("dlm_plock_callback: vfs lock error %llx file %p fl %p", |
173 | file, fl); | 187 | (unsigned long long)op->info.number, file, fl); |
174 | } | 188 | } |
175 | 189 | ||
176 | rv = notify(flc, NULL, 0); | 190 | rv = notify(flc, NULL, 0); |
177 | if (rv) { | 191 | if (rv) { |
178 | /* XXX: We need to cancel the fs lock here: */ | 192 | /* XXX: We need to cancel the fs lock here: */ |
179 | printk("gfs2 lock granted after lock request failed;" | 193 | log_print("dlm_plock_callback: lock granted after lock request " |
180 | " dangling lock!\n"); | 194 | "failed; dangling lock!\n"); |
181 | goto out; | 195 | goto out; |
182 | } | 196 | } |
183 | 197 | ||
@@ -186,25 +200,31 @@ out: | |||
186 | return rv; | 200 | return rv; |
187 | } | 201 | } |
188 | 202 | ||
189 | int gdlm_punlock(void *lockspace, struct lm_lockname *name, | 203 | int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file, |
190 | struct file *file, struct file_lock *fl) | 204 | struct file_lock *fl) |
191 | { | 205 | { |
192 | struct gdlm_ls *ls = lockspace; | 206 | struct dlm_ls *ls; |
193 | struct plock_op *op; | 207 | struct plock_op *op; |
194 | int rv; | 208 | int rv; |
195 | 209 | ||
210 | ls = dlm_find_lockspace_local(lockspace); | ||
211 | if (!ls) | ||
212 | return -EINVAL; | ||
213 | |||
196 | op = kzalloc(sizeof(*op), GFP_KERNEL); | 214 | op = kzalloc(sizeof(*op), GFP_KERNEL); |
197 | if (!op) | 215 | if (!op) { |
198 | return -ENOMEM; | 216 | rv = -ENOMEM; |
217 | goto out; | ||
218 | } | ||
199 | 219 | ||
200 | if (posix_lock_file_wait(file, fl) < 0) | 220 | if (posix_lock_file_wait(file, fl) < 0) |
201 | log_error("gdlm_punlock: vfs unlock error %x,%llx", | 221 | log_error(ls, "dlm_posix_unlock: vfs unlock error %llx", |
202 | name->ln_type, (unsigned long long)name->ln_number); | 222 | (unsigned long long)number); |
203 | 223 | ||
204 | op->info.optype = GDLM_PLOCK_OP_UNLOCK; | 224 | op->info.optype = DLM_PLOCK_OP_UNLOCK; |
205 | op->info.pid = fl->fl_pid; | 225 | op->info.pid = fl->fl_pid; |
206 | op->info.fsid = ls->id; | 226 | op->info.fsid = ls->ls_global_id; |
207 | op->info.number = name->ln_number; | 227 | op->info.number = number; |
208 | op->info.start = fl->fl_start; | 228 | op->info.start = fl->fl_start; |
209 | op->info.end = fl->fl_end; | 229 | op->info.end = fl->fl_end; |
210 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) | 230 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) |
@@ -217,7 +237,8 @@ int gdlm_punlock(void *lockspace, struct lm_lockname *name, | |||
217 | 237 | ||
218 | spin_lock(&ops_lock); | 238 | spin_lock(&ops_lock); |
219 | if (!list_empty(&op->list)) { | 239 | if (!list_empty(&op->list)) { |
220 | printk(KERN_INFO "punlock op on list\n"); | 240 | log_error(ls, "dlm_posix_unlock: op on list %llx", |
241 | (unsigned long long)number); | ||
221 | list_del(&op->list); | 242 | list_del(&op->list); |
222 | } | 243 | } |
223 | spin_unlock(&ops_lock); | 244 | spin_unlock(&ops_lock); |
@@ -228,25 +249,34 @@ int gdlm_punlock(void *lockspace, struct lm_lockname *name, | |||
228 | rv = 0; | 249 | rv = 0; |
229 | 250 | ||
230 | kfree(op); | 251 | kfree(op); |
252 | out: | ||
253 | dlm_put_lockspace(ls); | ||
231 | return rv; | 254 | return rv; |
232 | } | 255 | } |
256 | EXPORT_SYMBOL_GPL(dlm_posix_unlock); | ||
233 | 257 | ||
234 | int gdlm_plock_get(void *lockspace, struct lm_lockname *name, | 258 | int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file, |
235 | struct file *file, struct file_lock *fl) | 259 | struct file_lock *fl) |
236 | { | 260 | { |
237 | struct gdlm_ls *ls = lockspace; | 261 | struct dlm_ls *ls; |
238 | struct plock_op *op; | 262 | struct plock_op *op; |
239 | int rv; | 263 | int rv; |
240 | 264 | ||
265 | ls = dlm_find_lockspace_local(lockspace); | ||
266 | if (!ls) | ||
267 | return -EINVAL; | ||
268 | |||
241 | op = kzalloc(sizeof(*op), GFP_KERNEL); | 269 | op = kzalloc(sizeof(*op), GFP_KERNEL); |
242 | if (!op) | 270 | if (!op) { |
243 | return -ENOMEM; | 271 | rv = -ENOMEM; |
272 | goto out; | ||
273 | } | ||
244 | 274 | ||
245 | op->info.optype = GDLM_PLOCK_OP_GET; | 275 | op->info.optype = DLM_PLOCK_OP_GET; |
246 | op->info.pid = fl->fl_pid; | 276 | op->info.pid = fl->fl_pid; |
247 | op->info.ex = (fl->fl_type == F_WRLCK); | 277 | op->info.ex = (fl->fl_type == F_WRLCK); |
248 | op->info.fsid = ls->id; | 278 | op->info.fsid = ls->ls_global_id; |
249 | op->info.number = name->ln_number; | 279 | op->info.number = number; |
250 | op->info.start = fl->fl_start; | 280 | op->info.start = fl->fl_start; |
251 | op->info.end = fl->fl_end; | 281 | op->info.end = fl->fl_end; |
252 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) | 282 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) |
@@ -259,7 +289,8 @@ int gdlm_plock_get(void *lockspace, struct lm_lockname *name, | |||
259 | 289 | ||
260 | spin_lock(&ops_lock); | 290 | spin_lock(&ops_lock); |
261 | if (!list_empty(&op->list)) { | 291 | if (!list_empty(&op->list)) { |
262 | printk(KERN_INFO "plock_get op on list\n"); | 292 | log_error(ls, "dlm_posix_get: op on list %llx", |
293 | (unsigned long long)number); | ||
263 | list_del(&op->list); | 294 | list_del(&op->list); |
264 | } | 295 | } |
265 | spin_unlock(&ops_lock); | 296 | spin_unlock(&ops_lock); |
@@ -281,14 +312,17 @@ int gdlm_plock_get(void *lockspace, struct lm_lockname *name, | |||
281 | } | 312 | } |
282 | 313 | ||
283 | kfree(op); | 314 | kfree(op); |
315 | out: | ||
316 | dlm_put_lockspace(ls); | ||
284 | return rv; | 317 | return rv; |
285 | } | 318 | } |
319 | EXPORT_SYMBOL_GPL(dlm_posix_get); | ||
286 | 320 | ||
287 | /* a read copies out one plock request from the send list */ | 321 | /* a read copies out one plock request from the send list */ |
288 | static ssize_t dev_read(struct file *file, char __user *u, size_t count, | 322 | static ssize_t dev_read(struct file *file, char __user *u, size_t count, |
289 | loff_t *ppos) | 323 | loff_t *ppos) |
290 | { | 324 | { |
291 | struct gdlm_plock_info info; | 325 | struct dlm_plock_info info; |
292 | struct plock_op *op = NULL; | 326 | struct plock_op *op = NULL; |
293 | 327 | ||
294 | if (count < sizeof(info)) | 328 | if (count < sizeof(info)) |
@@ -315,7 +349,7 @@ static ssize_t dev_read(struct file *file, char __user *u, size_t count, | |||
315 | static ssize_t dev_write(struct file *file, const char __user *u, size_t count, | 349 | static ssize_t dev_write(struct file *file, const char __user *u, size_t count, |
316 | loff_t *ppos) | 350 | loff_t *ppos) |
317 | { | 351 | { |
318 | struct gdlm_plock_info info; | 352 | struct dlm_plock_info info; |
319 | struct plock_op *op; | 353 | struct plock_op *op; |
320 | int found = 0; | 354 | int found = 0; |
321 | 355 | ||
@@ -345,12 +379,12 @@ static ssize_t dev_write(struct file *file, const char __user *u, size_t count, | |||
345 | struct plock_xop *xop; | 379 | struct plock_xop *xop; |
346 | xop = (struct plock_xop *)op; | 380 | xop = (struct plock_xop *)op; |
347 | if (xop->callback) | 381 | if (xop->callback) |
348 | count = gdlm_plock_callback(op); | 382 | count = dlm_plock_callback(op); |
349 | else | 383 | else |
350 | wake_up(&recv_wq); | 384 | wake_up(&recv_wq); |
351 | } else | 385 | } else |
352 | printk(KERN_INFO "gdlm dev_write no op %x %llx\n", info.fsid, | 386 | log_print("dev_write no op %x %llx", info.fsid, |
353 | (unsigned long long)info.number); | 387 | (unsigned long long)info.number); |
354 | return count; | 388 | return count; |
355 | } | 389 | } |
356 | 390 | ||
@@ -377,11 +411,11 @@ static const struct file_operations dev_fops = { | |||
377 | 411 | ||
378 | static struct miscdevice plock_dev_misc = { | 412 | static struct miscdevice plock_dev_misc = { |
379 | .minor = MISC_DYNAMIC_MINOR, | 413 | .minor = MISC_DYNAMIC_MINOR, |
380 | .name = GDLM_PLOCK_MISC_NAME, | 414 | .name = DLM_PLOCK_MISC_NAME, |
381 | .fops = &dev_fops | 415 | .fops = &dev_fops |
382 | }; | 416 | }; |
383 | 417 | ||
384 | int gdlm_plock_init(void) | 418 | int dlm_plock_init(void) |
385 | { | 419 | { |
386 | int rv; | 420 | int rv; |
387 | 421 | ||
@@ -393,14 +427,13 @@ int gdlm_plock_init(void) | |||
393 | 427 | ||
394 | rv = misc_register(&plock_dev_misc); | 428 | rv = misc_register(&plock_dev_misc); |
395 | if (rv) | 429 | if (rv) |
396 | printk(KERN_INFO "gdlm_plock_init: misc_register failed %d", | 430 | log_print("dlm_plock_init: misc_register failed %d", rv); |
397 | rv); | ||
398 | return rv; | 431 | return rv; |
399 | } | 432 | } |
400 | 433 | ||
401 | void gdlm_plock_exit(void) | 434 | void dlm_plock_exit(void) |
402 | { | 435 | { |
403 | if (misc_deregister(&plock_dev_misc) < 0) | 436 | if (misc_deregister(&plock_dev_misc) < 0) |
404 | printk(KERN_INFO "gdlm_plock_exit: misc_deregister failed"); | 437 | log_print("dlm_plock_exit: misc_deregister failed"); |
405 | } | 438 | } |
406 | 439 | ||
diff --git a/fs/gfs2/locking/dlm/Makefile b/fs/gfs2/locking/dlm/Makefile index 89b93b6b45cf..2609bb6cd013 100644 --- a/fs/gfs2/locking/dlm/Makefile +++ b/fs/gfs2/locking/dlm/Makefile | |||
@@ -1,3 +1,3 @@ | |||
1 | obj-$(CONFIG_GFS2_FS_LOCKING_DLM) += lock_dlm.o | 1 | obj-$(CONFIG_GFS2_FS_LOCKING_DLM) += lock_dlm.o |
2 | lock_dlm-y := lock.o main.o mount.o sysfs.o thread.o plock.o | 2 | lock_dlm-y := lock.o main.o mount.o sysfs.o thread.o |
3 | 3 | ||
diff --git a/fs/gfs2/locking/dlm/lock_dlm.h b/fs/gfs2/locking/dlm/lock_dlm.h index 58fcf8c5bf39..a243cf69c54e 100644 --- a/fs/gfs2/locking/dlm/lock_dlm.h +++ b/fs/gfs2/locking/dlm/lock_dlm.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <net/sock.h> | 25 | #include <net/sock.h> |
26 | 26 | ||
27 | #include <linux/dlm.h> | 27 | #include <linux/dlm.h> |
28 | #include <linux/dlm_plock.h> | ||
28 | #include <linux/lm_interface.h> | 29 | #include <linux/lm_interface.h> |
29 | 30 | ||
30 | /* | 31 | /* |
@@ -173,17 +174,6 @@ void gdlm_cancel(void *); | |||
173 | int gdlm_hold_lvb(void *, char **); | 174 | int gdlm_hold_lvb(void *, char **); |
174 | void gdlm_unhold_lvb(void *, char *); | 175 | void gdlm_unhold_lvb(void *, char *); |
175 | 176 | ||
176 | /* plock.c */ | ||
177 | |||
178 | int gdlm_plock_init(void); | ||
179 | void gdlm_plock_exit(void); | ||
180 | int gdlm_plock(void *, struct lm_lockname *, struct file *, int, | ||
181 | struct file_lock *); | ||
182 | int gdlm_plock_get(void *, struct lm_lockname *, struct file *, | ||
183 | struct file_lock *); | ||
184 | int gdlm_punlock(void *, struct lm_lockname *, struct file *, | ||
185 | struct file_lock *); | ||
186 | |||
187 | /* mount.c */ | 177 | /* mount.c */ |
188 | 178 | ||
189 | extern const struct lm_lockops gdlm_ops; | 179 | extern const struct lm_lockops gdlm_ops; |
diff --git a/fs/gfs2/locking/dlm/main.c b/fs/gfs2/locking/dlm/main.c index 36a225850bd8..b9a03a7ff801 100644 --- a/fs/gfs2/locking/dlm/main.c +++ b/fs/gfs2/locking/dlm/main.c | |||
@@ -28,13 +28,6 @@ static int __init init_lock_dlm(void) | |||
28 | return error; | 28 | return error; |
29 | } | 29 | } |
30 | 30 | ||
31 | error = gdlm_plock_init(); | ||
32 | if (error) { | ||
33 | gdlm_sysfs_exit(); | ||
34 | gfs2_unregister_lockproto(&gdlm_ops); | ||
35 | return error; | ||
36 | } | ||
37 | |||
38 | printk(KERN_INFO | 31 | printk(KERN_INFO |
39 | "Lock_DLM (built %s %s) installed\n", __DATE__, __TIME__); | 32 | "Lock_DLM (built %s %s) installed\n", __DATE__, __TIME__); |
40 | return 0; | 33 | return 0; |
@@ -42,7 +35,6 @@ static int __init init_lock_dlm(void) | |||
42 | 35 | ||
43 | static void __exit exit_lock_dlm(void) | 36 | static void __exit exit_lock_dlm(void) |
44 | { | 37 | { |
45 | gdlm_plock_exit(); | ||
46 | gdlm_sysfs_exit(); | 38 | gdlm_sysfs_exit(); |
47 | gfs2_unregister_lockproto(&gdlm_ops); | 39 | gfs2_unregister_lockproto(&gdlm_ops); |
48 | } | 40 | } |
diff --git a/fs/gfs2/locking/dlm/mount.c b/fs/gfs2/locking/dlm/mount.c index f2efff424224..470bdf650b50 100644 --- a/fs/gfs2/locking/dlm/mount.c +++ b/fs/gfs2/locking/dlm/mount.c | |||
@@ -236,6 +236,27 @@ static void gdlm_withdraw(void *lockspace) | |||
236 | gdlm_kobject_release(ls); | 236 | gdlm_kobject_release(ls); |
237 | } | 237 | } |
238 | 238 | ||
239 | static int gdlm_plock(void *lockspace, struct lm_lockname *name, | ||
240 | struct file *file, int cmd, struct file_lock *fl) | ||
241 | { | ||
242 | struct gdlm_ls *ls = lockspace; | ||
243 | return dlm_posix_lock(ls->dlm_lockspace, name->ln_number, file, cmd, fl); | ||
244 | } | ||
245 | |||
246 | static int gdlm_punlock(void *lockspace, struct lm_lockname *name, | ||
247 | struct file *file, struct file_lock *fl) | ||
248 | { | ||
249 | struct gdlm_ls *ls = lockspace; | ||
250 | return dlm_posix_unlock(ls->dlm_lockspace, name->ln_number, file, fl); | ||
251 | } | ||
252 | |||
253 | static int gdlm_plock_get(void *lockspace, struct lm_lockname *name, | ||
254 | struct file *file, struct file_lock *fl) | ||
255 | { | ||
256 | struct gdlm_ls *ls = lockspace; | ||
257 | return dlm_posix_get(ls->dlm_lockspace, name->ln_number, file, fl); | ||
258 | } | ||
259 | |||
239 | const struct lm_lockops gdlm_ops = { | 260 | const struct lm_lockops gdlm_ops = { |
240 | .lm_proto_name = "lock_dlm", | 261 | .lm_proto_name = "lock_dlm", |
241 | .lm_mount = gdlm_mount, | 262 | .lm_mount = gdlm_mount, |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index b3d9ccde0c27..376fc972efed 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -100,7 +100,7 @@ header-y += ixjuser.h | |||
100 | header-y += jffs2.h | 100 | header-y += jffs2.h |
101 | header-y += keyctl.h | 101 | header-y += keyctl.h |
102 | header-y += limits.h | 102 | header-y += limits.h |
103 | header-y += lock_dlm_plock.h | 103 | header-y += dlm_plock.h |
104 | header-y += magic.h | 104 | header-y += magic.h |
105 | header-y += major.h | 105 | header-y += major.h |
106 | header-y += matroxfb.h | 106 | header-y += matroxfb.h |
diff --git a/include/linux/dlm_plock.h b/include/linux/dlm_plock.h new file mode 100644 index 000000000000..18d5fdbceb74 --- /dev/null +++ b/include/linux/dlm_plock.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. | ||
3 | * | ||
4 | * This copyrighted material is made available to anyone wishing to use, | ||
5 | * modify, copy, or redistribute it subject to the terms and conditions | ||
6 | * of the GNU General Public License v.2. | ||
7 | */ | ||
8 | |||
9 | #ifndef __DLM_PLOCK_DOT_H__ | ||
10 | #define __DLM_PLOCK_DOT_H__ | ||
11 | |||
12 | #define DLM_PLOCK_MISC_NAME "dlm_plock" | ||
13 | |||
14 | #define DLM_PLOCK_VERSION_MAJOR 1 | ||
15 | #define DLM_PLOCK_VERSION_MINOR 1 | ||
16 | #define DLM_PLOCK_VERSION_PATCH 0 | ||
17 | |||
18 | enum { | ||
19 | DLM_PLOCK_OP_LOCK = 1, | ||
20 | DLM_PLOCK_OP_UNLOCK, | ||
21 | DLM_PLOCK_OP_GET, | ||
22 | }; | ||
23 | |||
24 | struct dlm_plock_info { | ||
25 | __u32 version[3]; | ||
26 | __u8 optype; | ||
27 | __u8 ex; | ||
28 | __u8 wait; | ||
29 | __u8 pad; | ||
30 | __u32 pid; | ||
31 | __s32 nodeid; | ||
32 | __s32 rv; | ||
33 | __u32 fsid; | ||
34 | __u64 number; | ||
35 | __u64 start; | ||
36 | __u64 end; | ||
37 | __u64 owner; | ||
38 | }; | ||
39 | |||
40 | #ifdef __KERNEL__ | ||
41 | int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file, | ||
42 | int cmd, struct file_lock *fl); | ||
43 | int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file, | ||
44 | struct file_lock *fl); | ||
45 | int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file, | ||
46 | struct file_lock *fl); | ||
47 | #endif /* __KERNEL__ */ | ||
48 | |||
49 | #endif | ||
50 | |||
diff --git a/include/linux/lock_dlm_plock.h b/include/linux/lock_dlm_plock.h deleted file mode 100644 index fc3415113973..000000000000 --- a/include/linux/lock_dlm_plock.h +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 Red Hat, Inc. All rights reserved. | ||
3 | * | ||
4 | * This copyrighted material is made available to anyone wishing to use, | ||
5 | * modify, copy, or redistribute it subject to the terms and conditions | ||
6 | * of the GNU General Public License v.2. | ||
7 | */ | ||
8 | |||
9 | #ifndef __LOCK_DLM_PLOCK_DOT_H__ | ||
10 | #define __LOCK_DLM_PLOCK_DOT_H__ | ||
11 | |||
12 | #define GDLM_PLOCK_MISC_NAME "lock_dlm_plock" | ||
13 | |||
14 | #define GDLM_PLOCK_VERSION_MAJOR 1 | ||
15 | #define GDLM_PLOCK_VERSION_MINOR 1 | ||
16 | #define GDLM_PLOCK_VERSION_PATCH 0 | ||
17 | |||
18 | enum { | ||
19 | GDLM_PLOCK_OP_LOCK = 1, | ||
20 | GDLM_PLOCK_OP_UNLOCK, | ||
21 | GDLM_PLOCK_OP_GET, | ||
22 | }; | ||
23 | |||
24 | struct gdlm_plock_info { | ||
25 | __u32 version[3]; | ||
26 | __u8 optype; | ||
27 | __u8 ex; | ||
28 | __u8 wait; | ||
29 | __u8 pad; | ||
30 | __u32 pid; | ||
31 | __s32 nodeid; | ||
32 | __s32 rv; | ||
33 | __u32 fsid; | ||
34 | __u64 number; | ||
35 | __u64 start; | ||
36 | __u64 end; | ||
37 | __u64 owner; | ||
38 | }; | ||
39 | |||
40 | #endif | ||
41 | |||