]> Git Repo - linux.git/blob - fs/dlm/user.c
drm/xe/tests: Convert xe_mocs live tests
[linux.git] / fs / dlm / user.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2006-2010 Red Hat, Inc.  All rights reserved.
4  */
5
6 #include <linux/miscdevice.h>
7 #include <linux/init.h>
8 #include <linux/wait.h>
9 #include <linux/file.h>
10 #include <linux/fs.h>
11 #include <linux/poll.h>
12 #include <linux/signal.h>
13 #include <linux/spinlock.h>
14 #include <linux/dlm.h>
15 #include <linux/dlm_device.h>
16 #include <linux/slab.h>
17 #include <linux/sched/signal.h>
18
19 #include <trace/events/dlm.h>
20
21 #include "dlm_internal.h"
22 #include "lockspace.h"
23 #include "lock.h"
24 #include "lvb_table.h"
25 #include "user.h"
26 #include "ast.h"
27 #include "config.h"
28 #include "memory.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[];
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 = (__user void *)(long)kb32->i.lock.castparam;
115                 kb->i.lock.castaddr = (__user void *)(long)kb32->i.lock.castaddr;
116                 kb->i.lock.bastparam = (__user void *)(long)kb32->i.lock.bastparam;
117                 kb->i.lock.bastaddr = (__user void *)(long)kb32->i.lock.bastaddr;
118                 kb->i.lock.lksb = (__user 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         memset(res32, 0, sizeof(*res32));
128
129         res32->version[0] = res->version[0];
130         res32->version[1] = res->version[1];
131         res32->version[2] = res->version[2];
132
133         res32->user_astaddr = (__u32)(__force long)res->user_astaddr;
134         res32->user_astparam = (__u32)(__force long)res->user_astparam;
135         res32->user_lksb = (__u32)(__force long)res->user_lksb;
136         res32->bast_mode = res->bast_mode;
137
138         res32->lvb_offset = res->lvb_offset;
139         res32->length = res->length;
140
141         res32->lksb.sb_status = res->lksb.sb_status;
142         res32->lksb.sb_flags = res->lksb.sb_flags;
143         res32->lksb.sb_lkid = res->lksb.sb_lkid;
144         res32->lksb.sb_lvbptr = (__u32)(long)res->lksb.sb_lvbptr;
145 }
146 #endif
147
148 /* Figure out if this lock is at the end of its life and no longer
149    available for the application to use.  The lkb still exists until
150    the final ast is read.  A lock becomes EOL in three situations:
151      1. a noqueue request fails with EAGAIN
152      2. an unlock completes with EUNLOCK
153      3. a cancel of a waiting request completes with ECANCEL/EDEADLK
154    An EOL lock needs to be removed from the process's list of locks.
155    And we can't allow any new operation on an EOL lock.  This is
156    not related to the lifetime of the lkb struct which is managed
157    entirely by refcount. */
158
159 static int lkb_is_endoflife(int mode, int status)
160 {
161         switch (status) {
162         case -DLM_EUNLOCK:
163                 return 1;
164         case -DLM_ECANCEL:
165         case -ETIMEDOUT:
166         case -EDEADLK:
167         case -EAGAIN:
168                 if (mode == DLM_LOCK_IV)
169                         return 1;
170                 break;
171         }
172         return 0;
173 }
174
175 /* we could possibly check if the cancel of an orphan has resulted in the lkb
176    being removed and then remove that lkb from the orphans list and free it */
177
178 void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode,
179                       int status, uint32_t sbflags)
180 {
181         struct dlm_ls *ls;
182         struct dlm_user_args *ua;
183         struct dlm_user_proc *proc;
184         struct dlm_callback *cb;
185         int rv;
186
187         if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) ||
188             test_bit(DLM_IFL_DEAD_BIT, &lkb->lkb_iflags))
189                 return;
190
191         ls = lkb->lkb_resource->res_ls;
192         spin_lock_bh(&ls->ls_clear_proc_locks);
193
194         /* If ORPHAN/DEAD flag is set, it means the process is dead so an ast
195            can't be delivered.  For ORPHAN's, dlm_clear_proc_locks() freed
196            lkb->ua so we can't try to use it.  This second check is necessary
197            for cases where a completion ast is received for an operation that
198            began before clear_proc_locks did its cancel/unlock. */
199
200         if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) ||
201             test_bit(DLM_IFL_DEAD_BIT, &lkb->lkb_iflags))
202                 goto out;
203
204         DLM_ASSERT(lkb->lkb_ua, dlm_print_lkb(lkb););
205         ua = lkb->lkb_ua;
206         proc = ua->proc;
207
208         if ((flags & DLM_CB_BAST) && ua->bastaddr == NULL)
209                 goto out;
210
211         if ((flags & DLM_CB_CAST) && lkb_is_endoflife(mode, status))
212                 set_bit(DLM_IFL_ENDOFLIFE_BIT, &lkb->lkb_iflags);
213
214         spin_lock_bh(&proc->asts_spin);
215
216         rv = dlm_queue_lkb_callback(lkb, flags, mode, status, sbflags, &cb);
217         switch (rv) {
218         case DLM_ENQUEUE_CALLBACK_NEED_SCHED:
219                 cb->ua = *ua;
220                 cb->lkb_lksb = &cb->ua.lksb;
221                 if (cb->copy_lvb) {
222                         memcpy(cb->lvbptr, ua->lksb.sb_lvbptr,
223                                DLM_USER_LVB_LEN);
224                         cb->lkb_lksb->sb_lvbptr = cb->lvbptr;
225                 }
226
227                 list_add_tail(&cb->list, &proc->asts);
228                 wake_up_interruptible(&proc->wait);
229                 break;
230         case DLM_ENQUEUE_CALLBACK_SUCCESS:
231                 break;
232         case DLM_ENQUEUE_CALLBACK_FAILURE:
233                 fallthrough;
234         default:
235                 spin_unlock_bh(&proc->asts_spin);
236                 WARN_ON_ONCE(1);
237                 goto out;
238         }
239         spin_unlock_bh(&proc->asts_spin);
240
241         if (test_bit(DLM_IFL_ENDOFLIFE_BIT, &lkb->lkb_iflags)) {
242                 /* N.B. spin_lock locks_spin, not asts_spin */
243                 spin_lock_bh(&proc->locks_spin);
244                 if (!list_empty(&lkb->lkb_ownqueue)) {
245                         list_del_init(&lkb->lkb_ownqueue);
246                         dlm_put_lkb(lkb);
247                 }
248                 spin_unlock_bh(&proc->locks_spin);
249         }
250  out:
251         spin_unlock_bh(&ls->ls_clear_proc_locks);
252 }
253
254 static int device_user_lock(struct dlm_user_proc *proc,
255                             struct dlm_lock_params *params)
256 {
257         struct dlm_ls *ls;
258         struct dlm_user_args *ua;
259         uint32_t lkid;
260         int error = -ENOMEM;
261
262         ls = dlm_find_lockspace_local(proc->lockspace);
263         if (!ls)
264                 return -ENOENT;
265
266         if (!params->castaddr || !params->lksb) {
267                 error = -EINVAL;
268                 goto out;
269         }
270
271         ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
272         if (!ua)
273                 goto out;
274         ua->proc = proc;
275         ua->user_lksb = params->lksb;
276         ua->castparam = params->castparam;
277         ua->castaddr = params->castaddr;
278         ua->bastparam = params->bastparam;
279         ua->bastaddr = params->bastaddr;
280         ua->xid = params->xid;
281
282         if (params->flags & DLM_LKF_CONVERT) {
283                 error = dlm_user_convert(ls, ua,
284                                          params->mode, params->flags,
285                                          params->lkid, params->lvb);
286         } else if (params->flags & DLM_LKF_ORPHAN) {
287                 error = dlm_user_adopt_orphan(ls, ua,
288                                          params->mode, params->flags,
289                                          params->name, params->namelen,
290                                          &lkid);
291                 if (!error)
292                         error = lkid;
293         } else {
294                 error = dlm_user_request(ls, ua,
295                                          params->mode, params->flags,
296                                          params->name, params->namelen);
297                 if (!error)
298                         error = ua->lksb.sb_lkid;
299         }
300  out:
301         dlm_put_lockspace(ls);
302         return error;
303 }
304
305 static int device_user_unlock(struct dlm_user_proc *proc,
306                               struct dlm_lock_params *params)
307 {
308         struct dlm_ls *ls;
309         struct dlm_user_args *ua;
310         int error = -ENOMEM;
311
312         ls = dlm_find_lockspace_local(proc->lockspace);
313         if (!ls)
314                 return -ENOENT;
315
316         ua = kzalloc(sizeof(struct dlm_user_args), GFP_NOFS);
317         if (!ua)
318                 goto out;
319         ua->proc = proc;
320         ua->user_lksb = params->lksb;
321         ua->castparam = params->castparam;
322         ua->castaddr = params->castaddr;
323
324         if (params->flags & DLM_LKF_CANCEL)
325                 error = dlm_user_cancel(ls, ua, params->flags, params->lkid);
326         else
327                 error = dlm_user_unlock(ls, ua, params->flags, params->lkid,
328                                         params->lvb);
329  out:
330         dlm_put_lockspace(ls);
331         return error;
332 }
333
334 static int device_user_deadlock(struct dlm_user_proc *proc,
335                                 struct dlm_lock_params *params)
336 {
337         struct dlm_ls *ls;
338         int error;
339
340         ls = dlm_find_lockspace_local(proc->lockspace);
341         if (!ls)
342                 return -ENOENT;
343
344         error = dlm_user_deadlock(ls, params->flags, params->lkid);
345
346         dlm_put_lockspace(ls);
347         return error;
348 }
349
350 static int dlm_device_register(struct dlm_ls *ls, char *name)
351 {
352         int error, len;
353
354         /* The device is already registered.  This happens when the
355            lockspace is created multiple times from userspace. */
356         if (ls->ls_device.name)
357                 return 0;
358
359         error = -ENOMEM;
360         len = strlen(name) + strlen(name_prefix) + 2;
361         ls->ls_device.name = kzalloc(len, GFP_NOFS);
362         if (!ls->ls_device.name)
363                 goto fail;
364
365         snprintf((char *)ls->ls_device.name, len, "%s_%s", name_prefix,
366                  name);
367         ls->ls_device.fops = &device_fops;
368         ls->ls_device.minor = MISC_DYNAMIC_MINOR;
369
370         error = misc_register(&ls->ls_device);
371         if (error) {
372                 kfree(ls->ls_device.name);
373                 /* this has to be set to NULL
374                  * to avoid a double-free in dlm_device_deregister
375                  */
376                 ls->ls_device.name = NULL;
377         }
378 fail:
379         return error;
380 }
381
382 int dlm_device_deregister(struct dlm_ls *ls)
383 {
384         /* The device is not registered.  This happens when the lockspace
385            was never used from userspace, or when device_create_lockspace()
386            calls dlm_release_lockspace() after the register fails. */
387         if (!ls->ls_device.name)
388                 return 0;
389
390         misc_deregister(&ls->ls_device);
391         kfree(ls->ls_device.name);
392         return 0;
393 }
394
395 static int device_user_purge(struct dlm_user_proc *proc,
396                              struct dlm_purge_params *params)
397 {
398         struct dlm_ls *ls;
399         int error;
400
401         ls = dlm_find_lockspace_local(proc->lockspace);
402         if (!ls)
403                 return -ENOENT;
404
405         error = dlm_user_purge(ls, proc, params->nodeid, params->pid);
406
407         dlm_put_lockspace(ls);
408         return error;
409 }
410
411 static int device_create_lockspace(struct dlm_lspace_params *params)
412 {
413         dlm_lockspace_t *lockspace;
414         struct dlm_ls *ls;
415         int error;
416
417         if (!capable(CAP_SYS_ADMIN))
418                 return -EPERM;
419
420         error = dlm_new_user_lockspace(params->name, dlm_config.ci_cluster_name,
421                                        params->flags, DLM_USER_LVB_LEN, NULL,
422                                        NULL, NULL, &lockspace);
423         if (error)
424                 return error;
425
426         ls = dlm_find_lockspace_local(lockspace);
427         if (!ls)
428                 return -ENOENT;
429
430         error = dlm_device_register(ls, params->name);
431         dlm_put_lockspace(ls);
432
433         if (error)
434                 dlm_release_lockspace(lockspace, 0);
435         else
436                 error = ls->ls_device.minor;
437
438         return error;
439 }
440
441 static int device_remove_lockspace(struct dlm_lspace_params *params)
442 {
443         dlm_lockspace_t *lockspace;
444         struct dlm_ls *ls;
445         int error, force = 0;
446
447         if (!capable(CAP_SYS_ADMIN))
448                 return -EPERM;
449
450         ls = dlm_find_lockspace_device(params->minor);
451         if (!ls)
452                 return -ENOENT;
453
454         if (params->flags & DLM_USER_LSFLG_FORCEFREE)
455                 force = 2;
456
457         lockspace = ls->ls_local_handle;
458         dlm_put_lockspace(ls);
459
460         /* The final dlm_release_lockspace waits for references to go to
461            zero, so all processes will need to close their device for the
462            ls before the release will proceed.  release also calls the
463            device_deregister above.  Converting a positive return value
464            from release to zero means that userspace won't know when its
465            release was the final one, but it shouldn't need to know. */
466
467         error = dlm_release_lockspace(lockspace, force);
468         if (error > 0)
469                 error = 0;
470         return error;
471 }
472
473 /* Check the user's version matches ours */
474 static int check_version(struct dlm_write_request *req)
475 {
476         if (req->version[0] != DLM_DEVICE_VERSION_MAJOR ||
477             (req->version[0] == DLM_DEVICE_VERSION_MAJOR &&
478              req->version[1] > DLM_DEVICE_VERSION_MINOR)) {
479
480                 printk(KERN_DEBUG "dlm: process %s (%d) version mismatch "
481                        "user (%d.%d.%d) kernel (%d.%d.%d)\n",
482                        current->comm,
483                        task_pid_nr(current),
484                        req->version[0],
485                        req->version[1],
486                        req->version[2],
487                        DLM_DEVICE_VERSION_MAJOR,
488                        DLM_DEVICE_VERSION_MINOR,
489                        DLM_DEVICE_VERSION_PATCH);
490                 return -EINVAL;
491         }
492         return 0;
493 }
494
495 /*
496  * device_write
497  *
498  *   device_user_lock
499  *     dlm_user_request -> request_lock
500  *     dlm_user_convert -> convert_lock
501  *
502  *   device_user_unlock
503  *     dlm_user_unlock -> unlock_lock
504  *     dlm_user_cancel -> cancel_lock
505  *
506  *   device_create_lockspace
507  *     dlm_new_lockspace
508  *
509  *   device_remove_lockspace
510  *     dlm_release_lockspace
511  */
512
513 /* a write to a lockspace device is a lock or unlock request, a write
514    to the control device is to create/remove a lockspace */
515
516 static ssize_t device_write(struct file *file, const char __user *buf,
517                             size_t count, loff_t *ppos)
518 {
519         struct dlm_user_proc *proc = file->private_data;
520         struct dlm_write_request *kbuf;
521         int error;
522
523 #ifdef CONFIG_COMPAT
524         if (count < sizeof(struct dlm_write_request32))
525 #else
526         if (count < sizeof(struct dlm_write_request))
527 #endif
528                 return -EINVAL;
529
530         /*
531          * can't compare against COMPAT/dlm_write_request32 because
532          * we don't yet know if is64bit is zero
533          */
534         if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN)
535                 return -EINVAL;
536
537         kbuf = memdup_user_nul(buf, count);
538         if (IS_ERR(kbuf))
539                 return PTR_ERR(kbuf);
540
541         if (check_version(kbuf)) {
542                 error = -EBADE;
543                 goto out_free;
544         }
545
546 #ifdef CONFIG_COMPAT
547         if (!kbuf->is64bit) {
548                 struct dlm_write_request32 *k32buf;
549                 int namelen = 0;
550
551                 if (count > sizeof(struct dlm_write_request32))
552                         namelen = count - sizeof(struct dlm_write_request32);
553
554                 k32buf = (struct dlm_write_request32 *)kbuf;
555
556                 /* add 1 after namelen so that the name string is terminated */
557                 kbuf = kzalloc(sizeof(struct dlm_write_request) + namelen + 1,
558                                GFP_NOFS);
559                 if (!kbuf) {
560                         kfree(k32buf);
561                         return -ENOMEM;
562                 }
563
564                 if (proc)
565                         set_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags);
566
567                 compat_input(kbuf, k32buf, namelen);
568                 kfree(k32buf);
569         }
570 #endif
571
572         /* do we really need this? can a write happen after a close? */
573         if ((kbuf->cmd == DLM_USER_LOCK || kbuf->cmd == DLM_USER_UNLOCK) &&
574             (proc && test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))) {
575                 error = -EINVAL;
576                 goto out_free;
577         }
578
579         error = -EINVAL;
580
581         switch (kbuf->cmd)
582         {
583         case DLM_USER_LOCK:
584                 if (!proc) {
585                         log_print("no locking on control device");
586                         goto out_free;
587                 }
588                 error = device_user_lock(proc, &kbuf->i.lock);
589                 break;
590
591         case DLM_USER_UNLOCK:
592                 if (!proc) {
593                         log_print("no locking on control device");
594                         goto out_free;
595                 }
596                 error = device_user_unlock(proc, &kbuf->i.lock);
597                 break;
598
599         case DLM_USER_DEADLOCK:
600                 if (!proc) {
601                         log_print("no locking on control device");
602                         goto out_free;
603                 }
604                 error = device_user_deadlock(proc, &kbuf->i.lock);
605                 break;
606
607         case DLM_USER_CREATE_LOCKSPACE:
608                 if (proc) {
609                         log_print("create/remove only on control device");
610                         goto out_free;
611                 }
612                 error = device_create_lockspace(&kbuf->i.lspace);
613                 break;
614
615         case DLM_USER_REMOVE_LOCKSPACE:
616                 if (proc) {
617                         log_print("create/remove only on control device");
618                         goto out_free;
619                 }
620                 error = device_remove_lockspace(&kbuf->i.lspace);
621                 break;
622
623         case DLM_USER_PURGE:
624                 if (!proc) {
625                         log_print("no locking on control device");
626                         goto out_free;
627                 }
628                 error = device_user_purge(proc, &kbuf->i.purge);
629                 break;
630
631         default:
632                 log_print("Unknown command passed to DLM device : %d\n",
633                           kbuf->cmd);
634         }
635
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
677         ls = dlm_find_lockspace_local(proc->lockspace);
678         if (!ls)
679                 return -ENOENT;
680
681         set_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags);
682
683         dlm_clear_proc_locks(ls, proc);
684
685         /* at this point no more lkb's should exist for this lockspace,
686            so there's no chance of dlm_user_add_ast() being called and
687            looking for lkb->ua->proc */
688
689         kfree(proc);
690         file->private_data = NULL;
691
692         dlm_put_lockspace(ls);
693         dlm_put_lockspace(ls);  /* for the find in device_open() */
694
695         /* FIXME: AUTOFREE: if this ls is no longer used do
696            device_remove_lockspace() */
697
698         return 0;
699 }
700
701 static int copy_result_to_user(struct dlm_user_args *ua, int compat,
702                                uint32_t flags, int mode, int copy_lvb,
703                                char __user *buf, size_t count)
704 {
705 #ifdef CONFIG_COMPAT
706         struct dlm_lock_result32 result32;
707 #endif
708         struct dlm_lock_result result;
709         void *resultptr;
710         int error=0;
711         int len;
712         int struct_len;
713
714         memset(&result, 0, sizeof(struct dlm_lock_result));
715         result.version[0] = DLM_DEVICE_VERSION_MAJOR;
716         result.version[1] = DLM_DEVICE_VERSION_MINOR;
717         result.version[2] = DLM_DEVICE_VERSION_PATCH;
718         memcpy(&result.lksb, &ua->lksb, offsetof(struct dlm_lksb, sb_lvbptr));
719         result.user_lksb = ua->user_lksb;
720
721         /* FIXME: dlm1 provides for the user's bastparam/addr to not be updated
722            in a conversion unless the conversion is successful.  See code
723            in dlm_user_convert() for updating ua from ua_tmp.  OpenVMS, though,
724            notes that a new blocking AST address and parameter are set even if
725            the conversion fails, so maybe we should just do that. */
726
727         if (flags & DLM_CB_BAST) {
728                 result.user_astaddr = ua->bastaddr;
729                 result.user_astparam = ua->bastparam;
730                 result.bast_mode = mode;
731         } else {
732                 result.user_astaddr = ua->castaddr;
733                 result.user_astparam = ua->castparam;
734         }
735
736 #ifdef CONFIG_COMPAT
737         if (compat)
738                 len = sizeof(struct dlm_lock_result32);
739         else
740 #endif
741                 len = sizeof(struct dlm_lock_result);
742         struct_len = len;
743
744         /* copy lvb to userspace if there is one, it's been updated, and
745            the user buffer has space for it */
746
747         if (copy_lvb && ua->lksb.sb_lvbptr && 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         DECLARE_WAITQUEUE(wait, current);
796         struct dlm_callback *cb;
797         int rv, ret;
798
799         if (count == sizeof(struct dlm_device_version)) {
800                 rv = copy_version_to_user(buf, count);
801                 return rv;
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_bh(&proc->asts_spin);
821         if (list_empty(&proc->asts)) {
822                 if (file->f_flags & O_NONBLOCK) {
823                         spin_unlock_bh(&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_bh(&proc->asts_spin);
833                         schedule();
834                         spin_lock_bh(&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_bh(&proc->asts_spin);
842                         return -ERESTARTSYS;
843                 }
844         }
845
846         /* if we empty lkb_callbacks, we don't want to unlock the spinlock
847            without removing lkb_cb_list; so empty lkb_cb_list is always
848            consistent with empty lkb_callbacks */
849
850         cb = list_first_entry(&proc->asts, struct dlm_callback, list);
851         list_del(&cb->list);
852         spin_unlock_bh(&proc->asts_spin);
853
854         if (cb->flags & DLM_CB_BAST) {
855                 trace_dlm_bast(cb->ls_id, cb->lkb_id, cb->mode, cb->res_name,
856                                cb->res_length);
857         } else if (cb->flags & DLM_CB_CAST) {
858                 cb->lkb_lksb->sb_status = cb->sb_status;
859                 cb->lkb_lksb->sb_flags = cb->sb_flags;
860                 trace_dlm_ast(cb->ls_id, cb->lkb_id, cb->sb_status,
861                               cb->sb_flags, cb->res_name, cb->res_length);
862         }
863
864         ret = copy_result_to_user(&cb->ua,
865                                   test_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags),
866                                   cb->flags, cb->mode, cb->copy_lvb, buf, count);
867         dlm_free_cb(cb);
868         return ret;
869 }
870
871 static __poll_t device_poll(struct file *file, poll_table *wait)
872 {
873         struct dlm_user_proc *proc = file->private_data;
874
875         poll_wait(file, &proc->wait, wait);
876
877         spin_lock_bh(&proc->asts_spin);
878         if (!list_empty(&proc->asts)) {
879                 spin_unlock_bh(&proc->asts_spin);
880                 return EPOLLIN | EPOLLRDNORM;
881         }
882         spin_unlock_bh(&proc->asts_spin);
883         return 0;
884 }
885
886 int dlm_user_daemon_available(void)
887 {
888         /* dlm_controld hasn't started (or, has started, but not
889            properly populated configfs) */
890
891         if (!dlm_our_nodeid())
892                 return 0;
893
894         /* This is to deal with versions of dlm_controld that don't
895            know about the monitor device.  We assume that if the
896            dlm_controld was started (above), but the monitor device
897            was never opened, that it's an old version.  dlm_controld
898            should open the monitor device before populating configfs. */
899
900         if (dlm_monitor_unused)
901                 return 1;
902
903         return atomic_read(&dlm_monitor_opened) ? 1 : 0;
904 }
905
906 static int ctl_device_open(struct inode *inode, struct file *file)
907 {
908         file->private_data = NULL;
909         return 0;
910 }
911
912 static int ctl_device_close(struct inode *inode, struct file *file)
913 {
914         return 0;
915 }
916
917 static int monitor_device_open(struct inode *inode, struct file *file)
918 {
919         atomic_inc(&dlm_monitor_opened);
920         dlm_monitor_unused = 0;
921         return 0;
922 }
923
924 static int monitor_device_close(struct inode *inode, struct file *file)
925 {
926         if (atomic_dec_and_test(&dlm_monitor_opened))
927                 dlm_stop_lockspaces();
928         return 0;
929 }
930
931 static const struct file_operations device_fops = {
932         .open    = device_open,
933         .release = device_close,
934         .read    = device_read,
935         .write   = device_write,
936         .poll    = device_poll,
937         .owner   = THIS_MODULE,
938         .llseek  = noop_llseek,
939 };
940
941 static const struct file_operations ctl_device_fops = {
942         .open    = ctl_device_open,
943         .release = ctl_device_close,
944         .read    = device_read,
945         .write   = device_write,
946         .owner   = THIS_MODULE,
947         .llseek  = noop_llseek,
948 };
949
950 static struct miscdevice ctl_device = {
951         .name  = "dlm-control",
952         .fops  = &ctl_device_fops,
953         .minor = MISC_DYNAMIC_MINOR,
954 };
955
956 static const struct file_operations monitor_device_fops = {
957         .open    = monitor_device_open,
958         .release = monitor_device_close,
959         .owner   = THIS_MODULE,
960         .llseek  = noop_llseek,
961 };
962
963 static struct miscdevice monitor_device = {
964         .name  = "dlm-monitor",
965         .fops  = &monitor_device_fops,
966         .minor = MISC_DYNAMIC_MINOR,
967 };
968
969 int __init dlm_user_init(void)
970 {
971         int error;
972
973         atomic_set(&dlm_monitor_opened, 0);
974
975         error = misc_register(&ctl_device);
976         if (error) {
977                 log_print("misc_register failed for control device");
978                 goto out;
979         }
980
981         error = misc_register(&monitor_device);
982         if (error) {
983                 log_print("misc_register failed for monitor device");
984                 misc_deregister(&ctl_device);
985         }
986  out:
987         return error;
988 }
989
990 void dlm_user_exit(void)
991 {
992         misc_deregister(&ctl_device);
993         misc_deregister(&monitor_device);
994 }
995
This page took 0.087019 seconds and 4 git commands to generate.