1 /******************************************************************************
2 *******************************************************************************
4 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5 ** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
7 ** This copyrighted material is made available to anyone wishing to use,
8 ** modify, copy, or redistribute it subject to the terms and conditions
9 ** of the GNU General Public License v.2.
11 *******************************************************************************
12 ******************************************************************************/
17 * This is the userland interface to the DLM.
19 * The locking is done via a misc char device (find the
20 * registered minor number in /proc/misc).
22 * User code should not use this interface directly but
23 * call the library routines in libdlm.a instead.
27 #include <linux/miscdevice.h>
28 #include <linux/init.h>
29 #include <linux/wait.h>
30 #include <linux/module.h>
31 #include <linux/file.h>
33 #include <linux/poll.h>
34 #include <linux/signal.h>
35 #include <linux/spinlock.h>
36 #include <linux/idr.h>
38 #include <linux/dlm.h>
39 #include <linux/dlm_device.h>
41 #include "lvb_table.h"
43 static struct file_operations _dlm_fops;
44 static const char *name_prefix="dlm";
45 static struct list_head user_ls_list;
46 static struct semaphore user_ls_lock;
48 /* Lock infos are stored in here indexed by lock ID */
49 static DEFINE_IDR(lockinfo_idr);
50 static rwlock_t lockinfo_lock;
52 /* Flags in li_flags */
53 #define LI_FLAG_COMPLETE 1
54 #define LI_FLAG_FIRSTLOCK 2
55 #define LI_FLAG_PERSISTENT 3
57 /* flags in ls_flags*/
58 #define LS_FLAG_DELETED 1
59 #define LS_FLAG_AUTOFREE 2
62 #define LOCKINFO_MAGIC 0x53595324
69 struct dlm_lksb li_lksb;
70 wait_queue_head_t li_waitq;
71 unsigned long li_flags;
72 void __user *li_castparam;
73 void __user *li_castaddr;
74 void __user *li_bastparam;
75 void __user *li_bastaddr;
76 void __user *li_pend_bastparam;
77 void __user *li_pend_bastaddr;
78 struct list_head li_ownerqueue;
79 struct file_info *li_file;
80 struct dlm_lksb __user *li_user_lksb;
81 struct semaphore li_firstlock;
84 /* A queued AST no less */
86 struct dlm_lock_result result;
87 struct list_head list;
89 uint32_t progress; /* How much has been read */
92 /* One of these per userland lockspace */
98 /* Passed into misc_register() */
99 struct miscdevice ls_miscinfo;
100 struct list_head ls_list;
103 /* misc_device info for the control device */
104 static struct miscdevice ctl_device;
107 * Stuff we hang off the file struct.
108 * The first two are to cope with unlocking all the
109 * locks help by a process when it dies.
112 struct list_head fi_li_list; /* List of active lock_infos */
113 spinlock_t fi_li_lock;
114 struct list_head fi_ast_list; /* Queue of ASTs to be delivered */
115 spinlock_t fi_ast_lock;
116 wait_queue_head_t fi_wait;
117 struct user_ls *fi_ls;
118 atomic_t fi_refcnt; /* Number of users */
119 unsigned long fi_flags; /* Bit 1 means the device is open */
123 /* get and put ops for file_info.
124 Actually I don't really like "get" and "put", but everyone
125 else seems to use them and I can't think of anything
126 nicer at the moment */
127 static void get_file_info(struct file_info *f)
129 atomic_inc(&f->fi_refcnt);
132 static void put_file_info(struct file_info *f)
134 if (atomic_dec_and_test(&f->fi_refcnt))
138 static void release_lockinfo(struct lock_info *li)
140 put_file_info(li->li_file);
142 write_lock(&lockinfo_lock);
143 idr_remove(&lockinfo_idr, li->li_lksb.sb_lkid);
144 write_unlock(&lockinfo_lock);
146 if (li->li_lksb.sb_lvbptr)
147 kfree(li->li_lksb.sb_lvbptr);
150 module_put(THIS_MODULE);
153 static struct lock_info *get_lockinfo(uint32_t lockid)
155 struct lock_info *li;
157 read_lock(&lockinfo_lock);
158 li = idr_find(&lockinfo_idr, lockid);
159 read_unlock(&lockinfo_lock);
164 static int add_lockinfo(struct lock_info *li)
170 write_lock(&lockinfo_lock);
172 if (idr_find(&lockinfo_idr, li->li_lksb.sb_lkid))
176 r = idr_pre_get(&lockinfo_idr, GFP_KERNEL);
180 r = idr_get_new_above(&lockinfo_idr, li, li->li_lksb.sb_lkid, &n);
184 if (n != li->li_lksb.sb_lkid) {
185 idr_remove(&lockinfo_idr, n);
192 write_unlock(&lockinfo_lock);
198 static struct user_ls *__find_lockspace(int minor)
200 struct user_ls *lsinfo;
202 list_for_each_entry(lsinfo, &user_ls_list, ls_list) {
203 if (lsinfo->ls_miscinfo.minor == minor)
209 /* Find a lockspace struct given the device minor number */
210 static struct user_ls *find_lockspace(int minor)
212 struct user_ls *lsinfo;
215 lsinfo = __find_lockspace(minor);
221 static void add_lockspace_to_list(struct user_ls *lsinfo)
224 list_add(&lsinfo->ls_list, &user_ls_list);
228 /* Register a lockspace with the DLM and create a misc
229 device for userland to access it */
230 static int register_lockspace(char *name, struct user_ls **ls, int flags)
232 struct user_ls *newls;
236 namelen = strlen(name)+strlen(name_prefix)+2;
238 newls = kmalloc(sizeof(struct user_ls), GFP_KERNEL);
241 memset(newls, 0, sizeof(struct user_ls));
243 newls->ls_miscinfo.name = kmalloc(namelen, GFP_KERNEL);
244 if (!newls->ls_miscinfo.name) {
249 status = dlm_new_lockspace(name, strlen(name), &newls->ls_lockspace, 0,
252 kfree(newls->ls_miscinfo.name);
257 snprintf((char*)newls->ls_miscinfo.name, namelen, "%s_%s",
260 newls->ls_miscinfo.fops = &_dlm_fops;
261 newls->ls_miscinfo.minor = MISC_DYNAMIC_MINOR;
263 status = misc_register(&newls->ls_miscinfo);
265 printk(KERN_ERR "dlm: misc register failed for %s\n", name);
266 dlm_release_lockspace(newls->ls_lockspace, 0);
267 kfree(newls->ls_miscinfo.name);
272 if (flags & DLM_USER_LSFLG_AUTOFREE)
273 set_bit(LS_FLAG_AUTOFREE, &newls->ls_flags);
275 add_lockspace_to_list(newls);
280 /* Called with the user_ls_lock semaphore held */
281 static int unregister_lockspace(struct user_ls *lsinfo, int force)
285 status = dlm_release_lockspace(lsinfo->ls_lockspace, force);
289 status = misc_deregister(&lsinfo->ls_miscinfo);
293 list_del(&lsinfo->ls_list);
294 set_bit(LS_FLAG_DELETED, &lsinfo->ls_flags);
295 lsinfo->ls_lockspace = NULL;
296 if (atomic_read(&lsinfo->ls_refcnt) == 0) {
297 kfree(lsinfo->ls_miscinfo.name);
304 /* Add it to userland's AST queue */
305 static void add_to_astqueue(struct lock_info *li, void *astaddr, void *astparam,
308 struct ast_info *ast = kmalloc(sizeof(struct ast_info), GFP_KERNEL);
312 memset(ast, 0, sizeof(*ast));
313 ast->result.user_astparam = astparam;
314 ast->result.user_astaddr = astaddr;
315 ast->result.user_lksb = li->li_user_lksb;
316 memcpy(&ast->result.lksb, &li->li_lksb, sizeof(struct dlm_lksb));
317 ast->lvb_updated = lvb_updated;
319 spin_lock(&li->li_file->fi_ast_lock);
320 list_add_tail(&ast->list, &li->li_file->fi_ast_list);
321 spin_unlock(&li->li_file->fi_ast_lock);
322 wake_up_interruptible(&li->li_file->fi_wait);
325 static void bast_routine(void *param, int mode)
327 struct lock_info *li = param;
329 if (li && li->li_bastaddr)
330 add_to_astqueue(li, li->li_bastaddr, li->li_bastparam, 0);
334 * This is the kernel's AST routine.
335 * All lock, unlock & query operations complete here.
336 * The only syncronous ops are those done during device close.
338 static void ast_routine(void *param)
340 struct lock_info *li = param;
342 /* Param may be NULL if a persistent lock is unlocked by someone else */
346 /* If this is a succesful conversion then activate the blocking ast
347 * args from the conversion request */
348 if (!test_bit(LI_FLAG_FIRSTLOCK, &li->li_flags) &&
349 li->li_lksb.sb_status == 0) {
351 li->li_bastparam = li->li_pend_bastparam;
352 li->li_bastaddr = li->li_pend_bastaddr;
353 li->li_pend_bastaddr = NULL;
356 /* If it's an async request then post data to the user's AST queue. */
357 if (li->li_castaddr) {
360 /* See if the lvb has been updated */
361 if (dlm_lvb_operations[li->li_grmode+1][li->li_rqmode+1] == 1)
364 if (li->li_lksb.sb_status == 0)
365 li->li_grmode = li->li_rqmode;
367 /* Only queue AST if the device is still open */
368 if (test_bit(1, &li->li_file->fi_flags))
369 add_to_astqueue(li, li->li_castaddr, li->li_castparam,
372 /* If it's a new lock operation that failed, then
373 * remove it from the owner queue and free the
376 if (test_and_clear_bit(LI_FLAG_FIRSTLOCK, &li->li_flags) &&
377 li->li_lksb.sb_status != 0) {
379 /* Wait till dlm_lock() has finished */
380 down(&li->li_firstlock);
381 up(&li->li_firstlock);
383 spin_lock(&li->li_file->fi_li_lock);
384 list_del(&li->li_ownerqueue);
385 spin_unlock(&li->li_file->fi_li_lock);
386 release_lockinfo(li);
389 /* Free unlocks & queries */
390 if (li->li_lksb.sb_status == -DLM_EUNLOCK ||
391 li->li_cmd == DLM_USER_QUERY) {
392 release_lockinfo(li);
395 /* Synchronous request, just wake up the caller */
396 set_bit(LI_FLAG_COMPLETE, &li->li_flags);
397 wake_up_interruptible(&li->li_waitq);
402 * Wait for the lock op to complete and return the status.
404 static int wait_for_ast(struct lock_info *li)
406 /* Wait for the AST routine to complete */
407 set_task_state(current, TASK_INTERRUPTIBLE);
408 while (!test_bit(LI_FLAG_COMPLETE, &li->li_flags))
411 set_task_state(current, TASK_RUNNING);
413 return li->li_lksb.sb_status;
417 /* Open on control device */
418 static int dlm_ctl_open(struct inode *inode, struct file *file)
420 file->private_data = NULL;
424 /* Close on control device */
425 static int dlm_ctl_close(struct inode *inode, struct file *file)
430 /* Open on lockspace device */
431 static int dlm_open(struct inode *inode, struct file *file)
434 struct user_ls *lsinfo;
436 lsinfo = find_lockspace(iminor(inode));
440 f = kmalloc(sizeof(struct file_info), GFP_KERNEL);
444 atomic_inc(&lsinfo->ls_refcnt);
445 INIT_LIST_HEAD(&f->fi_li_list);
446 INIT_LIST_HEAD(&f->fi_ast_list);
447 spin_lock_init(&f->fi_li_lock);
448 spin_lock_init(&f->fi_ast_lock);
449 init_waitqueue_head(&f->fi_wait);
453 set_bit(1, &f->fi_flags);
455 file->private_data = f;
460 /* Check the user's version matches ours */
461 static int check_version(struct dlm_write_request *req)
463 if (req->version[0] != DLM_DEVICE_VERSION_MAJOR ||
464 (req->version[0] == DLM_DEVICE_VERSION_MAJOR &&
465 req->version[1] > DLM_DEVICE_VERSION_MINOR)) {
467 printk(KERN_DEBUG "dlm: process %s (%d) version mismatch "
468 "user (%d.%d.%d) kernel (%d.%d.%d)\n",
474 DLM_DEVICE_VERSION_MAJOR,
475 DLM_DEVICE_VERSION_MINOR,
476 DLM_DEVICE_VERSION_PATCH);
482 /* Close on lockspace device */
483 static int dlm_close(struct inode *inode, struct file *file)
485 struct file_info *f = file->private_data;
487 struct lock_info *old_li, *safe;
490 struct user_ls *lsinfo;
491 DECLARE_WAITQUEUE(wq, current);
493 lsinfo = find_lockspace(iminor(inode));
497 /* Mark this closed so that ASTs will not be delivered any more */
498 clear_bit(1, &f->fi_flags);
500 /* Block signals while we are doing this */
501 sigfillset(&allsigs);
502 sigprocmask(SIG_BLOCK, &allsigs, &tmpsig);
504 /* We use our own lock_info struct here, so that any
505 * outstanding "real" ASTs will be delivered with the
506 * corresponding "real" params, thus freeing the lock_info
507 * that belongs the lock. This catches the corner case where
508 * a lock is BUSY when we try to unlock it here
510 memset(&li, 0, sizeof(li));
511 clear_bit(LI_FLAG_COMPLETE, &li.li_flags);
512 init_waitqueue_head(&li.li_waitq);
513 add_wait_queue(&li.li_waitq, &wq);
516 * Free any outstanding locks, they are on the
517 * list in LIFO order so there should be no problems
518 * about unlocking parents before children.
520 list_for_each_entry_safe(old_li, safe, &f->fi_li_list, li_ownerqueue) {
524 /* Don't unlock persistent locks, just mark them orphaned */
525 if (test_bit(LI_FLAG_PERSISTENT, &old_li->li_flags)) {
526 list_del(&old_li->li_ownerqueue);
528 /* Update master copy */
529 /* TODO: Check locking core updates the local and
530 remote ORPHAN flags */
531 li.li_lksb.sb_lkid = old_li->li_lksb.sb_lkid;
532 status = dlm_lock(f->fi_ls->ls_lockspace,
533 old_li->li_grmode, &li.li_lksb,
534 DLM_LKF_CONVERT|DLM_LKF_ORPHAN,
535 NULL, 0, 0, ast_routine, NULL,
538 printk("dlm: Error orphaning lock %x: %d\n",
539 old_li->li_lksb.sb_lkid, status);
541 /* But tidy our references in it */
542 release_lockinfo(old_li);
546 clear_bit(LI_FLAG_COMPLETE, &li.li_flags);
548 flags = DLM_LKF_FORCEUNLOCK;
549 if (old_li->li_grmode >= DLM_LOCK_PW)
550 flags |= DLM_LKF_IVVALBLK;
552 status = dlm_unlock(f->fi_ls->ls_lockspace,
553 old_li->li_lksb.sb_lkid, flags,
556 /* Must wait for it to complete as the next lock could be its
561 /* Unlock suceeded, free the lock_info struct. */
563 release_lockinfo(old_li);
566 remove_wait_queue(&li.li_waitq, &wq);
569 * If this is the last reference to the lockspace
570 * then free the struct. If it's an AUTOFREE lockspace
571 * then free the whole thing.
574 if (atomic_dec_and_test(&lsinfo->ls_refcnt)) {
576 if (lsinfo->ls_lockspace) {
577 if (test_bit(LS_FLAG_AUTOFREE, &lsinfo->ls_flags)) {
578 unregister_lockspace(lsinfo, 1);
581 kfree(lsinfo->ls_miscinfo.name);
588 /* Restore signals */
589 sigprocmask(SIG_SETMASK, &tmpsig, NULL);
595 static int do_user_create_lockspace(struct file_info *fi, uint8_t cmd,
596 struct dlm_lspace_params *kparams)
599 struct user_ls *lsinfo;
601 if (!capable(CAP_SYS_ADMIN))
604 status = register_lockspace(kparams->name, &lsinfo, kparams->flags);
606 /* If it succeeded then return the minor number */
608 status = lsinfo->ls_miscinfo.minor;
613 static int do_user_remove_lockspace(struct file_info *fi, uint8_t cmd,
614 struct dlm_lspace_params *kparams)
618 struct user_ls *lsinfo;
620 if (!capable(CAP_SYS_ADMIN))
624 lsinfo = __find_lockspace(kparams->minor);
630 if (kparams->flags & DLM_USER_LSFLG_FORCEFREE)
633 status = unregister_lockspace(lsinfo, force);
639 /* Read call, might block if no ASTs are waiting.
640 * It will only ever return one message at a time, regardless
641 * of how many are pending.
643 static ssize_t dlm_read(struct file *file, char __user *buffer, size_t count,
646 struct file_info *fi = file->private_data;
647 struct ast_info *ast;
650 DECLARE_WAITQUEUE(wait, current);
652 if (count < sizeof(struct dlm_lock_result))
655 spin_lock(&fi->fi_ast_lock);
656 if (list_empty(&fi->fi_ast_list)) {
659 * Return EOF if the lockspace been deleted.
661 if (test_bit(LS_FLAG_DELETED, &fi->fi_ls->ls_flags))
664 if (file->f_flags & O_NONBLOCK) {
665 spin_unlock(&fi->fi_ast_lock);
669 add_wait_queue(&fi->fi_wait, &wait);
672 set_current_state(TASK_INTERRUPTIBLE);
673 if (list_empty(&fi->fi_ast_list) &&
674 !signal_pending(current)) {
676 spin_unlock(&fi->fi_ast_lock);
678 spin_lock(&fi->fi_ast_lock);
682 current->state = TASK_RUNNING;
683 remove_wait_queue(&fi->fi_wait, &wait);
685 if (signal_pending(current)) {
686 spin_unlock(&fi->fi_ast_lock);
691 ast = list_entry(fi->fi_ast_list.next, struct ast_info, list);
692 list_del(&ast->list);
693 spin_unlock(&fi->fi_ast_lock);
695 /* Work out the size of the returned data */
696 data_size = sizeof(struct dlm_lock_result);
697 if (ast->lvb_updated && ast->result.lksb.sb_lvbptr)
698 data_size += DLM_USER_LVB_LEN;
700 offset = sizeof(struct dlm_lock_result);
702 /* Room for the extended data ? */
703 if (count >= data_size) {
705 if (ast->lvb_updated && ast->result.lksb.sb_lvbptr) {
706 if (copy_to_user(buffer+offset,
707 ast->result.lksb.sb_lvbptr,
710 ast->result.lvb_offset = offset;
711 offset += DLM_USER_LVB_LEN;
715 ast->result.length = data_size;
716 /* Copy the header now it has all the offsets in it */
717 if (copy_to_user(buffer, &ast->result, sizeof(struct dlm_lock_result)))
720 /* If we only returned a header and there's more to come then put it
722 if (count < data_size) {
723 spin_lock(&fi->fi_ast_lock);
724 list_add(&ast->list, &fi->fi_ast_list);
725 spin_unlock(&fi->fi_ast_lock);
731 static unsigned int dlm_poll(struct file *file, poll_table *wait)
733 struct file_info *fi = file->private_data;
735 poll_wait(file, &fi->fi_wait, wait);
737 spin_lock(&fi->fi_ast_lock);
738 if (!list_empty(&fi->fi_ast_list)) {
739 spin_unlock(&fi->fi_ast_lock);
740 return POLLIN | POLLRDNORM;
743 spin_unlock(&fi->fi_ast_lock);
747 static struct lock_info *allocate_lockinfo(struct file_info *fi, uint8_t cmd,
748 struct dlm_lock_params *kparams)
750 struct lock_info *li;
752 if (!try_module_get(THIS_MODULE))
755 li = kmalloc(sizeof(struct lock_info), GFP_KERNEL);
757 li->li_magic = LOCKINFO_MAGIC;
763 li->li_pend_bastparam = NULL;
764 li->li_pend_bastaddr = NULL;
765 li->li_castaddr = NULL;
766 li->li_castparam = NULL;
767 li->li_lksb.sb_lvbptr = NULL;
768 li->li_bastaddr = kparams->bastaddr;
769 li->li_bastparam = kparams->bastparam;
776 static int do_user_lock(struct file_info *fi, uint8_t cmd,
777 struct dlm_lock_params *kparams)
779 struct lock_info *li;
783 * Validate things that we need to have correct.
785 if (!kparams->castaddr)
791 /* Persistent child locks are not available yet */
792 if ((kparams->flags & DLM_LKF_PERSISTENT) && kparams->parent)
795 /* For conversions, there should already be a lockinfo struct,
796 unless we are adopting an orphaned persistent lock */
797 if (kparams->flags & DLM_LKF_CONVERT) {
799 li = get_lockinfo(kparams->lkid);
801 /* If this is a persistent lock we will have to create a
803 if (!li && DLM_LKF_PERSISTENT) {
804 li = allocate_lockinfo(fi, cmd, kparams);
806 li->li_lksb.sb_lkid = kparams->lkid;
807 li->li_castaddr = kparams->castaddr;
808 li->li_castparam = kparams->castparam;
810 /* OK, this isn;t exactly a FIRSTLOCK but it is the
811 first time we've used this lockinfo, and if things
812 fail we want rid of it */
813 init_MUTEX_LOCKED(&li->li_firstlock);
814 set_bit(LI_FLAG_FIRSTLOCK, &li->li_flags);
817 /* TODO: do a query to get the current state ?? */
822 if (li->li_magic != LOCKINFO_MAGIC)
825 /* For conversions don't overwrite the current blocking AST
827 a) if a blocking AST fires before the conversion is queued
828 it runs the current handler
829 b) if the conversion is cancelled, the original blocking AST
830 declaration is active
831 The pend_ info is made active when the conversion
834 li->li_pend_bastaddr = kparams->bastaddr;
835 li->li_pend_bastparam = kparams->bastparam;
837 li = allocate_lockinfo(fi, cmd, kparams);
841 /* semaphore to allow us to complete our work before
842 the AST routine runs. In fact we only need (and use) this
843 when the initial lock fails */
844 init_MUTEX_LOCKED(&li->li_firstlock);
845 set_bit(LI_FLAG_FIRSTLOCK, &li->li_flags);
848 li->li_user_lksb = kparams->lksb;
849 li->li_castaddr = kparams->castaddr;
850 li->li_castparam = kparams->castparam;
851 li->li_lksb.sb_lkid = kparams->lkid;
852 li->li_rqmode = kparams->mode;
853 if (kparams->flags & DLM_LKF_PERSISTENT)
854 set_bit(LI_FLAG_PERSISTENT, &li->li_flags);
856 /* Copy in the value block */
857 if (kparams->flags & DLM_LKF_VALBLK) {
858 if (!li->li_lksb.sb_lvbptr) {
859 li->li_lksb.sb_lvbptr = kmalloc(DLM_USER_LVB_LEN,
861 if (!li->li_lksb.sb_lvbptr) {
867 memcpy(li->li_lksb.sb_lvbptr, kparams->lvb, DLM_USER_LVB_LEN);
871 status = dlm_lock(fi->fi_ls->ls_lockspace,
872 kparams->mode, &li->li_lksb,
874 kparams->name, kparams->namelen,
878 (li->li_pend_bastaddr || li->li_bastaddr) ?
880 kparams->range.ra_end ? &kparams->range : NULL);
884 /* If it succeeded (this far) with a new lock then keep track of
885 it on the file's lockinfo list */
886 if (!status && test_bit(LI_FLAG_FIRSTLOCK, &li->li_flags)) {
888 spin_lock(&fi->fi_li_lock);
889 list_add(&li->li_ownerqueue, &fi->fi_li_list);
890 spin_unlock(&fi->fi_li_lock);
891 if (add_lockinfo(li))
892 printk(KERN_WARNING "Add lockinfo failed\n");
894 up(&li->li_firstlock);
897 /* Return the lockid as the user needs it /now/ */
898 return li->li_lksb.sb_lkid;
901 if (test_bit(LI_FLAG_FIRSTLOCK, &li->li_flags))
902 release_lockinfo(li);
907 static int do_user_unlock(struct file_info *fi, uint8_t cmd,
908 struct dlm_lock_params *kparams)
910 struct lock_info *li;
912 int convert_cancel = 0;
914 li = get_lockinfo(kparams->lkid);
916 li = allocate_lockinfo(fi, cmd, kparams);
917 spin_lock(&fi->fi_li_lock);
918 list_add(&li->li_ownerqueue, &fi->fi_li_list);
919 spin_unlock(&fi->fi_li_lock);
924 if (li->li_magic != LOCKINFO_MAGIC)
927 li->li_user_lksb = kparams->lksb;
928 li->li_castparam = kparams->castparam;
931 /* Cancelling a conversion doesn't remove the lock...*/
932 if (kparams->flags & DLM_LKF_CANCEL && li->li_grmode != -1)
935 /* dlm_unlock() passes a 0 for castaddr which means don't overwrite
936 the existing li_castaddr as that's the completion routine for
937 unlocks. dlm_unlock_wait() specifies a new AST routine to be
938 executed when the unlock completes. */
939 if (kparams->castaddr)
940 li->li_castaddr = kparams->castaddr;
942 /* Use existing lksb & astparams */
943 status = dlm_unlock(fi->fi_ls->ls_lockspace,
945 kparams->flags, &li->li_lksb, li);
947 if (!status && !convert_cancel) {
948 spin_lock(&fi->fi_li_lock);
949 list_del(&li->li_ownerqueue);
950 spin_unlock(&fi->fi_li_lock);
956 /* Write call, submit a locking request */
957 static ssize_t dlm_write(struct file *file, const char __user *buffer,
958 size_t count, loff_t *ppos)
960 struct file_info *fi = file->private_data;
961 struct dlm_write_request *kparams;
966 /* -1 because lock name is optional */
967 if (count < sizeof(struct dlm_write_request)-1)
970 /* Has the lockspace been deleted */
971 if (fi && test_bit(LS_FLAG_DELETED, &fi->fi_ls->ls_flags))
974 kparams = kmalloc(count, GFP_KERNEL);
979 /* Get the command info */
980 if (copy_from_user(kparams, buffer, count))
984 if (check_version(kparams))
987 /* Block signals while we are doing this */
988 sigfillset(&allsigs);
989 sigprocmask(SIG_BLOCK, &allsigs, &tmpsig);
992 switch (kparams->cmd)
995 if (!fi) goto out_sig;
996 status = do_user_lock(fi, kparams->cmd, &kparams->i.lock);
999 case DLM_USER_UNLOCK:
1000 if (!fi) goto out_sig;
1001 status = do_user_unlock(fi, kparams->cmd, &kparams->i.lock);
1004 case DLM_USER_CREATE_LOCKSPACE:
1005 if (fi) goto out_sig;
1006 status = do_user_create_lockspace(fi, kparams->cmd,
1007 &kparams->i.lspace);
1010 case DLM_USER_REMOVE_LOCKSPACE:
1011 if (fi) goto out_sig;
1012 status = do_user_remove_lockspace(fi, kparams->cmd,
1013 &kparams->i.lspace);
1016 printk("Unknown command passed to DLM device : %d\n",
1022 /* Restore signals */
1023 sigprocmask(SIG_SETMASK, &tmpsig, NULL);
1024 recalc_sigpending();
1034 static struct file_operations _dlm_fops = {
1036 .release = dlm_close,
1040 .owner = THIS_MODULE,
1043 static struct file_operations _dlm_ctl_fops = {
1044 .open = dlm_ctl_open,
1045 .release = dlm_ctl_close,
1047 .owner = THIS_MODULE,
1051 * Create control device
1053 static int __init dlm_device_init(void)
1057 INIT_LIST_HEAD(&user_ls_list);
1058 init_MUTEX(&user_ls_lock);
1059 rwlock_init(&lockinfo_lock);
1061 ctl_device.name = "dlm-control";
1062 ctl_device.fops = &_dlm_ctl_fops;
1063 ctl_device.minor = MISC_DYNAMIC_MINOR;
1065 r = misc_register(&ctl_device);
1067 printk(KERN_ERR "dlm: misc_register failed for control dev\n");
1074 static void __exit dlm_device_exit(void)
1076 misc_deregister(&ctl_device);
1079 MODULE_DESCRIPTION("Distributed Lock Manager device interface");
1080 MODULE_AUTHOR("Red Hat, Inc.");
1081 MODULE_LICENSE("GPL");
1083 module_init(dlm_device_init);
1084 module_exit(dlm_device_exit);