1 /******************************************************************************
2 *******************************************************************************
4 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5 ** Copyright (C) 2004-2007 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 ******************************************************************************/
14 #include "dlm_internal.h"
15 #include "lockspace.h"
25 #include "requestqueue.h"
27 #ifdef CONFIG_DLM_DEBUG
28 int dlm_create_debug_file(struct dlm_ls *ls);
29 void dlm_delete_debug_file(struct dlm_ls *ls);
31 static inline int dlm_create_debug_file(struct dlm_ls *ls) { return 0; }
32 static inline void dlm_delete_debug_file(struct dlm_ls *ls) { }
36 static struct mutex ls_lock;
37 static struct list_head lslist;
38 static spinlock_t lslist_lock;
39 static struct task_struct * scand_task;
42 static ssize_t dlm_control_store(struct dlm_ls *ls, const char *buf, size_t len)
45 int n = simple_strtol(buf, NULL, 0);
47 ls = dlm_find_lockspace_local(ls->ls_local_handle);
61 dlm_put_lockspace(ls);
65 static ssize_t dlm_event_store(struct dlm_ls *ls, const char *buf, size_t len)
67 ls->ls_uevent_result = simple_strtol(buf, NULL, 0);
68 set_bit(LSFL_UEVENT_WAIT, &ls->ls_flags);
69 wake_up(&ls->ls_uevent_wait);
73 static ssize_t dlm_id_show(struct dlm_ls *ls, char *buf)
75 return snprintf(buf, PAGE_SIZE, "%u\n", ls->ls_global_id);
78 static ssize_t dlm_id_store(struct dlm_ls *ls, const char *buf, size_t len)
80 ls->ls_global_id = simple_strtoul(buf, NULL, 0);
84 static ssize_t dlm_recover_status_show(struct dlm_ls *ls, char *buf)
86 uint32_t status = dlm_recover_status(ls);
87 return snprintf(buf, PAGE_SIZE, "%x\n", status);
90 static ssize_t dlm_recover_nodeid_show(struct dlm_ls *ls, char *buf)
92 return snprintf(buf, PAGE_SIZE, "%d\n", ls->ls_recover_nodeid);
96 struct attribute attr;
97 ssize_t (*show)(struct dlm_ls *, char *);
98 ssize_t (*store)(struct dlm_ls *, const char *, size_t);
101 static struct dlm_attr dlm_attr_control = {
102 .attr = {.name = "control", .mode = S_IWUSR},
103 .store = dlm_control_store
106 static struct dlm_attr dlm_attr_event = {
107 .attr = {.name = "event_done", .mode = S_IWUSR},
108 .store = dlm_event_store
111 static struct dlm_attr dlm_attr_id = {
112 .attr = {.name = "id", .mode = S_IRUGO | S_IWUSR},
114 .store = dlm_id_store
117 static struct dlm_attr dlm_attr_recover_status = {
118 .attr = {.name = "recover_status", .mode = S_IRUGO},
119 .show = dlm_recover_status_show
122 static struct dlm_attr dlm_attr_recover_nodeid = {
123 .attr = {.name = "recover_nodeid", .mode = S_IRUGO},
124 .show = dlm_recover_nodeid_show
127 static struct attribute *dlm_attrs[] = {
128 &dlm_attr_control.attr,
129 &dlm_attr_event.attr,
131 &dlm_attr_recover_status.attr,
132 &dlm_attr_recover_nodeid.attr,
136 static ssize_t dlm_attr_show(struct kobject *kobj, struct attribute *attr,
139 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
140 struct dlm_attr *a = container_of(attr, struct dlm_attr, attr);
141 return a->show ? a->show(ls, buf) : 0;
144 static ssize_t dlm_attr_store(struct kobject *kobj, struct attribute *attr,
145 const char *buf, size_t len)
147 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
148 struct dlm_attr *a = container_of(attr, struct dlm_attr, attr);
149 return a->store ? a->store(ls, buf, len) : len;
152 static void lockspace_kobj_release(struct kobject *k)
154 struct dlm_ls *ls = container_of(k, struct dlm_ls, ls_kobj);
158 static struct sysfs_ops dlm_attr_ops = {
159 .show = dlm_attr_show,
160 .store = dlm_attr_store,
163 static struct kobj_type dlm_ktype = {
164 .default_attrs = dlm_attrs,
165 .sysfs_ops = &dlm_attr_ops,
166 .release = lockspace_kobj_release,
169 static struct kset dlm_kset = {
170 .kobj = {.name = "dlm",},
174 static int kobject_setup(struct dlm_ls *ls)
176 char lsname[DLM_LOCKSPACE_LEN];
179 memset(lsname, 0, DLM_LOCKSPACE_LEN);
180 snprintf(lsname, DLM_LOCKSPACE_LEN, "%s", ls->ls_name);
182 error = kobject_set_name(&ls->ls_kobj, "%s", lsname);
186 ls->ls_kobj.kset = &dlm_kset;
187 ls->ls_kobj.ktype = &dlm_ktype;
191 static int do_uevent(struct dlm_ls *ls, int in)
196 kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
198 kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
200 error = wait_event_interruptible(ls->ls_uevent_wait,
201 test_and_clear_bit(LSFL_UEVENT_WAIT, &ls->ls_flags));
205 error = ls->ls_uevent_result;
211 int dlm_lockspace_init(void)
216 mutex_init(&ls_lock);
217 INIT_LIST_HEAD(&lslist);
218 spin_lock_init(&lslist_lock);
220 kobj_set_kset_s(&dlm_kset, kernel_subsys);
221 error = kset_register(&dlm_kset);
223 printk("dlm_lockspace_init: cannot register kset %d\n", error);
227 void dlm_lockspace_exit(void)
229 kset_unregister(&dlm_kset);
232 static int dlm_scand(void *data)
236 while (!kthread_should_stop()) {
237 list_for_each_entry(ls, &lslist, ls_list) {
238 if (dlm_lock_recovery_try(ls)) {
240 dlm_scan_timeout(ls);
241 dlm_unlock_recovery(ls);
244 schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
249 static int dlm_scand_start(void)
251 struct task_struct *p;
254 p = kthread_run(dlm_scand, NULL, "dlm_scand");
262 static void dlm_scand_stop(void)
264 kthread_stop(scand_task);
267 static struct dlm_ls *dlm_find_lockspace_name(char *name, int namelen)
271 spin_lock(&lslist_lock);
273 list_for_each_entry(ls, &lslist, ls_list) {
274 if (ls->ls_namelen == namelen &&
275 memcmp(ls->ls_name, name, namelen) == 0)
280 spin_unlock(&lslist_lock);
284 struct dlm_ls *dlm_find_lockspace_global(uint32_t id)
288 spin_lock(&lslist_lock);
290 list_for_each_entry(ls, &lslist, ls_list) {
291 if (ls->ls_global_id == id) {
298 spin_unlock(&lslist_lock);
302 struct dlm_ls *dlm_find_lockspace_local(dlm_lockspace_t *lockspace)
306 spin_lock(&lslist_lock);
307 list_for_each_entry(ls, &lslist, ls_list) {
308 if (ls->ls_local_handle == lockspace) {
315 spin_unlock(&lslist_lock);
319 struct dlm_ls *dlm_find_lockspace_device(int minor)
323 spin_lock(&lslist_lock);
324 list_for_each_entry(ls, &lslist, ls_list) {
325 if (ls->ls_device.minor == minor) {
332 spin_unlock(&lslist_lock);
336 void dlm_put_lockspace(struct dlm_ls *ls)
338 spin_lock(&lslist_lock);
340 spin_unlock(&lslist_lock);
343 static void remove_lockspace(struct dlm_ls *ls)
346 spin_lock(&lslist_lock);
347 if (ls->ls_count == 0) {
348 list_del(&ls->ls_list);
349 spin_unlock(&lslist_lock);
352 spin_unlock(&lslist_lock);
357 static int threads_start(void)
361 /* Thread which process lock requests for all lockspace's */
362 error = dlm_astd_start();
364 log_print("cannot start dlm_astd thread %d", error);
368 error = dlm_scand_start();
370 log_print("cannot start dlm_scand thread %d", error);
374 /* Thread for sending/receiving messages for all lockspace's */
375 error = dlm_lowcomms_start();
377 log_print("cannot start dlm lowcomms %d", error);
391 static void threads_stop(void)
398 static int new_lockspace(char *name, int namelen, void **lockspace,
399 uint32_t flags, int lvblen)
402 int i, size, error = -ENOMEM;
405 if (namelen > DLM_LOCKSPACE_LEN)
408 if (!lvblen || (lvblen % 8))
411 if (!try_module_get(THIS_MODULE))
414 ls = dlm_find_lockspace_name(name, namelen);
417 module_put(THIS_MODULE);
421 ls = kzalloc(sizeof(struct dlm_ls) + namelen, GFP_KERNEL);
424 memcpy(ls->ls_name, name, namelen);
425 ls->ls_namelen = namelen;
426 ls->ls_lvblen = lvblen;
430 /* ls_exflags are forced to match among nodes, and we don't
431 need to require all nodes to have TIMEWARN active */
432 if (flags & DLM_LSFL_TIMEWARN)
433 set_bit(LSFL_TIMEWARN, &ls->ls_flags);
434 ls->ls_exflags = (flags & ~DLM_LSFL_TIMEWARN);
436 size = dlm_config.ci_rsbtbl_size;
437 ls->ls_rsbtbl_size = size;
439 ls->ls_rsbtbl = kmalloc(sizeof(struct dlm_rsbtable) * size, GFP_KERNEL);
442 for (i = 0; i < size; i++) {
443 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list);
444 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss);
445 rwlock_init(&ls->ls_rsbtbl[i].lock);
448 size = dlm_config.ci_lkbtbl_size;
449 ls->ls_lkbtbl_size = size;
451 ls->ls_lkbtbl = kmalloc(sizeof(struct dlm_lkbtable) * size, GFP_KERNEL);
454 for (i = 0; i < size; i++) {
455 INIT_LIST_HEAD(&ls->ls_lkbtbl[i].list);
456 rwlock_init(&ls->ls_lkbtbl[i].lock);
457 ls->ls_lkbtbl[i].counter = 1;
460 size = dlm_config.ci_dirtbl_size;
461 ls->ls_dirtbl_size = size;
463 ls->ls_dirtbl = kmalloc(sizeof(struct dlm_dirtable) * size, GFP_KERNEL);
466 for (i = 0; i < size; i++) {
467 INIT_LIST_HEAD(&ls->ls_dirtbl[i].list);
468 rwlock_init(&ls->ls_dirtbl[i].lock);
471 INIT_LIST_HEAD(&ls->ls_waiters);
472 mutex_init(&ls->ls_waiters_mutex);
473 INIT_LIST_HEAD(&ls->ls_orphans);
474 mutex_init(&ls->ls_orphans_mutex);
475 INIT_LIST_HEAD(&ls->ls_timeout);
476 mutex_init(&ls->ls_timeout_mutex);
478 INIT_LIST_HEAD(&ls->ls_nodes);
479 INIT_LIST_HEAD(&ls->ls_nodes_gone);
480 ls->ls_num_nodes = 0;
481 ls->ls_low_nodeid = 0;
482 ls->ls_total_weight = 0;
483 ls->ls_node_array = NULL;
485 memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
486 ls->ls_stub_rsb.res_ls = ls;
488 ls->ls_debug_rsb_dentry = NULL;
489 ls->ls_debug_waiters_dentry = NULL;
491 init_waitqueue_head(&ls->ls_uevent_wait);
492 ls->ls_uevent_result = 0;
494 ls->ls_recoverd_task = NULL;
495 mutex_init(&ls->ls_recoverd_active);
496 spin_lock_init(&ls->ls_recover_lock);
497 spin_lock_init(&ls->ls_rcom_spin);
498 get_random_bytes(&ls->ls_rcom_seq, sizeof(uint64_t));
499 ls->ls_recover_status = 0;
500 ls->ls_recover_seq = 0;
501 ls->ls_recover_args = NULL;
502 init_rwsem(&ls->ls_in_recovery);
503 INIT_LIST_HEAD(&ls->ls_requestqueue);
504 mutex_init(&ls->ls_requestqueue_mutex);
505 mutex_init(&ls->ls_clear_proc_locks);
507 ls->ls_recover_buf = kmalloc(dlm_config.ci_buffer_size, GFP_KERNEL);
508 if (!ls->ls_recover_buf)
511 INIT_LIST_HEAD(&ls->ls_recover_list);
512 spin_lock_init(&ls->ls_recover_list_lock);
513 ls->ls_recover_list_count = 0;
514 ls->ls_local_handle = ls;
515 init_waitqueue_head(&ls->ls_wait_general);
516 INIT_LIST_HEAD(&ls->ls_root_list);
517 init_rwsem(&ls->ls_root_sem);
519 down_write(&ls->ls_in_recovery);
521 spin_lock(&lslist_lock);
522 list_add(&ls->ls_list, &lslist);
523 spin_unlock(&lslist_lock);
525 /* needs to find ls in lslist */
526 error = dlm_recoverd_start(ls);
528 log_error(ls, "can't start dlm_recoverd %d", error);
532 error = kobject_setup(ls);
536 error = kobject_register(&ls->ls_kobj);
540 /* let kobject handle freeing of ls if there's an error */
543 error = do_uevent(ls, 1);
547 dlm_create_debug_file(ls);
549 log_debug(ls, "join complete");
555 dlm_recoverd_stop(ls);
557 spin_lock(&lslist_lock);
558 list_del(&ls->ls_list);
559 spin_unlock(&lslist_lock);
560 kfree(ls->ls_recover_buf);
562 kfree(ls->ls_dirtbl);
564 kfree(ls->ls_lkbtbl);
566 kfree(ls->ls_rsbtbl);
569 kobject_unregister(&ls->ls_kobj);
573 module_put(THIS_MODULE);
577 int dlm_new_lockspace(char *name, int namelen, void **lockspace,
578 uint32_t flags, int lvblen)
582 mutex_lock(&ls_lock);
584 error = threads_start();
588 error = new_lockspace(name, namelen, lockspace, flags, lvblen);
592 mutex_unlock(&ls_lock);
596 /* Return 1 if the lockspace still has active remote locks,
597 * 2 if the lockspace still has active local locks.
599 static int lockspace_busy(struct dlm_ls *ls)
601 int i, lkb_found = 0;
604 /* NOTE: We check the lockidtbl here rather than the resource table.
605 This is because there may be LKBs queued as ASTs that have been
606 unlinked from their RSBs and are pending deletion once the AST has
609 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
610 read_lock(&ls->ls_lkbtbl[i].lock);
611 if (!list_empty(&ls->ls_lkbtbl[i].list)) {
613 list_for_each_entry(lkb, &ls->ls_lkbtbl[i].list,
615 if (!lkb->lkb_nodeid) {
616 read_unlock(&ls->ls_lkbtbl[i].lock);
621 read_unlock(&ls->ls_lkbtbl[i].lock);
626 static int release_lockspace(struct dlm_ls *ls, int force)
630 struct list_head *head;
632 int busy = lockspace_busy(ls);
640 dlm_recoverd_stop(ls);
642 remove_lockspace(ls);
644 dlm_delete_debug_file(ls);
648 kfree(ls->ls_recover_buf);
651 * Free direntry structs.
655 kfree(ls->ls_dirtbl);
658 * Free all lkb's on lkbtbl[] lists.
661 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
662 head = &ls->ls_lkbtbl[i].list;
663 while (!list_empty(head)) {
664 lkb = list_entry(head->next, struct dlm_lkb,
667 list_del(&lkb->lkb_idtbl_list);
671 if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
672 free_lvb(lkb->lkb_lvbptr);
679 kfree(ls->ls_lkbtbl);
682 * Free all rsb's on rsbtbl[] lists
685 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
686 head = &ls->ls_rsbtbl[i].list;
687 while (!list_empty(head)) {
688 rsb = list_entry(head->next, struct dlm_rsb,
691 list_del(&rsb->res_hashchain);
695 head = &ls->ls_rsbtbl[i].toss;
696 while (!list_empty(head)) {
697 rsb = list_entry(head->next, struct dlm_rsb,
699 list_del(&rsb->res_hashchain);
704 kfree(ls->ls_rsbtbl);
707 * Free structures on any other lists
710 dlm_purge_requestqueue(ls);
711 kfree(ls->ls_recover_args);
712 dlm_clear_free_entries(ls);
713 dlm_clear_members(ls);
714 dlm_clear_members_gone(ls);
715 kfree(ls->ls_node_array);
716 kobject_unregister(&ls->ls_kobj);
717 /* The ls structure will be freed when the kobject is done with */
719 mutex_lock(&ls_lock);
723 mutex_unlock(&ls_lock);
725 module_put(THIS_MODULE);
730 * Called when a system has released all its locks and is not going to use the
731 * lockspace any longer. We free everything we're managing for this lockspace.
732 * Remaining nodes will go through the recovery process as if we'd died. The
733 * lockspace must continue to function as usual, participating in recoveries,
734 * until this returns.
736 * Force has 4 possible values:
737 * 0 - don't destroy locksapce if it has any LKBs
738 * 1 - destroy lockspace if it has remote LKBs but not if it has local LKBs
739 * 2 - destroy lockspace regardless of LKBs
740 * 3 - destroy lockspace as part of a forced shutdown
743 int dlm_release_lockspace(void *lockspace, int force)
747 ls = dlm_find_lockspace_local(lockspace);
750 dlm_put_lockspace(ls);
751 return release_lockspace(ls, force);