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 #ifdef CONFIG_DLM_DEBUG
26 int dlm_create_debug_file(struct dlm_ls *ls);
27 void dlm_delete_debug_file(struct dlm_ls *ls);
29 static inline int dlm_create_debug_file(struct dlm_ls *ls) { return 0; }
30 static inline void dlm_delete_debug_file(struct dlm_ls *ls) { }
34 static struct semaphore ls_lock;
35 static struct list_head lslist;
36 static spinlock_t lslist_lock;
37 static struct task_struct * scand_task;
40 static ssize_t dlm_control_store(struct dlm_ls *ls, const char *buf, size_t len)
43 int n = simple_strtol(buf, NULL, 0);
58 static ssize_t dlm_event_store(struct dlm_ls *ls, const char *buf, size_t len)
60 ls->ls_uevent_result = simple_strtol(buf, NULL, 0);
61 set_bit(LSFL_UEVENT_WAIT, &ls->ls_flags);
62 wake_up(&ls->ls_uevent_wait);
66 static ssize_t dlm_id_show(struct dlm_ls *ls, char *buf)
68 return sprintf(buf, "%u\n", ls->ls_global_id);
71 static ssize_t dlm_id_store(struct dlm_ls *ls, const char *buf, size_t len)
73 ls->ls_global_id = simple_strtoul(buf, NULL, 0);
78 struct attribute attr;
79 ssize_t (*show)(struct dlm_ls *, char *);
80 ssize_t (*store)(struct dlm_ls *, const char *, size_t);
83 static struct dlm_attr dlm_attr_control = {
84 .attr = {.name = "control", .mode = S_IWUSR},
85 .store = dlm_control_store
88 static struct dlm_attr dlm_attr_event = {
89 .attr = {.name = "event_done", .mode = S_IWUSR},
90 .store = dlm_event_store
93 static struct dlm_attr dlm_attr_id = {
94 .attr = {.name = "id", .mode = S_IRUGO | S_IWUSR},
99 static struct attribute *dlm_attrs[] = {
100 &dlm_attr_control.attr,
101 &dlm_attr_event.attr,
106 static ssize_t dlm_attr_show(struct kobject *kobj, struct attribute *attr,
109 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
110 struct dlm_attr *a = container_of(attr, struct dlm_attr, attr);
111 return a->show ? a->show(ls, buf) : 0;
114 static ssize_t dlm_attr_store(struct kobject *kobj, struct attribute *attr,
115 const char *buf, size_t len)
117 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
118 struct dlm_attr *a = container_of(attr, struct dlm_attr, attr);
119 return a->store ? a->store(ls, buf, len) : len;
122 static struct sysfs_ops dlm_attr_ops = {
123 .show = dlm_attr_show,
124 .store = dlm_attr_store,
127 static struct kobj_type dlm_ktype = {
128 .default_attrs = dlm_attrs,
129 .sysfs_ops = &dlm_attr_ops,
132 static struct kset dlm_kset = {
133 .subsys = &kernel_subsys,
134 .kobj = {.name = "dlm",},
138 static int kobject_setup(struct dlm_ls *ls)
140 char lsname[DLM_LOCKSPACE_LEN];
143 memset(lsname, 0, DLM_LOCKSPACE_LEN);
144 snprintf(lsname, DLM_LOCKSPACE_LEN, "%s", ls->ls_name);
146 error = kobject_set_name(&ls->ls_kobj, "%s", lsname);
150 ls->ls_kobj.kset = &dlm_kset;
151 ls->ls_kobj.ktype = &dlm_ktype;
155 static int do_uevent(struct dlm_ls *ls, int in)
160 kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
162 kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
164 error = wait_event_interruptible(ls->ls_uevent_wait,
165 test_and_clear_bit(LSFL_UEVENT_WAIT, &ls->ls_flags));
169 error = ls->ls_uevent_result;
175 int dlm_lockspace_init(void)
180 init_MUTEX(&ls_lock);
181 INIT_LIST_HEAD(&lslist);
182 spin_lock_init(&lslist_lock);
184 error = kset_register(&dlm_kset);
186 printk("dlm_lockspace_init: cannot register kset %d\n", error);
190 void dlm_lockspace_exit(void)
192 kset_unregister(&dlm_kset);
195 static int dlm_scand(void *data)
199 while (!kthread_should_stop()) {
200 list_for_each_entry(ls, &lslist, ls_list)
202 schedule_timeout_interruptible(dlm_config.scan_secs * HZ);
207 static int dlm_scand_start(void)
209 struct task_struct *p;
212 p = kthread_run(dlm_scand, NULL, "dlm_scand");
220 static void dlm_scand_stop(void)
222 kthread_stop(scand_task);
225 static struct dlm_ls *dlm_find_lockspace_name(char *name, int namelen)
229 spin_lock(&lslist_lock);
231 list_for_each_entry(ls, &lslist, ls_list) {
232 if (ls->ls_namelen == namelen &&
233 memcmp(ls->ls_name, name, namelen) == 0)
238 spin_unlock(&lslist_lock);
242 struct dlm_ls *dlm_find_lockspace_global(uint32_t id)
246 spin_lock(&lslist_lock);
248 list_for_each_entry(ls, &lslist, ls_list) {
249 if (ls->ls_global_id == id) {
256 spin_unlock(&lslist_lock);
260 struct dlm_ls *dlm_find_lockspace_local(void *id)
262 struct dlm_ls *ls = id;
264 spin_lock(&lslist_lock);
266 spin_unlock(&lslist_lock);
270 void dlm_put_lockspace(struct dlm_ls *ls)
272 spin_lock(&lslist_lock);
274 spin_unlock(&lslist_lock);
277 static void remove_lockspace(struct dlm_ls *ls)
280 spin_lock(&lslist_lock);
281 if (ls->ls_count == 0) {
282 list_del(&ls->ls_list);
283 spin_unlock(&lslist_lock);
286 spin_unlock(&lslist_lock);
291 static int threads_start(void)
295 /* Thread which process lock requests for all lockspace's */
296 error = dlm_astd_start();
298 log_print("cannot start dlm_astd thread %d", error);
302 error = dlm_scand_start();
304 log_print("cannot start dlm_scand thread %d", error);
308 /* Thread for sending/receiving messages for all lockspace's */
309 error = dlm_lowcomms_start();
311 log_print("cannot start dlm lowcomms %d", error);
325 static void threads_stop(void)
332 static int new_lockspace(char *name, int namelen, void **lockspace,
333 uint32_t flags, int lvblen)
336 int i, size, error = -ENOMEM;
338 if (namelen > DLM_LOCKSPACE_LEN)
341 if (!lvblen || (lvblen % 8))
344 if (!try_module_get(THIS_MODULE))
347 ls = dlm_find_lockspace_name(name, namelen);
350 module_put(THIS_MODULE);
354 ls = kmalloc(sizeof(struct dlm_ls) + namelen, GFP_KERNEL);
357 memset(ls, 0, sizeof(struct dlm_ls) + namelen);
358 memcpy(ls->ls_name, name, namelen);
359 ls->ls_namelen = namelen;
360 ls->ls_exflags = flags;
361 ls->ls_lvblen = lvblen;
365 size = dlm_config.rsbtbl_size;
366 ls->ls_rsbtbl_size = size;
368 ls->ls_rsbtbl = kmalloc(sizeof(struct dlm_rsbtable) * size, GFP_KERNEL);
371 for (i = 0; i < size; i++) {
372 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list);
373 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss);
374 rwlock_init(&ls->ls_rsbtbl[i].lock);
377 size = dlm_config.lkbtbl_size;
378 ls->ls_lkbtbl_size = size;
380 ls->ls_lkbtbl = kmalloc(sizeof(struct dlm_lkbtable) * size, GFP_KERNEL);
383 for (i = 0; i < size; i++) {
384 INIT_LIST_HEAD(&ls->ls_lkbtbl[i].list);
385 rwlock_init(&ls->ls_lkbtbl[i].lock);
386 ls->ls_lkbtbl[i].counter = 1;
389 size = dlm_config.dirtbl_size;
390 ls->ls_dirtbl_size = size;
392 ls->ls_dirtbl = kmalloc(sizeof(struct dlm_dirtable) * size, GFP_KERNEL);
395 for (i = 0; i < size; i++) {
396 INIT_LIST_HEAD(&ls->ls_dirtbl[i].list);
397 rwlock_init(&ls->ls_dirtbl[i].lock);
400 INIT_LIST_HEAD(&ls->ls_waiters);
401 init_MUTEX(&ls->ls_waiters_sem);
403 INIT_LIST_HEAD(&ls->ls_nodes);
404 INIT_LIST_HEAD(&ls->ls_nodes_gone);
405 ls->ls_num_nodes = 0;
406 ls->ls_low_nodeid = 0;
407 ls->ls_total_weight = 0;
408 ls->ls_node_array = NULL;
410 memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
411 ls->ls_stub_rsb.res_ls = ls;
413 ls->ls_debug_dentry = NULL;
415 init_waitqueue_head(&ls->ls_uevent_wait);
416 ls->ls_uevent_result = 0;
418 ls->ls_recoverd_task = NULL;
419 init_MUTEX(&ls->ls_recoverd_active);
420 spin_lock_init(&ls->ls_recover_lock);
421 ls->ls_recover_status = 0;
422 ls->ls_recover_seq = 0;
423 ls->ls_recover_args = NULL;
424 init_rwsem(&ls->ls_in_recovery);
425 INIT_LIST_HEAD(&ls->ls_requestqueue);
426 init_MUTEX(&ls->ls_requestqueue_lock);
428 ls->ls_recover_buf = kmalloc(dlm_config.buffer_size, GFP_KERNEL);
429 if (!ls->ls_recover_buf)
432 INIT_LIST_HEAD(&ls->ls_recover_list);
433 spin_lock_init(&ls->ls_recover_list_lock);
434 ls->ls_recover_list_count = 0;
435 init_waitqueue_head(&ls->ls_wait_general);
436 INIT_LIST_HEAD(&ls->ls_root_list);
437 init_rwsem(&ls->ls_root_sem);
439 down_write(&ls->ls_in_recovery);
441 error = dlm_recoverd_start(ls);
443 log_error(ls, "can't start dlm_recoverd %d", error);
447 spin_lock(&lslist_lock);
448 list_add(&ls->ls_list, &lslist);
449 spin_unlock(&lslist_lock);
451 dlm_create_debug_file(ls);
453 error = kobject_setup(ls);
457 error = kobject_register(&ls->ls_kobj);
461 error = do_uevent(ls, 1);
469 kobject_unregister(&ls->ls_kobj);
471 dlm_delete_debug_file(ls);
472 spin_lock(&lslist_lock);
473 list_del(&ls->ls_list);
474 spin_unlock(&lslist_lock);
475 dlm_recoverd_stop(ls);
477 kfree(ls->ls_recover_buf);
479 kfree(ls->ls_dirtbl);
481 kfree(ls->ls_lkbtbl);
483 kfree(ls->ls_rsbtbl);
487 module_put(THIS_MODULE);
491 int dlm_new_lockspace(char *name, int namelen, void **lockspace,
492 uint32_t flags, int lvblen)
498 error = threads_start();
502 error = new_lockspace(name, namelen, lockspace, flags, lvblen);
510 /* Return 1 if the lockspace still has active remote locks,
511 * 2 if the lockspace still has active local locks.
513 static int lockspace_busy(struct dlm_ls *ls)
515 int i, lkb_found = 0;
518 /* NOTE: We check the lockidtbl here rather than the resource table.
519 This is because there may be LKBs queued as ASTs that have been
520 unlinked from their RSBs and are pending deletion once the AST has
523 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
524 read_lock(&ls->ls_lkbtbl[i].lock);
525 if (!list_empty(&ls->ls_lkbtbl[i].list)) {
527 list_for_each_entry(lkb, &ls->ls_lkbtbl[i].list,
529 if (!lkb->lkb_nodeid) {
530 read_unlock(&ls->ls_lkbtbl[i].lock);
535 read_unlock(&ls->ls_lkbtbl[i].lock);
540 static int release_lockspace(struct dlm_ls *ls, int force)
544 struct list_head *head;
546 int busy = lockspace_busy(ls);
554 dlm_recoverd_stop(ls);
556 remove_lockspace(ls);
558 dlm_delete_debug_file(ls);
562 kfree(ls->ls_recover_buf);
565 * Free direntry structs.
569 kfree(ls->ls_dirtbl);
572 * Free all lkb's on lkbtbl[] lists.
575 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
576 head = &ls->ls_lkbtbl[i].list;
577 while (!list_empty(head)) {
578 lkb = list_entry(head->next, struct dlm_lkb,
581 list_del(&lkb->lkb_idtbl_list);
585 if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
586 free_lvb(lkb->lkb_lvbptr);
593 kfree(ls->ls_lkbtbl);
596 * Free all rsb's on rsbtbl[] lists
599 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
600 head = &ls->ls_rsbtbl[i].list;
601 while (!list_empty(head)) {
602 rsb = list_entry(head->next, struct dlm_rsb,
605 list_del(&rsb->res_hashchain);
609 head = &ls->ls_rsbtbl[i].toss;
610 while (!list_empty(head)) {
611 rsb = list_entry(head->next, struct dlm_rsb,
613 list_del(&rsb->res_hashchain);
618 kfree(ls->ls_rsbtbl);
621 * Free structures on any other lists
624 kfree(ls->ls_recover_args);
625 dlm_clear_free_entries(ls);
626 dlm_clear_members(ls);
627 dlm_clear_members_gone(ls);
628 kfree(ls->ls_node_array);
629 kobject_unregister(&ls->ls_kobj);
638 module_put(THIS_MODULE);
643 * Called when a system has released all its locks and is not going to use the
644 * lockspace any longer. We free everything we're managing for this lockspace.
645 * Remaining nodes will go through the recovery process as if we'd died. The
646 * lockspace must continue to function as usual, participating in recoveries,
647 * until this returns.
649 * Force has 4 possible values:
650 * 0 - don't destroy locksapce if it has any LKBs
651 * 1 - destroy lockspace if it has remote LKBs but not if it has local LKBs
652 * 2 - destroy lockspace regardless of LKBs
653 * 3 - destroy lockspace as part of a forced shutdown
656 int dlm_release_lockspace(void *lockspace, int force)
660 ls = dlm_find_lockspace_local(lockspace);
663 dlm_put_lockspace(ls);
664 return release_lockspace(ls, force);