xref: /linux/fs/dlm/user.c (revision a33f32244d8550da8b4a26e277ce07d5c6d158b5)
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 		wake_up_interruptible(&proc->wait);
219 	}
220 	if (type == AST_COMP && (ast_type & AST_COMP))
221 		log_debug(ls, "ast overlap %x status %x %x",
222 			  lkb->lkb_id, ua->lksb.sb_status, lkb->lkb_flags);
223 
224 	eol = lkb_is_endoflife(lkb, ua->lksb.sb_status, type);
225 	if (eol) {
226 		lkb->lkb_ast_type &= ~AST_BAST;
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 bmode, 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 = bmode;
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, type=0, bmode=0, removed = 0;
805 
806 	if (count == sizeof(struct dlm_device_version)) {
807 		error = copy_version_to_user(buf, count);
808 		return error;
809 	}
810 
811 	if (!proc) {
812 		log_print("non-version read from control device %zu", count);
813 		return -EINVAL;
814 	}
815 
816 #ifdef CONFIG_COMPAT
817 	if (count < sizeof(struct dlm_lock_result32))
818 #else
819 	if (count < sizeof(struct dlm_lock_result))
820 #endif
821 		return -EINVAL;
822 
823 	/* do we really need this? can a read happen after a close? */
824 	if (test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))
825 		return -EINVAL;
826 
827 	spin_lock(&proc->asts_spin);
828 	if (list_empty(&proc->asts)) {
829 		if (file->f_flags & O_NONBLOCK) {
830 			spin_unlock(&proc->asts_spin);
831 			return -EAGAIN;
832 		}
833 
834 		add_wait_queue(&proc->wait, &wait);
835 
836 	repeat:
837 		set_current_state(TASK_INTERRUPTIBLE);
838 		if (list_empty(&proc->asts) && !signal_pending(current)) {
839 			spin_unlock(&proc->asts_spin);
840 			schedule();
841 			spin_lock(&proc->asts_spin);
842 			goto repeat;
843 		}
844 		set_current_state(TASK_RUNNING);
845 		remove_wait_queue(&proc->wait, &wait);
846 
847 		if (signal_pending(current)) {
848 			spin_unlock(&proc->asts_spin);
849 			return -ERESTARTSYS;
850 		}
851 	}
852 
853 	/* there may be both completion and blocking asts to return for
854 	   the lkb, don't remove lkb from asts list unless no asts remain */
855 
856 	lkb = list_entry(proc->asts.next, struct dlm_lkb, lkb_astqueue);
857 
858 	if (lkb->lkb_ast_type & AST_COMP) {
859 		lkb->lkb_ast_type &= ~AST_COMP;
860 		type = AST_COMP;
861 	} else if (lkb->lkb_ast_type & AST_BAST) {
862 		lkb->lkb_ast_type &= ~AST_BAST;
863 		type = AST_BAST;
864 		bmode = lkb->lkb_bastmode;
865 	}
866 
867 	if (!lkb->lkb_ast_type) {
868 		list_del(&lkb->lkb_astqueue);
869 		removed = 1;
870 	}
871 	spin_unlock(&proc->asts_spin);
872 
873 	error = copy_result_to_user(lkb->lkb_ua,
874 			 	test_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags),
875 				type, bmode, buf, count);
876 
877 	/* removes reference for the proc->asts lists added by
878 	   dlm_user_add_ast() and may result in the lkb being freed */
879 	if (removed)
880 		dlm_put_lkb(lkb);
881 
882 	return error;
883 }
884 
885 static unsigned int device_poll(struct file *file, poll_table *wait)
886 {
887 	struct dlm_user_proc *proc = file->private_data;
888 
889 	poll_wait(file, &proc->wait, wait);
890 
891 	spin_lock(&proc->asts_spin);
892 	if (!list_empty(&proc->asts)) {
893 		spin_unlock(&proc->asts_spin);
894 		return POLLIN | POLLRDNORM;
895 	}
896 	spin_unlock(&proc->asts_spin);
897 	return 0;
898 }
899 
900 int dlm_user_daemon_available(void)
901 {
902 	/* dlm_controld hasn't started (or, has started, but not
903 	   properly populated configfs) */
904 
905 	if (!dlm_our_nodeid())
906 		return 0;
907 
908 	/* This is to deal with versions of dlm_controld that don't
909 	   know about the monitor device.  We assume that if the
910 	   dlm_controld was started (above), but the monitor device
911 	   was never opened, that it's an old version.  dlm_controld
912 	   should open the monitor device before populating configfs. */
913 
914 	if (dlm_monitor_unused)
915 		return 1;
916 
917 	return atomic_read(&dlm_monitor_opened) ? 1 : 0;
918 }
919 
920 static int ctl_device_open(struct inode *inode, struct file *file)
921 {
922 	file->private_data = NULL;
923 	return 0;
924 }
925 
926 static int ctl_device_close(struct inode *inode, struct file *file)
927 {
928 	return 0;
929 }
930 
931 static int monitor_device_open(struct inode *inode, struct file *file)
932 {
933 	atomic_inc(&dlm_monitor_opened);
934 	dlm_monitor_unused = 0;
935 	return 0;
936 }
937 
938 static int monitor_device_close(struct inode *inode, struct file *file)
939 {
940 	if (atomic_dec_and_test(&dlm_monitor_opened))
941 		dlm_stop_lockspaces();
942 	return 0;
943 }
944 
945 static const struct file_operations device_fops = {
946 	.open    = device_open,
947 	.release = device_close,
948 	.read    = device_read,
949 	.write   = device_write,
950 	.poll    = device_poll,
951 	.owner   = THIS_MODULE,
952 };
953 
954 static const struct file_operations ctl_device_fops = {
955 	.open    = ctl_device_open,
956 	.release = ctl_device_close,
957 	.read    = device_read,
958 	.write   = device_write,
959 	.owner   = THIS_MODULE,
960 };
961 
962 static struct miscdevice ctl_device = {
963 	.name  = "dlm-control",
964 	.fops  = &ctl_device_fops,
965 	.minor = MISC_DYNAMIC_MINOR,
966 };
967 
968 static const struct file_operations monitor_device_fops = {
969 	.open    = monitor_device_open,
970 	.release = monitor_device_close,
971 	.owner   = THIS_MODULE,
972 };
973 
974 static struct miscdevice monitor_device = {
975 	.name  = "dlm-monitor",
976 	.fops  = &monitor_device_fops,
977 	.minor = MISC_DYNAMIC_MINOR,
978 };
979 
980 int __init dlm_user_init(void)
981 {
982 	int error;
983 
984 	atomic_set(&dlm_monitor_opened, 0);
985 
986 	error = misc_register(&ctl_device);
987 	if (error) {
988 		log_print("misc_register failed for control device");
989 		goto out;
990 	}
991 
992 	error = misc_register(&monitor_device);
993 	if (error) {
994 		log_print("misc_register failed for monitor device");
995 		misc_deregister(&ctl_device);
996 	}
997  out:
998 	return error;
999 }
1000 
1001 void dlm_user_exit(void)
1002 {
1003 	misc_deregister(&ctl_device);
1004 	misc_deregister(&monitor_device);
1005 }
1006 
1007