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