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 ******************************************************************************/
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 .subsys = &kernel_subsys,
171 .kobj = {.name = "dlm",},
175 static int kobject_setup(struct dlm_ls *ls)
177 char lsname[DLM_LOCKSPACE_LEN];
180 memset(lsname, 0, DLM_LOCKSPACE_LEN);
181 snprintf(lsname, DLM_LOCKSPACE_LEN, "%s", ls->ls_name);
183 error = kobject_set_name(&ls->ls_kobj, "%s", lsname);
187 ls->ls_kobj.kset = &dlm_kset;
188 ls->ls_kobj.ktype = &dlm_ktype;
192 static int do_uevent(struct dlm_ls *ls, int in)
197 kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
199 kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
201 error = wait_event_interruptible(ls->ls_uevent_wait,
202 test_and_clear_bit(LSFL_UEVENT_WAIT, &ls->ls_flags));
206 error = ls->ls_uevent_result;
212 int dlm_lockspace_init(void)
217 mutex_init(&ls_lock);
218 INIT_LIST_HEAD(&lslist);
219 spin_lock_init(&lslist_lock);
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)
239 schedule_timeout_interruptible(dlm_config.scan_secs * HZ);
244 static int dlm_scand_start(void)
246 struct task_struct *p;
249 p = kthread_run(dlm_scand, NULL, "dlm_scand");
257 static void dlm_scand_stop(void)
259 kthread_stop(scand_task);
262 static struct dlm_ls *dlm_find_lockspace_name(char *name, int namelen)
266 spin_lock(&lslist_lock);
268 list_for_each_entry(ls, &lslist, ls_list) {
269 if (ls->ls_namelen == namelen &&
270 memcmp(ls->ls_name, name, namelen) == 0)
275 spin_unlock(&lslist_lock);
279 struct dlm_ls *dlm_find_lockspace_global(uint32_t id)
283 spin_lock(&lslist_lock);
285 list_for_each_entry(ls, &lslist, ls_list) {
286 if (ls->ls_global_id == id) {
293 spin_unlock(&lslist_lock);
297 struct dlm_ls *dlm_find_lockspace_local(dlm_lockspace_t *lockspace)
301 spin_lock(&lslist_lock);
302 list_for_each_entry(ls, &lslist, ls_list) {
303 if (ls->ls_local_handle == lockspace) {
310 spin_unlock(&lslist_lock);
314 struct dlm_ls *dlm_find_lockspace_device(int minor)
318 spin_lock(&lslist_lock);
319 list_for_each_entry(ls, &lslist, ls_list) {
320 if (ls->ls_device.minor == minor) {
327 spin_unlock(&lslist_lock);
331 void dlm_put_lockspace(struct dlm_ls *ls)
333 spin_lock(&lslist_lock);
335 spin_unlock(&lslist_lock);
338 static void remove_lockspace(struct dlm_ls *ls)
341 spin_lock(&lslist_lock);
342 if (ls->ls_count == 0) {
343 list_del(&ls->ls_list);
344 spin_unlock(&lslist_lock);
347 spin_unlock(&lslist_lock);
352 static int threads_start(void)
356 /* Thread which process lock requests for all lockspace's */
357 error = dlm_astd_start();
359 log_print("cannot start dlm_astd thread %d", error);
363 error = dlm_scand_start();
365 log_print("cannot start dlm_scand thread %d", error);
369 /* Thread for sending/receiving messages for all lockspace's */
370 error = dlm_lowcomms_start();
372 log_print("cannot start dlm lowcomms %d", error);
386 static void threads_stop(void)
393 static int new_lockspace(char *name, int namelen, void **lockspace,
394 uint32_t flags, int lvblen)
397 int i, size, error = -ENOMEM;
399 if (namelen > DLM_LOCKSPACE_LEN)
402 if (!lvblen || (lvblen % 8))
405 if (!try_module_get(THIS_MODULE))
408 ls = dlm_find_lockspace_name(name, namelen);
411 module_put(THIS_MODULE);
415 ls = kzalloc(sizeof(struct dlm_ls) + namelen, GFP_KERNEL);
418 memcpy(ls->ls_name, name, namelen);
419 ls->ls_namelen = namelen;
420 ls->ls_exflags = flags;
421 ls->ls_lvblen = lvblen;
425 size = dlm_config.rsbtbl_size;
426 ls->ls_rsbtbl_size = size;
428 ls->ls_rsbtbl = kmalloc(sizeof(struct dlm_rsbtable) * size, GFP_KERNEL);
431 for (i = 0; i < size; i++) {
432 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list);
433 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss);
434 rwlock_init(&ls->ls_rsbtbl[i].lock);
437 size = dlm_config.lkbtbl_size;
438 ls->ls_lkbtbl_size = size;
440 ls->ls_lkbtbl = kmalloc(sizeof(struct dlm_lkbtable) * size, GFP_KERNEL);
443 for (i = 0; i < size; i++) {
444 INIT_LIST_HEAD(&ls->ls_lkbtbl[i].list);
445 rwlock_init(&ls->ls_lkbtbl[i].lock);
446 ls->ls_lkbtbl[i].counter = 1;
449 size = dlm_config.dirtbl_size;
450 ls->ls_dirtbl_size = size;
452 ls->ls_dirtbl = kmalloc(sizeof(struct dlm_dirtable) * size, GFP_KERNEL);
455 for (i = 0; i < size; i++) {
456 INIT_LIST_HEAD(&ls->ls_dirtbl[i].list);
457 rwlock_init(&ls->ls_dirtbl[i].lock);
460 INIT_LIST_HEAD(&ls->ls_waiters);
461 mutex_init(&ls->ls_waiters_mutex);
463 INIT_LIST_HEAD(&ls->ls_nodes);
464 INIT_LIST_HEAD(&ls->ls_nodes_gone);
465 ls->ls_num_nodes = 0;
466 ls->ls_low_nodeid = 0;
467 ls->ls_total_weight = 0;
468 ls->ls_node_array = NULL;
470 memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
471 ls->ls_stub_rsb.res_ls = ls;
473 ls->ls_debug_rsb_dentry = NULL;
474 ls->ls_debug_waiters_dentry = NULL;
476 init_waitqueue_head(&ls->ls_uevent_wait);
477 ls->ls_uevent_result = 0;
479 ls->ls_recoverd_task = NULL;
480 mutex_init(&ls->ls_recoverd_active);
481 spin_lock_init(&ls->ls_recover_lock);
482 ls->ls_recover_status = 0;
483 ls->ls_recover_seq = 0;
484 ls->ls_recover_args = NULL;
485 init_rwsem(&ls->ls_in_recovery);
486 INIT_LIST_HEAD(&ls->ls_requestqueue);
487 mutex_init(&ls->ls_requestqueue_mutex);
488 mutex_init(&ls->ls_clear_proc_locks);
490 ls->ls_recover_buf = kmalloc(dlm_config.buffer_size, GFP_KERNEL);
491 if (!ls->ls_recover_buf)
494 INIT_LIST_HEAD(&ls->ls_recover_list);
495 spin_lock_init(&ls->ls_recover_list_lock);
496 ls->ls_recover_list_count = 0;
497 ls->ls_local_handle = ls;
498 init_waitqueue_head(&ls->ls_wait_general);
499 INIT_LIST_HEAD(&ls->ls_root_list);
500 init_rwsem(&ls->ls_root_sem);
502 down_write(&ls->ls_in_recovery);
504 spin_lock(&lslist_lock);
505 list_add(&ls->ls_list, &lslist);
506 spin_unlock(&lslist_lock);
508 /* needs to find ls in lslist */
509 error = dlm_recoverd_start(ls);
511 log_error(ls, "can't start dlm_recoverd %d", error);
515 dlm_create_debug_file(ls);
517 error = kobject_setup(ls);
521 error = kobject_register(&ls->ls_kobj);
525 error = do_uevent(ls, 1);
533 kobject_unregister(&ls->ls_kobj);
535 dlm_delete_debug_file(ls);
536 dlm_recoverd_stop(ls);
538 spin_lock(&lslist_lock);
539 list_del(&ls->ls_list);
540 spin_unlock(&lslist_lock);
541 kfree(ls->ls_recover_buf);
543 kfree(ls->ls_dirtbl);
545 kfree(ls->ls_lkbtbl);
547 kfree(ls->ls_rsbtbl);
551 module_put(THIS_MODULE);
555 int dlm_new_lockspace(char *name, int namelen, void **lockspace,
556 uint32_t flags, int lvblen)
560 mutex_lock(&ls_lock);
562 error = threads_start();
566 error = new_lockspace(name, namelen, lockspace, flags, lvblen);
570 mutex_unlock(&ls_lock);
574 /* Return 1 if the lockspace still has active remote locks,
575 * 2 if the lockspace still has active local locks.
577 static int lockspace_busy(struct dlm_ls *ls)
579 int i, lkb_found = 0;
582 /* NOTE: We check the lockidtbl here rather than the resource table.
583 This is because there may be LKBs queued as ASTs that have been
584 unlinked from their RSBs and are pending deletion once the AST has
587 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
588 read_lock(&ls->ls_lkbtbl[i].lock);
589 if (!list_empty(&ls->ls_lkbtbl[i].list)) {
591 list_for_each_entry(lkb, &ls->ls_lkbtbl[i].list,
593 if (!lkb->lkb_nodeid) {
594 read_unlock(&ls->ls_lkbtbl[i].lock);
599 read_unlock(&ls->ls_lkbtbl[i].lock);
604 static int release_lockspace(struct dlm_ls *ls, int force)
608 struct list_head *head;
610 int busy = lockspace_busy(ls);
618 dlm_recoverd_stop(ls);
620 remove_lockspace(ls);
622 dlm_delete_debug_file(ls);
626 kfree(ls->ls_recover_buf);
629 * Free direntry structs.
633 kfree(ls->ls_dirtbl);
636 * Free all lkb's on lkbtbl[] lists.
639 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
640 head = &ls->ls_lkbtbl[i].list;
641 while (!list_empty(head)) {
642 lkb = list_entry(head->next, struct dlm_lkb,
645 list_del(&lkb->lkb_idtbl_list);
649 if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
650 free_lvb(lkb->lkb_lvbptr);
657 kfree(ls->ls_lkbtbl);
660 * Free all rsb's on rsbtbl[] lists
663 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
664 head = &ls->ls_rsbtbl[i].list;
665 while (!list_empty(head)) {
666 rsb = list_entry(head->next, struct dlm_rsb,
669 list_del(&rsb->res_hashchain);
673 head = &ls->ls_rsbtbl[i].toss;
674 while (!list_empty(head)) {
675 rsb = list_entry(head->next, struct dlm_rsb,
677 list_del(&rsb->res_hashchain);
682 kfree(ls->ls_rsbtbl);
685 * Free structures on any other lists
688 dlm_purge_requestqueue(ls);
689 kfree(ls->ls_recover_args);
690 dlm_clear_free_entries(ls);
691 dlm_clear_members(ls);
692 dlm_clear_members_gone(ls);
693 kfree(ls->ls_node_array);
694 kobject_unregister(&ls->ls_kobj);
695 /* The ls structure will be freed when the kobject is done with */
697 mutex_lock(&ls_lock);
701 mutex_unlock(&ls_lock);
703 module_put(THIS_MODULE);
708 * Called when a system has released all its locks and is not going to use the
709 * lockspace any longer. We free everything we're managing for this lockspace.
710 * Remaining nodes will go through the recovery process as if we'd died. The
711 * lockspace must continue to function as usual, participating in recoveries,
712 * until this returns.
714 * Force has 4 possible values:
715 * 0 - don't destroy locksapce if it has any LKBs
716 * 1 - destroy lockspace if it has remote LKBs but not if it has local LKBs
717 * 2 - destroy lockspace regardless of LKBs
718 * 3 - destroy lockspace as part of a forced shutdown
721 int dlm_release_lockspace(void *lockspace, int force)
725 ls = dlm_find_lockspace_local(lockspace);
728 dlm_put_lockspace(ls);
729 return release_lockspace(ls, force);