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