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