Lines Matching +full:device +full:- +full:version
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2006-2010 Red Hat, Inc. All rights reserved.
56 __u32 version[3]; member
76 __u32 version[3]; member
92 kb->version[0] = kb32->version[0]; in compat_input()
93 kb->version[1] = kb32->version[1]; in compat_input()
94 kb->version[2] = kb32->version[2]; in compat_input()
96 kb->cmd = kb32->cmd; in compat_input()
97 kb->is64bit = kb32->is64bit; in compat_input()
98 if (kb->cmd == DLM_USER_CREATE_LOCKSPACE || in compat_input()
99 kb->cmd == DLM_USER_REMOVE_LOCKSPACE) { in compat_input()
100 kb->i.lspace.flags = kb32->i.lspace.flags; in compat_input()
101 kb->i.lspace.minor = kb32->i.lspace.minor; in compat_input()
102 memcpy(kb->i.lspace.name, kb32->i.lspace.name, namelen); in compat_input()
103 } else if (kb->cmd == DLM_USER_PURGE) { in compat_input()
104 kb->i.purge.nodeid = kb32->i.purge.nodeid; in compat_input()
105 kb->i.purge.pid = kb32->i.purge.pid; in compat_input()
107 kb->i.lock.mode = kb32->i.lock.mode; in compat_input()
108 kb->i.lock.namelen = kb32->i.lock.namelen; in compat_input()
109 kb->i.lock.flags = kb32->i.lock.flags; in compat_input()
110 kb->i.lock.lkid = kb32->i.lock.lkid; in compat_input()
111 kb->i.lock.parent = kb32->i.lock.parent; in compat_input()
112 kb->i.lock.xid = kb32->i.lock.xid; in compat_input()
113 kb->i.lock.timeout = kb32->i.lock.timeout; in compat_input()
114 kb->i.lock.castparam = (__user void *)(long)kb32->i.lock.castparam; in compat_input()
115 kb->i.lock.castaddr = (__user void *)(long)kb32->i.lock.castaddr; in compat_input()
116 kb->i.lock.bastparam = (__user void *)(long)kb32->i.lock.bastparam; in compat_input()
117 kb->i.lock.bastaddr = (__user void *)(long)kb32->i.lock.bastaddr; in compat_input()
118 kb->i.lock.lksb = (__user void *)(long)kb32->i.lock.lksb; in compat_input()
119 memcpy(kb->i.lock.lvb, kb32->i.lock.lvb, DLM_USER_LVB_LEN); in compat_input()
120 memcpy(kb->i.lock.name, kb32->i.lock.name, namelen); in compat_input()
129 res32->version[0] = res->version[0]; in compat_output()
130 res32->version[1] = res->version[1]; in compat_output()
131 res32->version[2] = res->version[2]; in compat_output()
133 res32->user_astaddr = (__u32)(__force long)res->user_astaddr; in compat_output()
134 res32->user_astparam = (__u32)(__force long)res->user_astparam; in compat_output()
135 res32->user_lksb = (__u32)(__force long)res->user_lksb; in compat_output()
136 res32->bast_mode = res->bast_mode; in compat_output()
138 res32->lvb_offset = res->lvb_offset; in compat_output()
139 res32->length = res->length; in compat_output()
141 res32->lksb.sb_status = res->lksb.sb_status; in compat_output()
142 res32->lksb.sb_flags = res->lksb.sb_flags; in compat_output()
143 res32->lksb.sb_lkid = res->lksb.sb_lkid; in compat_output()
144 res32->lksb.sb_lvbptr = (__u32)(long)res->lksb.sb_lvbptr; in compat_output()
162 case -DLM_EUNLOCK: in lkb_is_endoflife()
164 case -DLM_ECANCEL: in lkb_is_endoflife()
165 case -ETIMEDOUT: in lkb_is_endoflife()
166 case -EDEADLK: in lkb_is_endoflife()
167 case -EAGAIN: in lkb_is_endoflife()
187 if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) || in dlm_user_add_ast()
188 test_bit(DLM_IFL_DEAD_BIT, &lkb->lkb_iflags)) in dlm_user_add_ast()
191 ls = lkb->lkb_resource->res_ls; in dlm_user_add_ast()
192 spin_lock_bh(&ls->ls_clear_proc_locks); in dlm_user_add_ast()
196 lkb->ua so we can't try to use it. This second check is necessary in dlm_user_add_ast()
200 if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) || in dlm_user_add_ast()
201 test_bit(DLM_IFL_DEAD_BIT, &lkb->lkb_iflags)) in dlm_user_add_ast()
204 DLM_ASSERT(lkb->lkb_ua, dlm_print_lkb(lkb);); in dlm_user_add_ast()
205 ua = lkb->lkb_ua; in dlm_user_add_ast()
206 proc = ua->proc; in dlm_user_add_ast()
208 if ((flags & DLM_CB_BAST) && ua->bastaddr == NULL) in dlm_user_add_ast()
212 set_bit(DLM_IFL_ENDOFLIFE_BIT, &lkb->lkb_iflags); in dlm_user_add_ast()
214 spin_lock_bh(&proc->asts_spin); in dlm_user_add_ast()
220 cb->copy_lvb = copy_lvb; in dlm_user_add_ast()
221 cb->ua = *ua; in dlm_user_add_ast()
222 cb->lkb_lksb = &cb->ua.lksb; in dlm_user_add_ast()
224 memcpy(cb->lvbptr, ua->lksb.sb_lvbptr, in dlm_user_add_ast()
226 cb->lkb_lksb->sb_lvbptr = cb->lvbptr; in dlm_user_add_ast()
229 list_add_tail(&cb->list, &proc->asts); in dlm_user_add_ast()
230 wake_up_interruptible(&proc->wait); in dlm_user_add_ast()
233 spin_unlock_bh(&proc->asts_spin); in dlm_user_add_ast()
235 if (test_bit(DLM_IFL_ENDOFLIFE_BIT, &lkb->lkb_iflags)) { in dlm_user_add_ast()
237 spin_lock_bh(&proc->locks_spin); in dlm_user_add_ast()
238 if (!list_empty(&lkb->lkb_ownqueue)) { in dlm_user_add_ast()
239 list_del_init(&lkb->lkb_ownqueue); in dlm_user_add_ast()
242 spin_unlock_bh(&proc->locks_spin); in dlm_user_add_ast()
245 spin_unlock_bh(&ls->ls_clear_proc_locks); in dlm_user_add_ast()
254 int error = -ENOMEM; in device_user_lock()
256 ls = dlm_find_lockspace_local(proc->lockspace); in device_user_lock()
258 return -ENOENT; in device_user_lock()
260 if (!params->castaddr || !params->lksb) { in device_user_lock()
261 error = -EINVAL; in device_user_lock()
268 ua->proc = proc; in device_user_lock()
269 ua->user_lksb = params->lksb; in device_user_lock()
270 ua->castparam = params->castparam; in device_user_lock()
271 ua->castaddr = params->castaddr; in device_user_lock()
272 ua->bastparam = params->bastparam; in device_user_lock()
273 ua->bastaddr = params->bastaddr; in device_user_lock()
274 ua->xid = params->xid; in device_user_lock()
276 if (params->flags & DLM_LKF_CONVERT) { in device_user_lock()
278 params->mode, params->flags, in device_user_lock()
279 params->lkid, params->lvb); in device_user_lock()
280 } else if (params->flags & DLM_LKF_ORPHAN) { in device_user_lock()
282 params->mode, params->flags, in device_user_lock()
283 params->name, params->namelen, in device_user_lock()
289 params->mode, params->flags, in device_user_lock()
290 params->name, params->namelen); in device_user_lock()
292 error = ua->lksb.sb_lkid; in device_user_lock()
304 int error = -ENOMEM; in device_user_unlock()
306 ls = dlm_find_lockspace_local(proc->lockspace); in device_user_unlock()
308 return -ENOENT; in device_user_unlock()
313 ua->proc = proc; in device_user_unlock()
314 ua->user_lksb = params->lksb; in device_user_unlock()
315 ua->castparam = params->castparam; in device_user_unlock()
316 ua->castaddr = params->castaddr; in device_user_unlock()
318 if (params->flags & DLM_LKF_CANCEL) in device_user_unlock()
319 error = dlm_user_cancel(ls, ua, params->flags, params->lkid); in device_user_unlock()
321 error = dlm_user_unlock(ls, ua, params->flags, params->lkid, in device_user_unlock()
322 params->lvb); in device_user_unlock()
334 ls = dlm_find_lockspace_local(proc->lockspace); in device_user_deadlock()
336 return -ENOENT; in device_user_deadlock()
338 error = dlm_user_deadlock(ls, params->flags, params->lkid); in device_user_deadlock()
348 /* The device is already registered. This happens when the in dlm_device_register()
350 if (ls->ls_device.name) in dlm_device_register()
353 error = -ENOMEM; in dlm_device_register()
355 ls->ls_device.name = kzalloc(len, GFP_NOFS); in dlm_device_register()
356 if (!ls->ls_device.name) in dlm_device_register()
359 snprintf((char *)ls->ls_device.name, len, "%s_%s", name_prefix, in dlm_device_register()
361 ls->ls_device.fops = &device_fops; in dlm_device_register()
362 ls->ls_device.minor = MISC_DYNAMIC_MINOR; in dlm_device_register()
364 error = misc_register(&ls->ls_device); in dlm_device_register()
366 kfree(ls->ls_device.name); in dlm_device_register()
368 * to avoid a double-free in dlm_device_deregister in dlm_device_register()
370 ls->ls_device.name = NULL; in dlm_device_register()
378 /* The device is not registered. This happens when the lockspace in dlm_device_deregister()
381 if (!ls->ls_device.name) in dlm_device_deregister()
384 misc_deregister(&ls->ls_device); in dlm_device_deregister()
385 kfree(ls->ls_device.name); in dlm_device_deregister()
395 ls = dlm_find_lockspace_local(proc->lockspace); in device_user_purge()
397 return -ENOENT; in device_user_purge()
399 error = dlm_user_purge(ls, proc, params->nodeid, params->pid); in device_user_purge()
412 return -EPERM; in device_create_lockspace()
414 error = dlm_new_user_lockspace(params->name, dlm_config.ci_cluster_name, in device_create_lockspace()
415 params->flags, DLM_USER_LVB_LEN, NULL, in device_create_lockspace()
422 return -ENOENT; in device_create_lockspace()
424 error = dlm_device_register(ls, params->name); in device_create_lockspace()
430 error = ls->ls_device.minor; in device_create_lockspace()
442 return -EPERM; in device_remove_lockspace()
444 ls = dlm_find_lockspace_device(params->minor); in device_remove_lockspace()
446 return -ENOENT; in device_remove_lockspace()
448 if (params->flags & DLM_USER_LSFLG_FORCEFREE) in device_remove_lockspace()
455 zero, so all processes will need to close their device for the in device_remove_lockspace()
467 /* Check the user's version matches ours */
470 if (req->version[0] != DLM_DEVICE_VERSION_MAJOR || in check_version()
471 (req->version[0] == DLM_DEVICE_VERSION_MAJOR && in check_version()
472 req->version[1] > DLM_DEVICE_VERSION_MINOR)) { in check_version()
474 printk(KERN_DEBUG "dlm: process %s (%d) version mismatch " in check_version()
476 current->comm, in check_version()
478 req->version[0], in check_version()
479 req->version[1], in check_version()
480 req->version[2], in check_version()
484 return -EINVAL; in check_version()
493 * dlm_user_request -> request_lock
494 * dlm_user_convert -> convert_lock
497 * dlm_user_unlock -> unlock_lock
498 * dlm_user_cancel -> cancel_lock
507 /* a write to a lockspace device is a lock or unlock request, a write
508 to the control device is to create/remove a lockspace */
513 struct dlm_user_proc *proc = file->private_data; in device_write()
522 return -EINVAL; in device_write()
529 return -EINVAL; in device_write()
536 error = -EBADE; in device_write()
541 if (!kbuf->is64bit) { in device_write()
546 namelen = count - sizeof(struct dlm_write_request32); in device_write()
555 return -ENOMEM; in device_write()
559 set_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags); in device_write()
567 if ((kbuf->cmd == DLM_USER_LOCK || kbuf->cmd == DLM_USER_UNLOCK) && in device_write()
568 (proc && test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags))) { in device_write()
569 error = -EINVAL; in device_write()
573 error = -EINVAL; in device_write()
575 switch (kbuf->cmd) in device_write()
579 log_print("no locking on control device"); in device_write()
582 error = device_user_lock(proc, &kbuf->i.lock); in device_write()
587 log_print("no locking on control device"); in device_write()
590 error = device_user_unlock(proc, &kbuf->i.lock); in device_write()
595 log_print("no locking on control device"); in device_write()
598 error = device_user_deadlock(proc, &kbuf->i.lock); in device_write()
603 log_print("create/remove only on control device"); in device_write()
606 error = device_create_lockspace(&kbuf->i.lspace); in device_write()
611 log_print("create/remove only on control device"); in device_write()
614 error = device_remove_lockspace(&kbuf->i.lspace); in device_write()
619 log_print("no locking on control device"); in device_write()
622 error = device_user_purge(proc, &kbuf->i.purge); in device_write()
626 log_print("Unknown command passed to DLM device : %d\n", in device_write()
627 kbuf->cmd); in device_write()
635 /* Every process that opens the lockspace device has its own "proc" structure
646 return -ENOENT; in device_open()
651 return -ENOMEM; in device_open()
654 proc->lockspace = ls; in device_open()
655 INIT_LIST_HEAD(&proc->asts); in device_open()
656 INIT_LIST_HEAD(&proc->locks); in device_open()
657 INIT_LIST_HEAD(&proc->unlocking); in device_open()
658 spin_lock_init(&proc->asts_spin); in device_open()
659 spin_lock_init(&proc->locks_spin); in device_open()
660 init_waitqueue_head(&proc->wait); in device_open()
661 file->private_data = proc; in device_open()
668 struct dlm_user_proc *proc = file->private_data; in device_close()
671 ls = dlm_find_lockspace_local(proc->lockspace); in device_close()
673 return -ENOENT; in device_close()
675 set_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags); in device_close()
681 looking for lkb->ua->proc */ in device_close()
684 file->private_data = NULL; in device_close()
709 result.version[0] = DLM_DEVICE_VERSION_MAJOR; in copy_result_to_user()
710 result.version[1] = DLM_DEVICE_VERSION_MINOR; in copy_result_to_user()
711 result.version[2] = DLM_DEVICE_VERSION_PATCH; in copy_result_to_user()
712 memcpy(&result.lksb, &ua->lksb, offsetof(struct dlm_lksb, sb_lvbptr)); in copy_result_to_user()
713 result.user_lksb = ua->user_lksb; in copy_result_to_user()
722 result.user_astaddr = ua->bastaddr; in copy_result_to_user()
723 result.user_astparam = ua->bastparam; in copy_result_to_user()
726 result.user_astaddr = ua->castaddr; in copy_result_to_user()
727 result.user_astparam = ua->castparam; in copy_result_to_user()
741 if (copy_lvb && ua->lksb.sb_lvbptr && count >= len + DLM_USER_LVB_LEN) { in copy_result_to_user()
742 if (copy_to_user(buf+len, ua->lksb.sb_lvbptr, in copy_result_to_user()
744 error = -EFAULT; in copy_result_to_user()
762 error = -EFAULT; in copy_result_to_user()
774 ver.version[0] = DLM_DEVICE_VERSION_MAJOR; in copy_version_to_user()
775 ver.version[1] = DLM_DEVICE_VERSION_MINOR; in copy_version_to_user()
776 ver.version[2] = DLM_DEVICE_VERSION_PATCH; in copy_version_to_user()
779 return -EFAULT; in copy_version_to_user()
788 struct dlm_user_proc *proc = file->private_data; in device_read()
799 log_print("non-version read from control device %zu", count); in device_read()
800 return -EINVAL; in device_read()
808 return -EINVAL; in device_read()
811 if (test_bit(DLM_PROC_FLAGS_CLOSING, &proc->flags)) in device_read()
812 return -EINVAL; in device_read()
814 spin_lock_bh(&proc->asts_spin); in device_read()
815 if (list_empty(&proc->asts)) { in device_read()
816 if (file->f_flags & O_NONBLOCK) { in device_read()
817 spin_unlock_bh(&proc->asts_spin); in device_read()
818 return -EAGAIN; in device_read()
821 add_wait_queue(&proc->wait, &wait); in device_read()
825 if (list_empty(&proc->asts) && !signal_pending(current)) { in device_read()
826 spin_unlock_bh(&proc->asts_spin); in device_read()
828 spin_lock_bh(&proc->asts_spin); in device_read()
832 remove_wait_queue(&proc->wait, &wait); in device_read()
835 spin_unlock_bh(&proc->asts_spin); in device_read()
836 return -ERESTARTSYS; in device_read()
844 cb = list_first_entry(&proc->asts, struct dlm_callback, list); in device_read()
845 list_del(&cb->list); in device_read()
846 spin_unlock_bh(&proc->asts_spin); in device_read()
848 if (cb->flags & DLM_CB_BAST) { in device_read()
849 trace_dlm_bast(cb->ls_id, cb->lkb_id, cb->mode, cb->res_name, in device_read()
850 cb->res_length); in device_read()
851 } else if (cb->flags & DLM_CB_CAST) { in device_read()
852 cb->lkb_lksb->sb_status = cb->sb_status; in device_read()
853 cb->lkb_lksb->sb_flags = cb->sb_flags; in device_read()
854 trace_dlm_ast(cb->ls_id, cb->lkb_id, cb->sb_status, in device_read()
855 cb->sb_flags, cb->res_name, cb->res_length); in device_read()
858 ret = copy_result_to_user(&cb->ua, in device_read()
859 test_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags), in device_read()
860 cb->flags, cb->mode, cb->copy_lvb, buf, count); in device_read()
867 struct dlm_user_proc *proc = file->private_data; in device_poll()
869 poll_wait(file, &proc->wait, wait); in device_poll()
871 spin_lock_bh(&proc->asts_spin); in device_poll()
872 if (!list_empty(&proc->asts)) { in device_poll()
873 spin_unlock_bh(&proc->asts_spin); in device_poll()
876 spin_unlock_bh(&proc->asts_spin); in device_poll()
889 know about the monitor device. We assume that if the in dlm_user_daemon_available()
890 dlm_controld was started (above), but the monitor device in dlm_user_daemon_available()
891 was never opened, that it's an old version. dlm_controld in dlm_user_daemon_available()
892 should open the monitor device before populating configfs. */ in dlm_user_daemon_available()
902 file->private_data = NULL; in ctl_device_open()
945 .name = "dlm-control",
958 .name = "dlm-monitor",
971 log_print("misc_register failed for control device"); in dlm_user_init()
977 log_print("misc_register failed for monitor device"); in dlm_user_init()