]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - fs/dlm/user.c
nfs: flexfiles: fix kernel OOPS if MDS returns unsupported DS type
[mirror_ubuntu-zesty-kernel.git] / fs / dlm / user.c
CommitLineData
597d0cae 1/*
7fe2b319 2 * Copyright (C) 2006-2010 Red Hat, Inc. All rights reserved.
597d0cae
DT
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#include <linux/miscdevice.h>
10#include <linux/init.h>
11#include <linux/wait.h>
597d0cae
DT
12#include <linux/file.h>
13#include <linux/fs.h>
14#include <linux/poll.h>
15#include <linux/signal.h>
16#include <linux/spinlock.h>
17#include <linux/dlm.h>
18#include <linux/dlm_device.h>
5a0e3ad6 19#include <linux/slab.h>
597d0cae
DT
20
21#include "dlm_internal.h"
22#include "lockspace.h"
23#include "lock.h"
24#include "lvb_table.h"
84c6e8cd 25#include "user.h"
8304d6f2 26#include "ast.h"
597d0cae 27
0fe410d3 28static const char name_prefix[] = "dlm";
00977a59 29static const struct file_operations device_fops;
dc68c7ed
DT
30static atomic_t dlm_monitor_opened;
31static int dlm_monitor_unused = 1;
597d0cae
DT
32
33#ifdef CONFIG_COMPAT
34
35struct dlm_lock_params32 {
36 __u8 mode;
37 __u8 namelen;
d7db923e
DT
38 __u16 unused;
39 __u32 flags;
597d0cae
DT
40 __u32 lkid;
41 __u32 parent;
d7db923e
DT
42 __u64 xid;
43 __u64 timeout;
597d0cae
DT
44 __u32 castparam;
45 __u32 castaddr;
46 __u32 bastparam;
47 __u32 bastaddr;
48 __u32 lksb;
597d0cae
DT
49 char lvb[DLM_USER_LVB_LEN];
50 char name[0];
51};
52
53struct dlm_write_request32 {
54 __u32 version[3];
55 __u8 cmd;
56 __u8 is64bit;
57 __u8 unused[2];
58
59 union {
60 struct dlm_lock_params32 lock;
61 struct dlm_lspace_params lspace;
72c2be77 62 struct dlm_purge_params purge;
597d0cae
DT
63 } i;
64};
65
66struct dlm_lksb32 {
67 __u32 sb_status;
68 __u32 sb_lkid;
69 __u8 sb_flags;
70 __u32 sb_lvbptr;
71};
72
73struct dlm_lock_result32 {
d7db923e 74 __u32 version[3];
597d0cae
DT
75 __u32 length;
76 __u32 user_astaddr;
77 __u32 user_astparam;
78 __u32 user_lksb;
79 struct dlm_lksb32 lksb;
80 __u8 bast_mode;
81 __u8 unused[3];
82 /* Offsets may be zero if no data is present */
83 __u32 lvb_offset;
84};
85
86static void compat_input(struct dlm_write_request *kb,
2a79289e 87 struct dlm_write_request32 *kb32,
1fecb1c4 88 int namelen)
597d0cae
DT
89{
90 kb->version[0] = kb32->version[0];
91 kb->version[1] = kb32->version[1];
92 kb->version[2] = kb32->version[2];
93
94 kb->cmd = kb32->cmd;
95 kb->is64bit = kb32->is64bit;
96 if (kb->cmd == DLM_USER_CREATE_LOCKSPACE ||
97 kb->cmd == DLM_USER_REMOVE_LOCKSPACE) {
98 kb->i.lspace.flags = kb32->i.lspace.flags;
99 kb->i.lspace.minor = kb32->i.lspace.minor;
1fecb1c4 100 memcpy(kb->i.lspace.name, kb32->i.lspace.name, namelen);
72c2be77
DT
101 } else if (kb->cmd == DLM_USER_PURGE) {
102 kb->i.purge.nodeid = kb32->i.purge.nodeid;
103 kb->i.purge.pid = kb32->i.purge.pid;
597d0cae
DT
104 } else {
105 kb->i.lock.mode = kb32->i.lock.mode;
106 kb->i.lock.namelen = kb32->i.lock.namelen;
107 kb->i.lock.flags = kb32->i.lock.flags;
108 kb->i.lock.lkid = kb32->i.lock.lkid;
109 kb->i.lock.parent = kb32->i.lock.parent;
d7db923e
DT
110 kb->i.lock.xid = kb32->i.lock.xid;
111 kb->i.lock.timeout = kb32->i.lock.timeout;
597d0cae
DT
112 kb->i.lock.castparam = (void *)(long)kb32->i.lock.castparam;
113 kb->i.lock.castaddr = (void *)(long)kb32->i.lock.castaddr;
114 kb->i.lock.bastparam = (void *)(long)kb32->i.lock.bastparam;
115 kb->i.lock.bastaddr = (void *)(long)kb32->i.lock.bastaddr;
116 kb->i.lock.lksb = (void *)(long)kb32->i.lock.lksb;
117 memcpy(kb->i.lock.lvb, kb32->i.lock.lvb, DLM_USER_LVB_LEN);
1fecb1c4 118 memcpy(kb->i.lock.name, kb32->i.lock.name, namelen);
597d0cae
DT
119 }
120}
121
122static void compat_output(struct dlm_lock_result *res,
123 struct dlm_lock_result32 *res32)
124{
d7db923e
DT
125 res32->version[0] = res->version[0];
126 res32->version[1] = res->version[1];
127 res32->version[2] = res->version[2];
128
597d0cae
DT
129 res32->user_astaddr = (__u32)(long)res->user_astaddr;
130 res32->user_astparam = (__u32)(long)res->user_astparam;
131 res32->user_lksb = (__u32)(long)res->user_lksb;
132 res32->bast_mode = res->bast_mode;
133
134 res32->lvb_offset = res->lvb_offset;
135 res32->length = res->length;
136
137 res32->lksb.sb_status = res->lksb.sb_status;
138 res32->lksb.sb_flags = res->lksb.sb_flags;
139 res32->lksb.sb_lkid = res->lksb.sb_lkid;
140 res32->lksb.sb_lvbptr = (__u32)(long)res->lksb.sb_lvbptr;
141}
142#endif
143
84d8cd69
DT
144/* Figure out if this lock is at the end of its life and no longer
145 available for the application to use. The lkb still exists until
146 the final ast is read. A lock becomes EOL in three situations:
147 1. a noqueue request fails with EAGAIN
148 2. an unlock completes with EUNLOCK
149 3. a cancel of a waiting request completes with ECANCEL/EDEADLK
150 An EOL lock needs to be removed from the process's list of locks.
151 And we can't allow any new operation on an EOL lock. This is
152 not related to the lifetime of the lkb struct which is managed
153 entirely by refcount. */
154
8304d6f2 155static int lkb_is_endoflife(int mode, int status)
84d8cd69 156{
8304d6f2 157 switch (status) {
84d8cd69
DT
158 case -DLM_EUNLOCK:
159 return 1;
160 case -DLM_ECANCEL:
161 case -ETIMEDOUT:
8b4021fa 162 case -EDEADLK:
84d8cd69 163 case -EAGAIN:
8304d6f2 164 if (mode == DLM_LOCK_IV)
84d8cd69
DT
165 return 1;
166 break;
167 }
168 return 0;
169}
170
ef0c2bb0
DT
171/* we could possibly check if the cancel of an orphan has resulted in the lkb
172 being removed and then remove that lkb from the orphans list and free it */
597d0cae 173
8304d6f2
DT
174void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
175 int status, uint32_t sbflags, uint64_t seq)
597d0cae
DT
176{
177 struct dlm_ls *ls;
178 struct dlm_user_args *ua;
179 struct dlm_user_proc *proc;
8304d6f2 180 int rv;
597d0cae 181
ef0c2bb0 182 if (lkb->lkb_flags & (DLM_IFL_ORPHAN | DLM_IFL_DEAD))
597d0cae 183 return;
597d0cae
DT
184
185 ls = lkb->lkb_resource->res_ls;
186 mutex_lock(&ls->ls_clear_proc_locks);
187
188 /* If ORPHAN/DEAD flag is set, it means the process is dead so an ast
189 can't be delivered. For ORPHAN's, dlm_clear_proc_locks() freed
ef0c2bb0
DT
190 lkb->ua so we can't try to use it. This second check is necessary
191 for cases where a completion ast is received for an operation that
192 began before clear_proc_locks did its cancel/unlock. */
597d0cae 193
ef0c2bb0 194 if (lkb->lkb_flags & (DLM_IFL_ORPHAN | DLM_IFL_DEAD))
597d0cae 195 goto out;
597d0cae 196
d292c0cc
DT
197 DLM_ASSERT(lkb->lkb_ua, dlm_print_lkb(lkb););
198 ua = lkb->lkb_ua;
597d0cae
DT
199 proc = ua->proc;
200
8304d6f2 201 if ((flags & DLM_CB_BAST) && ua->bastaddr == NULL)
597d0cae
DT
202 goto out;
203
8304d6f2
DT
204 if ((flags & DLM_CB_CAST) && lkb_is_endoflife(mode, status))
205 lkb->lkb_flags |= DLM_IFL_ENDOFLIFE;
206
597d0cae 207 spin_lock(&proc->asts_spin);
ef0c2bb0 208
8304d6f2
DT
209 rv = dlm_add_lkb_callback(lkb, flags, mode, status, sbflags, seq);
210 if (rv < 0) {
211 spin_unlock(&proc->asts_spin);
212 goto out;
213 }
ef0c2bb0 214
23e8e1aa 215 if (list_empty(&lkb->lkb_cb_list)) {
597d0cae 216 kref_get(&lkb->lkb_ref);
23e8e1aa 217 list_add_tail(&lkb->lkb_cb_list, &proc->asts);
597d0cae
DT
218 wake_up_interruptible(&proc->wait);
219 }
597d0cae 220 spin_unlock(&proc->asts_spin);
34e22bed 221
8304d6f2
DT
222 if (lkb->lkb_flags & DLM_IFL_ENDOFLIFE) {
223 /* N.B. spin_lock locks_spin, not asts_spin */
ce5246b9 224 spin_lock(&proc->locks_spin);
ef0c2bb0
DT
225 if (!list_empty(&lkb->lkb_ownqueue)) {
226 list_del_init(&lkb->lkb_ownqueue);
227 dlm_put_lkb(lkb);
228 }
ce5246b9 229 spin_unlock(&proc->locks_spin);
34e22bed 230 }
597d0cae
DT
231 out:
232 mutex_unlock(&ls->ls_clear_proc_locks);
233}
234
235static int device_user_lock(struct dlm_user_proc *proc,
236 struct dlm_lock_params *params)
237{
238 struct dlm_ls *ls;
239 struct dlm_user_args *ua;
2ab4bd8e 240 uint32_t lkid;
597d0cae
DT
241 int error = -ENOMEM;
242
243 ls = dlm_find_lockspace_local(proc->lockspace);
244 if (!ls)
245 return -ENOENT;
246
247 if (!params->castaddr || !params->lksb) {
248 error = -EINVAL;
249 goto out;
250 }
251
573c24c4 252 ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
597d0cae
DT
253 if (!ua)
254 goto out;
255 ua->proc = proc;
256 ua->user_lksb = params->lksb;
257 ua->castparam = params->castparam;
258 ua->castaddr = params->castaddr;
259 ua->bastparam = params->bastparam;
260 ua->bastaddr = params->bastaddr;
d7db923e 261 ua->xid = params->xid;
597d0cae 262
2ab4bd8e 263 if (params->flags & DLM_LKF_CONVERT) {
597d0cae
DT
264 error = dlm_user_convert(ls, ua,
265 params->mode, params->flags,
d7db923e
DT
266 params->lkid, params->lvb,
267 (unsigned long) params->timeout);
2ab4bd8e
DT
268 } else if (params->flags & DLM_LKF_ORPHAN) {
269 error = dlm_user_adopt_orphan(ls, ua,
270 params->mode, params->flags,
271 params->name, params->namelen,
272 (unsigned long) params->timeout,
273 &lkid);
274 if (!error)
275 error = lkid;
276 } else {
597d0cae
DT
277 error = dlm_user_request(ls, ua,
278 params->mode, params->flags,
279 params->name, params->namelen,
d7db923e 280 (unsigned long) params->timeout);
597d0cae
DT
281 if (!error)
282 error = ua->lksb.sb_lkid;
283 }
284 out:
285 dlm_put_lockspace(ls);
286 return error;
287}
288
289static int device_user_unlock(struct dlm_user_proc *proc,
290 struct dlm_lock_params *params)
291{
292 struct dlm_ls *ls;
293 struct dlm_user_args *ua;
294 int error = -ENOMEM;
295
296 ls = dlm_find_lockspace_local(proc->lockspace);
297 if (!ls)
298 return -ENOENT;
299
573c24c4 300 ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
597d0cae
DT
301 if (!ua)
302 goto out;
303 ua->proc = proc;
304 ua->user_lksb = params->lksb;
305 ua->castparam = params->castparam;
306 ua->castaddr = params->castaddr;
307
308 if (params->flags & DLM_LKF_CANCEL)
309 error = dlm_user_cancel(ls, ua, params->flags, params->lkid);
310 else
311 error = dlm_user_unlock(ls, ua, params->flags, params->lkid,
312 params->lvb);
313 out:
314 dlm_put_lockspace(ls);
315 return error;
316}
317
8b4021fa
DT
318static int device_user_deadlock(struct dlm_user_proc *proc,
319 struct dlm_lock_params *params)
320{
321 struct dlm_ls *ls;
322 int error;
323
324 ls = dlm_find_lockspace_local(proc->lockspace);
325 if (!ls)
326 return -ENOENT;
327
328 error = dlm_user_deadlock(ls, params->flags, params->lkid);
329
330 dlm_put_lockspace(ls);
331 return error;
332}
333
0f8e0d9a 334static int dlm_device_register(struct dlm_ls *ls, char *name)
254da030
PC
335{
336 int error, len;
337
0f8e0d9a
DT
338 /* The device is already registered. This happens when the
339 lockspace is created multiple times from userspace. */
340 if (ls->ls_device.name)
341 return 0;
342
254da030
PC
343 error = -ENOMEM;
344 len = strlen(name) + strlen(name_prefix) + 2;
573c24c4 345 ls->ls_device.name = kzalloc(len, GFP_NOFS);
254da030
PC
346 if (!ls->ls_device.name)
347 goto fail;
348
349 snprintf((char *)ls->ls_device.name, len, "%s_%s", name_prefix,
350 name);
351 ls->ls_device.fops = &device_fops;
352 ls->ls_device.minor = MISC_DYNAMIC_MINOR;
353
354 error = misc_register(&ls->ls_device);
355 if (error) {
356 kfree(ls->ls_device.name);
357 }
358fail:
359 return error;
360}
361
0f8e0d9a
DT
362int dlm_device_deregister(struct dlm_ls *ls)
363{
0f8e0d9a
DT
364 /* The device is not registered. This happens when the lockspace
365 was never used from userspace, or when device_create_lockspace()
366 calls dlm_release_lockspace() after the register fails. */
367 if (!ls->ls_device.name)
368 return 0;
369
f368ed60
GKH
370 misc_deregister(&ls->ls_device);
371 kfree(ls->ls_device.name);
372 return 0;
0f8e0d9a
DT
373}
374
72c2be77
DT
375static int device_user_purge(struct dlm_user_proc *proc,
376 struct dlm_purge_params *params)
377{
378 struct dlm_ls *ls;
379 int error;
380
381 ls = dlm_find_lockspace_local(proc->lockspace);
382 if (!ls)
383 return -ENOENT;
384
385 error = dlm_user_purge(ls, proc, params->nodeid, params->pid);
386
387 dlm_put_lockspace(ls);
388 return error;
389}
390
597d0cae
DT
391static int device_create_lockspace(struct dlm_lspace_params *params)
392{
393 dlm_lockspace_t *lockspace;
394 struct dlm_ls *ls;
254da030 395 int error;
597d0cae
DT
396
397 if (!capable(CAP_SYS_ADMIN))
398 return -EPERM;
399
60f98d18
DT
400 error = dlm_new_lockspace(params->name, NULL, params->flags,
401 DLM_USER_LVB_LEN, NULL, NULL, NULL,
402 &lockspace);
597d0cae
DT
403 if (error)
404 return error;
405
406 ls = dlm_find_lockspace_local(lockspace);
407 if (!ls)
408 return -ENOENT;
409
0f8e0d9a 410 error = dlm_device_register(ls, params->name);
597d0cae 411 dlm_put_lockspace(ls);
597d0cae 412
254da030
PC
413 if (error)
414 dlm_release_lockspace(lockspace, 0);
415 else
416 error = ls->ls_device.minor;
417
597d0cae
DT
418 return error;
419}
420
421static int device_remove_lockspace(struct dlm_lspace_params *params)
422{
423 dlm_lockspace_t *lockspace;
424 struct dlm_ls *ls;
c6e6f0ba 425 int error, force = 0;
597d0cae
DT
426
427 if (!capable(CAP_SYS_ADMIN))
428 return -EPERM;
429
430 ls = dlm_find_lockspace_device(params->minor);
431 if (!ls)
432 return -ENOENT;
433
c6e6f0ba
DT
434 if (params->flags & DLM_USER_LSFLG_FORCEFREE)
435 force = 2;
436
597d0cae 437 lockspace = ls->ls_local_handle;
0f8e0d9a 438 dlm_put_lockspace(ls);
597d0cae 439
0f8e0d9a
DT
440 /* The final dlm_release_lockspace waits for references to go to
441 zero, so all processes will need to close their device for the
442 ls before the release will proceed. release also calls the
443 device_deregister above. Converting a positive return value
444 from release to zero means that userspace won't know when its
445 release was the final one, but it shouldn't need to know. */
597d0cae 446
c6e6f0ba 447 error = dlm_release_lockspace(lockspace, force);
0f8e0d9a
DT
448 if (error > 0)
449 error = 0;
597d0cae
DT
450 return error;
451}
452
453/* Check the user's version matches ours */
454static int check_version(struct dlm_write_request *req)
455{
456 if (req->version[0] != DLM_DEVICE_VERSION_MAJOR ||
457 (req->version[0] == DLM_DEVICE_VERSION_MAJOR &&
458 req->version[1] > DLM_DEVICE_VERSION_MINOR)) {
459
460 printk(KERN_DEBUG "dlm: process %s (%d) version mismatch "
461 "user (%d.%d.%d) kernel (%d.%d.%d)\n",
462 current->comm,
ba25f9dc 463 task_pid_nr(current),
597d0cae
DT
464 req->version[0],
465 req->version[1],
466 req->version[2],
467 DLM_DEVICE_VERSION_MAJOR,
468 DLM_DEVICE_VERSION_MINOR,
469 DLM_DEVICE_VERSION_PATCH);
470 return -EINVAL;
471 }
472 return 0;
473}
474
475/*
476 * device_write
477 *
478 * device_user_lock
479 * dlm_user_request -> request_lock
480 * dlm_user_convert -> convert_lock
481 *
482 * device_user_unlock
483 * dlm_user_unlock -> unlock_lock
484 * dlm_user_cancel -> cancel_lock
485 *
486 * device_create_lockspace
487 * dlm_new_lockspace
488 *
489 * device_remove_lockspace
490 * dlm_release_lockspace
491 */
492
493/* a write to a lockspace device is a lock or unlock request, a write
494 to the control device is to create/remove a lockspace */
495
496static ssize_t device_write(struct file *file, const char __user *buf,
497 size_t count, loff_t *ppos)
498{
499 struct dlm_user_proc *proc = file->private_data;
500 struct dlm_write_request *kbuf;
597d0cae
DT
501 int error;
502
503#ifdef CONFIG_COMPAT
504 if (count < sizeof(struct dlm_write_request32))
505#else
506 if (count < sizeof(struct dlm_write_request))
507#endif
508 return -EINVAL;
509
d4b0bcf3
DT
510 /*
511 * can't compare against COMPAT/dlm_write_request32 because
512 * we don't yet know if is64bit is zero
513 */
2b75bc91 514 if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN)
2b75bc91
SL
515 return -EINVAL;
516
16e5c1fc 517 kbuf = memdup_user_nul(buf, count);
117aa41e 518 if (IS_ERR(kbuf))
16e5c1fc 519 return PTR_ERR(kbuf);
597d0cae
DT
520
521 if (check_version(kbuf)) {
522 error = -EBADE;
523 goto out_free;
524 }
525
526#ifdef CONFIG_COMPAT
527 if (!kbuf->is64bit) {
528 struct dlm_write_request32 *k32buf;
1fecb1c4
DT
529 int namelen = 0;
530
531 if (count > sizeof(struct dlm_write_request32))
532 namelen = count - sizeof(struct dlm_write_request32);
533
597d0cae 534 k32buf = (struct dlm_write_request32 *)kbuf;
1fecb1c4
DT
535
536 /* add 1 after namelen so that the name string is terminated */
537 kbuf = kzalloc(sizeof(struct dlm_write_request) + namelen + 1,
573c24c4 538 GFP_NOFS);
cb980d9a
DT
539 if (!kbuf) {
540 kfree(k32buf);
597d0cae 541 return -ENOMEM;
cb980d9a 542 }
597d0cae
DT
543
544 if (proc)
545 set_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags);
1fecb1c4
DT
546
547 compat_input(kbuf, k32buf, namelen);
597d0cae
DT
548 kfree(k32buf);
549 }
550#endif
551
552 /* do we really need this? can a write happen after a close? */
553 if ((kbuf->cmd == DLM_USER_LOCK || kbuf->cmd == DLM_USER_UNLOCK) &&
cb980d9a
DT
554 (proc && test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))) {
555 error = -EINVAL;
556 goto out_free;
557 }
597d0cae 558
597d0cae
DT
559 error = -EINVAL;
560
561 switch (kbuf->cmd)
562 {
563 case DLM_USER_LOCK:
564 if (!proc) {
565 log_print("no locking on control device");
c6ca7bc9 566 goto out_free;
597d0cae
DT
567 }
568 error = device_user_lock(proc, &kbuf->i.lock);
569 break;
570
571 case DLM_USER_UNLOCK:
572 if (!proc) {
573 log_print("no locking on control device");
c6ca7bc9 574 goto out_free;
597d0cae
DT
575 }
576 error = device_user_unlock(proc, &kbuf->i.lock);
577 break;
578
8b4021fa
DT
579 case DLM_USER_DEADLOCK:
580 if (!proc) {
581 log_print("no locking on control device");
c6ca7bc9 582 goto out_free;
8b4021fa
DT
583 }
584 error = device_user_deadlock(proc, &kbuf->i.lock);
585 break;
586
597d0cae
DT
587 case DLM_USER_CREATE_LOCKSPACE:
588 if (proc) {
589 log_print("create/remove only on control device");
c6ca7bc9 590 goto out_free;
597d0cae
DT
591 }
592 error = device_create_lockspace(&kbuf->i.lspace);
593 break;
594
595 case DLM_USER_REMOVE_LOCKSPACE:
596 if (proc) {
597 log_print("create/remove only on control device");
c6ca7bc9 598 goto out_free;
597d0cae
DT
599 }
600 error = device_remove_lockspace(&kbuf->i.lspace);
601 break;
602
72c2be77
DT
603 case DLM_USER_PURGE:
604 if (!proc) {
605 log_print("no locking on control device");
c6ca7bc9 606 goto out_free;
72c2be77
DT
607 }
608 error = device_user_purge(proc, &kbuf->i.purge);
609 break;
610
597d0cae
DT
611 default:
612 log_print("Unknown command passed to DLM device : %d\n",
613 kbuf->cmd);
614 }
615
597d0cae
DT
616 out_free:
617 kfree(kbuf);
618 return error;
619}
620
621/* Every process that opens the lockspace device has its own "proc" structure
622 hanging off the open file that's used to keep track of locks owned by the
623 process and asts that need to be delivered to the process. */
624
625static int device_open(struct inode *inode, struct file *file)
626{
627 struct dlm_user_proc *proc;
628 struct dlm_ls *ls;
629
630 ls = dlm_find_lockspace_device(iminor(inode));
f9f2ed48 631 if (!ls)
597d0cae
DT
632 return -ENOENT;
633
573c24c4 634 proc = kzalloc(sizeof(struct dlm_user_proc), GFP_NOFS);
597d0cae
DT
635 if (!proc) {
636 dlm_put_lockspace(ls);
637 return -ENOMEM;
638 }
639
640 proc->lockspace = ls->ls_local_handle;
641 INIT_LIST_HEAD(&proc->asts);
642 INIT_LIST_HEAD(&proc->locks);
a1bc86e6 643 INIT_LIST_HEAD(&proc->unlocking);
597d0cae
DT
644 spin_lock_init(&proc->asts_spin);
645 spin_lock_init(&proc->locks_spin);
646 init_waitqueue_head(&proc->wait);
647 file->private_data = proc;
648
649 return 0;
650}
651
652static int device_close(struct inode *inode, struct file *file)
653{
654 struct dlm_user_proc *proc = file->private_data;
655 struct dlm_ls *ls;
597d0cae
DT
656
657 ls = dlm_find_lockspace_local(proc->lockspace);
658 if (!ls)
659 return -ENOENT;
660
597d0cae
DT
661 set_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags);
662
663 dlm_clear_proc_locks(ls, proc);
664
665 /* at this point no more lkb's should exist for this lockspace,
666 so there's no chance of dlm_user_add_ast() being called and
667 looking for lkb->ua->proc */
668
669 kfree(proc);
670 file->private_data = NULL;
671
672 dlm_put_lockspace(ls);
673 dlm_put_lockspace(ls); /* for the find in device_open() */
674
675 /* FIXME: AUTOFREE: if this ls is no longer used do
676 device_remove_lockspace() */
677
597d0cae
DT
678 return 0;
679}
680
8304d6f2
DT
681static int copy_result_to_user(struct dlm_user_args *ua, int compat,
682 uint32_t flags, int mode, int copy_lvb,
683 char __user *buf, size_t count)
597d0cae
DT
684{
685#ifdef CONFIG_COMPAT
686 struct dlm_lock_result32 result32;
687#endif
688 struct dlm_lock_result result;
689 void *resultptr;
690 int error=0;
691 int len;
692 int struct_len;
693
694 memset(&result, 0, sizeof(struct dlm_lock_result));
d7db923e
DT
695 result.version[0] = DLM_DEVICE_VERSION_MAJOR;
696 result.version[1] = DLM_DEVICE_VERSION_MINOR;
697 result.version[2] = DLM_DEVICE_VERSION_PATCH;
597d0cae
DT
698 memcpy(&result.lksb, &ua->lksb, sizeof(struct dlm_lksb));
699 result.user_lksb = ua->user_lksb;
700
701 /* FIXME: dlm1 provides for the user's bastparam/addr to not be updated
702 in a conversion unless the conversion is successful. See code
703 in dlm_user_convert() for updating ua from ua_tmp. OpenVMS, though,
704 notes that a new blocking AST address and parameter are set even if
705 the conversion fails, so maybe we should just do that. */
706
8304d6f2 707 if (flags & DLM_CB_BAST) {
597d0cae
DT
708 result.user_astaddr = ua->bastaddr;
709 result.user_astparam = ua->bastparam;
89d799d0 710 result.bast_mode = mode;
597d0cae
DT
711 } else {
712 result.user_astaddr = ua->castaddr;
713 result.user_astparam = ua->castparam;
714 }
715
716#ifdef CONFIG_COMPAT
717 if (compat)
718 len = sizeof(struct dlm_lock_result32);
719 else
720#endif
721 len = sizeof(struct dlm_lock_result);
722 struct_len = len;
723
724 /* copy lvb to userspace if there is one, it's been updated, and
725 the user buffer has space for it */
726
8304d6f2 727 if (copy_lvb && ua->lksb.sb_lvbptr && count >= len + DLM_USER_LVB_LEN) {
597d0cae
DT
728 if (copy_to_user(buf+len, ua->lksb.sb_lvbptr,
729 DLM_USER_LVB_LEN)) {
730 error = -EFAULT;
731 goto out;
732 }
733
734 result.lvb_offset = len;
735 len += DLM_USER_LVB_LEN;
736 }
737
738 result.length = len;
739 resultptr = &result;
740#ifdef CONFIG_COMPAT
741 if (compat) {
742 compat_output(&result, &result32);
743 resultptr = &result32;
744 }
745#endif
746
747 if (copy_to_user(buf, resultptr, struct_len))
748 error = -EFAULT;
749 else
750 error = len;
751 out:
752 return error;
753}
754
d7db923e
DT
755static int copy_version_to_user(char __user *buf, size_t count)
756{
757 struct dlm_device_version ver;
758
759 memset(&ver, 0, sizeof(struct dlm_device_version));
760 ver.version[0] = DLM_DEVICE_VERSION_MAJOR;
761 ver.version[1] = DLM_DEVICE_VERSION_MINOR;
762 ver.version[2] = DLM_DEVICE_VERSION_PATCH;
763
764 if (copy_to_user(buf, &ver, sizeof(struct dlm_device_version)))
765 return -EFAULT;
766 return sizeof(struct dlm_device_version);
767}
768
597d0cae
DT
769/* a read returns a single ast described in a struct dlm_lock_result */
770
771static ssize_t device_read(struct file *file, char __user *buf, size_t count,
772 loff_t *ppos)
773{
774 struct dlm_user_proc *proc = file->private_data;
775 struct dlm_lkb *lkb;
597d0cae 776 DECLARE_WAITQUEUE(wait, current);
8304d6f2
DT
777 struct dlm_callback cb;
778 int rv, resid, copy_lvb = 0;
b96f4650 779 int old_mode, new_mode;
597d0cae 780
d7db923e 781 if (count == sizeof(struct dlm_device_version)) {
8304d6f2
DT
782 rv = copy_version_to_user(buf, count);
783 return rv;
d7db923e
DT
784 }
785
786 if (!proc) {
787 log_print("non-version read from control device %zu", count);
788 return -EINVAL;
789 }
790
597d0cae
DT
791#ifdef CONFIG_COMPAT
792 if (count < sizeof(struct dlm_lock_result32))
793#else
794 if (count < sizeof(struct dlm_lock_result))
795#endif
796 return -EINVAL;
797
89d799d0
DT
798 try_another:
799
597d0cae
DT
800 /* do we really need this? can a read happen after a close? */
801 if (test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))
802 return -EINVAL;
803
804 spin_lock(&proc->asts_spin);
805 if (list_empty(&proc->asts)) {
806 if (file->f_flags & O_NONBLOCK) {
807 spin_unlock(&proc->asts_spin);
808 return -EAGAIN;
809 }
810
811 add_wait_queue(&proc->wait, &wait);
812
813 repeat:
814 set_current_state(TASK_INTERRUPTIBLE);
815 if (list_empty(&proc->asts) && !signal_pending(current)) {
816 spin_unlock(&proc->asts_spin);
817 schedule();
818 spin_lock(&proc->asts_spin);
819 goto repeat;
820 }
821 set_current_state(TASK_RUNNING);
822 remove_wait_queue(&proc->wait, &wait);
823
824 if (signal_pending(current)) {
825 spin_unlock(&proc->asts_spin);
826 return -ERESTARTSYS;
827 }
828 }
829
8304d6f2 830 /* if we empty lkb_callbacks, we don't want to unlock the spinlock
23e8e1aa 831 without removing lkb_cb_list; so empty lkb_cb_list is always
8304d6f2 832 consistent with empty lkb_callbacks */
597d0cae 833
23e8e1aa 834 lkb = list_entry(proc->asts.next, struct dlm_lkb, lkb_cb_list);
597d0cae 835
b96f4650
DT
836 /* rem_lkb_callback sets a new lkb_last_cast */
837 old_mode = lkb->lkb_last_cast.mode;
838
8304d6f2
DT
839 rv = dlm_rem_lkb_callback(lkb->lkb_resource->res_ls, lkb, &cb, &resid);
840 if (rv < 0) {
841 /* this shouldn't happen; lkb should have been removed from
842 list when resid was zero */
843 log_print("dlm_rem_lkb_callback empty %x", lkb->lkb_id);
23e8e1aa 844 list_del_init(&lkb->lkb_cb_list);
8304d6f2
DT
845 spin_unlock(&proc->asts_spin);
846 /* removes ref for proc->asts, may cause lkb to be freed */
847 dlm_put_lkb(lkb);
848 goto try_another;
89d799d0 849 }
8304d6f2 850 if (!resid)
23e8e1aa 851 list_del_init(&lkb->lkb_cb_list);
8304d6f2 852 spin_unlock(&proc->asts_spin);
89d799d0 853
8304d6f2
DT
854 if (cb.flags & DLM_CB_SKIP) {
855 /* removes ref for proc->asts, may cause lkb to be freed */
856 if (!resid)
857 dlm_put_lkb(lkb);
858 goto try_another;
89d799d0
DT
859 }
860
8304d6f2 861 if (cb.flags & DLM_CB_CAST) {
8304d6f2 862 new_mode = cb.mode;
597d0cae 863
8304d6f2
DT
864 if (!cb.sb_status && lkb->lkb_lksb->sb_lvbptr &&
865 dlm_lvb_operations[old_mode + 1][new_mode + 1])
866 copy_lvb = 1;
89d799d0 867
8304d6f2
DT
868 lkb->lkb_lksb->sb_status = cb.sb_status;
869 lkb->lkb_lksb->sb_flags = cb.sb_flags;
89d799d0 870 }
597d0cae 871
8304d6f2
DT
872 rv = copy_result_to_user(lkb->lkb_ua,
873 test_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags),
874 cb.flags, cb.mode, copy_lvb, buf, count);
89d799d0 875
8304d6f2
DT
876 /* removes ref for proc->asts, may cause lkb to be freed */
877 if (!resid)
597d0cae
DT
878 dlm_put_lkb(lkb);
879
8304d6f2 880 return rv;
597d0cae
DT
881}
882
883static unsigned int device_poll(struct file *file, poll_table *wait)
884{
885 struct dlm_user_proc *proc = file->private_data;
886
887 poll_wait(file, &proc->wait, wait);
888
889 spin_lock(&proc->asts_spin);
890 if (!list_empty(&proc->asts)) {
891 spin_unlock(&proc->asts_spin);
892 return POLLIN | POLLRDNORM;
893 }
894 spin_unlock(&proc->asts_spin);
895 return 0;
896}
897
dc68c7ed
DT
898int dlm_user_daemon_available(void)
899{
900 /* dlm_controld hasn't started (or, has started, but not
901 properly populated configfs) */
902
903 if (!dlm_our_nodeid())
904 return 0;
905
906 /* This is to deal with versions of dlm_controld that don't
907 know about the monitor device. We assume that if the
908 dlm_controld was started (above), but the monitor device
909 was never opened, that it's an old version. dlm_controld
910 should open the monitor device before populating configfs. */
911
912 if (dlm_monitor_unused)
913 return 1;
914
915 return atomic_read(&dlm_monitor_opened) ? 1 : 0;
916}
917
597d0cae
DT
918static int ctl_device_open(struct inode *inode, struct file *file)
919{
920 file->private_data = NULL;
921 return 0;
922}
923
924static int ctl_device_close(struct inode *inode, struct file *file)
925{
926 return 0;
927}
928
dc68c7ed
DT
929static int monitor_device_open(struct inode *inode, struct file *file)
930{
931 atomic_inc(&dlm_monitor_opened);
932 dlm_monitor_unused = 0;
933 return 0;
934}
935
936static int monitor_device_close(struct inode *inode, struct file *file)
937{
938 if (atomic_dec_and_test(&dlm_monitor_opened))
939 dlm_stop_lockspaces();
940 return 0;
941}
942
00977a59 943static const struct file_operations device_fops = {
597d0cae
DT
944 .open = device_open,
945 .release = device_close,
946 .read = device_read,
947 .write = device_write,
948 .poll = device_poll,
949 .owner = THIS_MODULE,
6038f373 950 .llseek = noop_llseek,
597d0cae
DT
951};
952
00977a59 953static const struct file_operations ctl_device_fops = {
597d0cae
DT
954 .open = ctl_device_open,
955 .release = ctl_device_close,
d7db923e 956 .read = device_read,
597d0cae
DT
957 .write = device_write,
958 .owner = THIS_MODULE,
6038f373 959 .llseek = noop_llseek,
597d0cae
DT
960};
961
0fe410d3
DC
962static struct miscdevice ctl_device = {
963 .name = "dlm-control",
964 .fops = &ctl_device_fops,
965 .minor = MISC_DYNAMIC_MINOR,
966};
967
dc68c7ed
DT
968static const struct file_operations monitor_device_fops = {
969 .open = monitor_device_open,
970 .release = monitor_device_close,
971 .owner = THIS_MODULE,
6038f373 972 .llseek = noop_llseek,
dc68c7ed
DT
973};
974
975static struct miscdevice monitor_device = {
976 .name = "dlm-monitor",
977 .fops = &monitor_device_fops,
978 .minor = MISC_DYNAMIC_MINOR,
979};
980
30727174 981int __init dlm_user_init(void)
597d0cae
DT
982{
983 int error;
984
dc68c7ed
DT
985 atomic_set(&dlm_monitor_opened, 0);
986
597d0cae 987 error = misc_register(&ctl_device);
dc68c7ed 988 if (error) {
597d0cae 989 log_print("misc_register failed for control device");
dc68c7ed
DT
990 goto out;
991 }
597d0cae 992
dc68c7ed
DT
993 error = misc_register(&monitor_device);
994 if (error) {
995 log_print("misc_register failed for monitor device");
996 misc_deregister(&ctl_device);
997 }
998 out:
597d0cae
DT
999 return error;
1000}
1001
1002void dlm_user_exit(void)
1003{
1004 misc_deregister(&ctl_device);
dc68c7ed 1005 misc_deregister(&monitor_device);
597d0cae
DT
1006}
1007