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