diff options
Diffstat (limited to 'fs/gfs2/locking')
-rw-r--r-- | fs/gfs2/locking/dlm/mount.c | 5 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/plock.c | 18 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/sysfs.c | 38 | ||||
-rw-r--r-- | fs/gfs2/locking/dlm/thread.c | 9 |
4 files changed, 34 insertions, 36 deletions
diff --git a/fs/gfs2/locking/dlm/mount.c b/fs/gfs2/locking/dlm/mount.c index 41c5b04caaba..f2efff424224 100644 --- a/fs/gfs2/locking/dlm/mount.c +++ b/fs/gfs2/locking/dlm/mount.c | |||
@@ -67,6 +67,11 @@ static int make_args(struct gdlm_ls *ls, char *data_arg, int *nodir) | |||
67 | memset(data, 0, 256); | 67 | memset(data, 0, 256); |
68 | strncpy(data, data_arg, 255); | 68 | strncpy(data, data_arg, 255); |
69 | 69 | ||
70 | if (!strlen(data)) { | ||
71 | log_error("no mount options, (u)mount helpers not installed"); | ||
72 | return -EINVAL; | ||
73 | } | ||
74 | |||
70 | for (options = data; (x = strsep(&options, ":")); ) { | 75 | for (options = data; (x = strsep(&options, ":")); ) { |
71 | if (!*x) | 76 | if (!*x) |
72 | continue; | 77 | continue; |
diff --git a/fs/gfs2/locking/dlm/plock.c b/fs/gfs2/locking/dlm/plock.c index 1f7b038530b4..2ebd374b3143 100644 --- a/fs/gfs2/locking/dlm/plock.c +++ b/fs/gfs2/locking/dlm/plock.c | |||
@@ -89,15 +89,19 @@ int gdlm_plock(void *lockspace, struct lm_lockname *name, | |||
89 | op->info.number = name->ln_number; | 89 | op->info.number = name->ln_number; |
90 | op->info.start = fl->fl_start; | 90 | op->info.start = fl->fl_start; |
91 | op->info.end = fl->fl_end; | 91 | op->info.end = fl->fl_end; |
92 | op->info.owner = (__u64)(long) fl->fl_owner; | ||
93 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) { | 92 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) { |
93 | /* fl_owner is lockd which doesn't distinguish | ||
94 | processes on the nfs client */ | ||
95 | op->info.owner = (__u64) fl->fl_pid; | ||
94 | xop->callback = fl->fl_lmops->fl_grant; | 96 | xop->callback = fl->fl_lmops->fl_grant; |
95 | locks_init_lock(&xop->flc); | 97 | locks_init_lock(&xop->flc); |
96 | locks_copy_lock(&xop->flc, fl); | 98 | locks_copy_lock(&xop->flc, fl); |
97 | xop->fl = fl; | 99 | xop->fl = fl; |
98 | xop->file = file; | 100 | xop->file = file; |
99 | } else | 101 | } else { |
102 | op->info.owner = (__u64)(long) fl->fl_owner; | ||
100 | xop->callback = NULL; | 103 | xop->callback = NULL; |
104 | } | ||
101 | 105 | ||
102 | send_op(op); | 106 | send_op(op); |
103 | 107 | ||
@@ -203,7 +207,10 @@ int gdlm_punlock(void *lockspace, struct lm_lockname *name, | |||
203 | op->info.number = name->ln_number; | 207 | op->info.number = name->ln_number; |
204 | op->info.start = fl->fl_start; | 208 | op->info.start = fl->fl_start; |
205 | op->info.end = fl->fl_end; | 209 | op->info.end = fl->fl_end; |
206 | op->info.owner = (__u64)(long) fl->fl_owner; | 210 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) |
211 | op->info.owner = (__u64) fl->fl_pid; | ||
212 | else | ||
213 | op->info.owner = (__u64)(long) fl->fl_owner; | ||
207 | 214 | ||
208 | send_op(op); | 215 | send_op(op); |
209 | wait_event(recv_wq, (op->done != 0)); | 216 | wait_event(recv_wq, (op->done != 0)); |
@@ -242,7 +249,10 @@ int gdlm_plock_get(void *lockspace, struct lm_lockname *name, | |||
242 | op->info.number = name->ln_number; | 249 | op->info.number = name->ln_number; |
243 | op->info.start = fl->fl_start; | 250 | op->info.start = fl->fl_start; |
244 | op->info.end = fl->fl_end; | 251 | op->info.end = fl->fl_end; |
245 | op->info.owner = (__u64)(long) fl->fl_owner; | 252 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) |
253 | op->info.owner = (__u64) fl->fl_pid; | ||
254 | else | ||
255 | op->info.owner = (__u64)(long) fl->fl_owner; | ||
246 | 256 | ||
247 | send_op(op); | 257 | send_op(op); |
248 | wait_event(recv_wq, (op->done != 0)); | 258 | wait_event(recv_wq, (op->done != 0)); |
diff --git a/fs/gfs2/locking/dlm/sysfs.c b/fs/gfs2/locking/dlm/sysfs.c index ae9e6a25fe2b..a87b09839761 100644 --- a/fs/gfs2/locking/dlm/sysfs.c +++ b/fs/gfs2/locking/dlm/sysfs.c | |||
@@ -189,51 +189,39 @@ static struct kobj_type gdlm_ktype = { | |||
189 | .sysfs_ops = &gdlm_attr_ops, | 189 | .sysfs_ops = &gdlm_attr_ops, |
190 | }; | 190 | }; |
191 | 191 | ||
192 | static struct kset gdlm_kset = { | 192 | static struct kset *gdlm_kset; |
193 | .ktype = &gdlm_ktype, | ||
194 | }; | ||
195 | 193 | ||
196 | int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj) | 194 | int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj) |
197 | { | 195 | { |
198 | int error; | 196 | int error; |
199 | 197 | ||
200 | error = kobject_set_name(&ls->kobj, "%s", "lock_module"); | 198 | ls->kobj.kset = gdlm_kset; |
201 | if (error) { | 199 | error = kobject_init_and_add(&ls->kobj, &gdlm_ktype, fskobj, |
202 | log_error("can't set kobj name %d", error); | 200 | "lock_module"); |
203 | return error; | ||
204 | } | ||
205 | |||
206 | ls->kobj.kset = &gdlm_kset; | ||
207 | ls->kobj.ktype = &gdlm_ktype; | ||
208 | ls->kobj.parent = fskobj; | ||
209 | |||
210 | error = kobject_register(&ls->kobj); | ||
211 | if (error) | 201 | if (error) |
212 | log_error("can't register kobj %d", error); | 202 | log_error("can't register kobj %d", error); |
203 | kobject_uevent(&ls->kobj, KOBJ_ADD); | ||
213 | 204 | ||
214 | return error; | 205 | return error; |
215 | } | 206 | } |
216 | 207 | ||
217 | void gdlm_kobject_release(struct gdlm_ls *ls) | 208 | void gdlm_kobject_release(struct gdlm_ls *ls) |
218 | { | 209 | { |
219 | kobject_unregister(&ls->kobj); | 210 | kobject_put(&ls->kobj); |
220 | } | 211 | } |
221 | 212 | ||
222 | int gdlm_sysfs_init(void) | 213 | int gdlm_sysfs_init(void) |
223 | { | 214 | { |
224 | int error; | 215 | gdlm_kset = kset_create_and_add("lock_dlm", NULL, kernel_kobj); |
225 | 216 | if (!gdlm_kset) { | |
226 | kobject_set_name(&gdlm_kset.kobj, "lock_dlm"); | 217 | printk(KERN_WARNING "%s: can not create kset\n", __FUNCTION__); |
227 | kobj_set_kset_s(&gdlm_kset, kernel_subsys); | 218 | return -ENOMEM; |
228 | error = kset_register(&gdlm_kset); | 219 | } |
229 | if (error) | 220 | return 0; |
230 | printk("lock_dlm: cannot register kset %d\n", error); | ||
231 | |||
232 | return error; | ||
233 | } | 221 | } |
234 | 222 | ||
235 | void gdlm_sysfs_exit(void) | 223 | void gdlm_sysfs_exit(void) |
236 | { | 224 | { |
237 | kset_unregister(&gdlm_kset); | 225 | kset_unregister(gdlm_kset); |
238 | } | 226 | } |
239 | 227 | ||
diff --git a/fs/gfs2/locking/dlm/thread.c b/fs/gfs2/locking/dlm/thread.c index bd938f06481d..521694fc19d6 100644 --- a/fs/gfs2/locking/dlm/thread.c +++ b/fs/gfs2/locking/dlm/thread.c | |||
@@ -273,18 +273,13 @@ static int gdlm_thread(void *data, int blist) | |||
273 | struct gdlm_ls *ls = (struct gdlm_ls *) data; | 273 | struct gdlm_ls *ls = (struct gdlm_ls *) data; |
274 | struct gdlm_lock *lp = NULL; | 274 | struct gdlm_lock *lp = NULL; |
275 | uint8_t complete, blocking, submit, drop; | 275 | uint8_t complete, blocking, submit, drop; |
276 | DECLARE_WAITQUEUE(wait, current); | ||
277 | 276 | ||
278 | /* Only thread1 is allowed to do blocking callbacks since gfs | 277 | /* Only thread1 is allowed to do blocking callbacks since gfs |
279 | may wait for a completion callback within a blocking cb. */ | 278 | may wait for a completion callback within a blocking cb. */ |
280 | 279 | ||
281 | while (!kthread_should_stop()) { | 280 | while (!kthread_should_stop()) { |
282 | set_current_state(TASK_INTERRUPTIBLE); | 281 | wait_event_interruptible(ls->thread_wait, |
283 | add_wait_queue(&ls->thread_wait, &wait); | 282 | !no_work(ls, blist) || kthread_should_stop()); |
284 | if (no_work(ls, blist)) | ||
285 | schedule(); | ||
286 | remove_wait_queue(&ls->thread_wait, &wait); | ||
287 | set_current_state(TASK_RUNNING); | ||
288 | 283 | ||
289 | complete = blocking = submit = drop = 0; | 284 | complete = blocking = submit = drop = 0; |
290 | 285 | ||