sysfs: make SYSFS_DEPRECATED depend on SYSFS
[linux-2.6/mini2440.git] / fs / dlm / lockspace.c
blob5c108c49cb8cd30128d533630cdd3ac72810839d
1 /******************************************************************************
2 *******************************************************************************
3 **
4 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5 ** Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
6 **
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"
16 #include "member.h"
17 #include "recoverd.h"
18 #include "ast.h"
19 #include "dir.h"
20 #include "lowcomms.h"
21 #include "config.h"
22 #include "memory.h"
23 #include "lock.h"
24 #include "recover.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);
30 #else
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) { }
33 #endif
35 static int ls_count;
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)
44 ssize_t ret = len;
45 int n = simple_strtol(buf, NULL, 0);
47 ls = dlm_find_lockspace_local(ls->ls_local_handle);
48 if (!ls)
49 return -EINVAL;
51 switch (n) {
52 case 0:
53 dlm_ls_stop(ls);
54 break;
55 case 1:
56 dlm_ls_start(ls);
57 break;
58 default:
59 ret = -EINVAL;
61 dlm_put_lockspace(ls);
62 return ret;
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);
70 return len;
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);
81 return len;
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);
95 struct dlm_attr {
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},
113 .show = dlm_id_show,
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,
130 &dlm_attr_id.attr,
131 &dlm_attr_recover_status.attr,
132 &dlm_attr_recover_nodeid.attr,
133 NULL,
136 static ssize_t dlm_attr_show(struct kobject *kobj, struct attribute *attr,
137 char *buf)
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);
155 kfree(ls);
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;
171 static int do_uevent(struct dlm_ls *ls, int in)
173 int error;
175 if (in)
176 kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
177 else
178 kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
180 log_debug(ls, "%s the lockspace group...", in ? "joining" : "leaving");
182 /* dlm_controld will see the uevent, do the necessary group management
183 and then write to sysfs to wake us */
185 error = wait_event_interruptible(ls->ls_uevent_wait,
186 test_and_clear_bit(LSFL_UEVENT_WAIT, &ls->ls_flags));
188 log_debug(ls, "group event done %d %d", error, ls->ls_uevent_result);
190 if (error)
191 goto out;
193 error = ls->ls_uevent_result;
194 out:
195 if (error)
196 log_error(ls, "group %s failed %d %d", in ? "join" : "leave",
197 error, ls->ls_uevent_result);
198 return error;
202 int dlm_lockspace_init(void)
204 ls_count = 0;
205 mutex_init(&ls_lock);
206 INIT_LIST_HEAD(&lslist);
207 spin_lock_init(&lslist_lock);
209 dlm_kset = kset_create_and_add("dlm", NULL, kernel_kobj);
210 if (!dlm_kset) {
211 printk(KERN_WARNING "%s: can not create kset\n", __FUNCTION__);
212 return -ENOMEM;
214 return 0;
217 void dlm_lockspace_exit(void)
219 kset_unregister(dlm_kset);
222 static int dlm_scand(void *data)
224 struct dlm_ls *ls;
226 while (!kthread_should_stop()) {
227 list_for_each_entry(ls, &lslist, ls_list) {
228 if (dlm_lock_recovery_try(ls)) {
229 dlm_scan_rsbs(ls);
230 dlm_scan_timeout(ls);
231 dlm_unlock_recovery(ls);
234 schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
236 return 0;
239 static int dlm_scand_start(void)
241 struct task_struct *p;
242 int error = 0;
244 p = kthread_run(dlm_scand, NULL, "dlm_scand");
245 if (IS_ERR(p))
246 error = PTR_ERR(p);
247 else
248 scand_task = p;
249 return error;
252 static void dlm_scand_stop(void)
254 kthread_stop(scand_task);
257 static struct dlm_ls *dlm_find_lockspace_name(char *name, int namelen)
259 struct dlm_ls *ls;
261 spin_lock(&lslist_lock);
263 list_for_each_entry(ls, &lslist, ls_list) {
264 if (ls->ls_namelen == namelen &&
265 memcmp(ls->ls_name, name, namelen) == 0)
266 goto out;
268 ls = NULL;
269 out:
270 spin_unlock(&lslist_lock);
271 return ls;
274 struct dlm_ls *dlm_find_lockspace_global(uint32_t id)
276 struct dlm_ls *ls;
278 spin_lock(&lslist_lock);
280 list_for_each_entry(ls, &lslist, ls_list) {
281 if (ls->ls_global_id == id) {
282 ls->ls_count++;
283 goto out;
286 ls = NULL;
287 out:
288 spin_unlock(&lslist_lock);
289 return ls;
292 struct dlm_ls *dlm_find_lockspace_local(dlm_lockspace_t *lockspace)
294 struct dlm_ls *ls;
296 spin_lock(&lslist_lock);
297 list_for_each_entry(ls, &lslist, ls_list) {
298 if (ls->ls_local_handle == lockspace) {
299 ls->ls_count++;
300 goto out;
303 ls = NULL;
304 out:
305 spin_unlock(&lslist_lock);
306 return ls;
309 struct dlm_ls *dlm_find_lockspace_device(int minor)
311 struct dlm_ls *ls;
313 spin_lock(&lslist_lock);
314 list_for_each_entry(ls, &lslist, ls_list) {
315 if (ls->ls_device.minor == minor) {
316 ls->ls_count++;
317 goto out;
320 ls = NULL;
321 out:
322 spin_unlock(&lslist_lock);
323 return ls;
326 void dlm_put_lockspace(struct dlm_ls *ls)
328 spin_lock(&lslist_lock);
329 ls->ls_count--;
330 spin_unlock(&lslist_lock);
333 static void remove_lockspace(struct dlm_ls *ls)
335 for (;;) {
336 spin_lock(&lslist_lock);
337 if (ls->ls_count == 0) {
338 list_del(&ls->ls_list);
339 spin_unlock(&lslist_lock);
340 return;
342 spin_unlock(&lslist_lock);
343 ssleep(1);
347 static int threads_start(void)
349 int error;
351 /* Thread which process lock requests for all lockspace's */
352 error = dlm_astd_start();
353 if (error) {
354 log_print("cannot start dlm_astd thread %d", error);
355 goto fail;
358 error = dlm_scand_start();
359 if (error) {
360 log_print("cannot start dlm_scand thread %d", error);
361 goto astd_fail;
364 /* Thread for sending/receiving messages for all lockspace's */
365 error = dlm_lowcomms_start();
366 if (error) {
367 log_print("cannot start dlm lowcomms %d", error);
368 goto scand_fail;
371 return 0;
373 scand_fail:
374 dlm_scand_stop();
375 astd_fail:
376 dlm_astd_stop();
377 fail:
378 return error;
381 static void threads_stop(void)
383 dlm_scand_stop();
384 dlm_lowcomms_stop();
385 dlm_astd_stop();
388 static int new_lockspace(char *name, int namelen, void **lockspace,
389 uint32_t flags, int lvblen)
391 struct dlm_ls *ls;
392 int i, size, error = -ENOMEM;
393 int do_unreg = 0;
395 if (namelen > DLM_LOCKSPACE_LEN)
396 return -EINVAL;
398 if (!lvblen || (lvblen % 8))
399 return -EINVAL;
401 if (!try_module_get(THIS_MODULE))
402 return -EINVAL;
404 ls = dlm_find_lockspace_name(name, namelen);
405 if (ls) {
406 *lockspace = ls;
407 module_put(THIS_MODULE);
408 return -EEXIST;
411 ls = kzalloc(sizeof(struct dlm_ls) + namelen, GFP_KERNEL);
412 if (!ls)
413 goto out;
414 memcpy(ls->ls_name, name, namelen);
415 ls->ls_namelen = namelen;
416 ls->ls_lvblen = lvblen;
417 ls->ls_count = 0;
418 ls->ls_flags = 0;
420 if (flags & DLM_LSFL_TIMEWARN)
421 set_bit(LSFL_TIMEWARN, &ls->ls_flags);
423 if (flags & DLM_LSFL_FS)
424 ls->ls_allocation = GFP_NOFS;
425 else
426 ls->ls_allocation = GFP_KERNEL;
428 /* ls_exflags are forced to match among nodes, and we don't
429 need to require all nodes to have TIMEWARN or FS set */
430 ls->ls_exflags = (flags & ~(DLM_LSFL_TIMEWARN | DLM_LSFL_FS));
432 size = dlm_config.ci_rsbtbl_size;
433 ls->ls_rsbtbl_size = size;
435 ls->ls_rsbtbl = kmalloc(sizeof(struct dlm_rsbtable) * size, GFP_KERNEL);
436 if (!ls->ls_rsbtbl)
437 goto out_lsfree;
438 for (i = 0; i < size; i++) {
439 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list);
440 INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss);
441 rwlock_init(&ls->ls_rsbtbl[i].lock);
444 size = dlm_config.ci_lkbtbl_size;
445 ls->ls_lkbtbl_size = size;
447 ls->ls_lkbtbl = kmalloc(sizeof(struct dlm_lkbtable) * size, GFP_KERNEL);
448 if (!ls->ls_lkbtbl)
449 goto out_rsbfree;
450 for (i = 0; i < size; i++) {
451 INIT_LIST_HEAD(&ls->ls_lkbtbl[i].list);
452 rwlock_init(&ls->ls_lkbtbl[i].lock);
453 ls->ls_lkbtbl[i].counter = 1;
456 size = dlm_config.ci_dirtbl_size;
457 ls->ls_dirtbl_size = size;
459 ls->ls_dirtbl = kmalloc(sizeof(struct dlm_dirtable) * size, GFP_KERNEL);
460 if (!ls->ls_dirtbl)
461 goto out_lkbfree;
462 for (i = 0; i < size; i++) {
463 INIT_LIST_HEAD(&ls->ls_dirtbl[i].list);
464 rwlock_init(&ls->ls_dirtbl[i].lock);
467 INIT_LIST_HEAD(&ls->ls_waiters);
468 mutex_init(&ls->ls_waiters_mutex);
469 INIT_LIST_HEAD(&ls->ls_orphans);
470 mutex_init(&ls->ls_orphans_mutex);
471 INIT_LIST_HEAD(&ls->ls_timeout);
472 mutex_init(&ls->ls_timeout_mutex);
474 INIT_LIST_HEAD(&ls->ls_nodes);
475 INIT_LIST_HEAD(&ls->ls_nodes_gone);
476 ls->ls_num_nodes = 0;
477 ls->ls_low_nodeid = 0;
478 ls->ls_total_weight = 0;
479 ls->ls_node_array = NULL;
481 memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
482 ls->ls_stub_rsb.res_ls = ls;
484 ls->ls_debug_rsb_dentry = NULL;
485 ls->ls_debug_waiters_dentry = NULL;
487 init_waitqueue_head(&ls->ls_uevent_wait);
488 ls->ls_uevent_result = 0;
489 init_completion(&ls->ls_members_done);
490 ls->ls_members_result = -1;
492 ls->ls_recoverd_task = NULL;
493 mutex_init(&ls->ls_recoverd_active);
494 spin_lock_init(&ls->ls_recover_lock);
495 spin_lock_init(&ls->ls_rcom_spin);
496 get_random_bytes(&ls->ls_rcom_seq, sizeof(uint64_t));
497 ls->ls_recover_status = 0;
498 ls->ls_recover_seq = 0;
499 ls->ls_recover_args = NULL;
500 init_rwsem(&ls->ls_in_recovery);
501 init_rwsem(&ls->ls_recv_active);
502 INIT_LIST_HEAD(&ls->ls_requestqueue);
503 mutex_init(&ls->ls_requestqueue_mutex);
504 mutex_init(&ls->ls_clear_proc_locks);
506 ls->ls_recover_buf = kmalloc(dlm_config.ci_buffer_size, GFP_KERNEL);
507 if (!ls->ls_recover_buf)
508 goto out_dirfree;
510 INIT_LIST_HEAD(&ls->ls_recover_list);
511 spin_lock_init(&ls->ls_recover_list_lock);
512 ls->ls_recover_list_count = 0;
513 ls->ls_local_handle = ls;
514 init_waitqueue_head(&ls->ls_wait_general);
515 INIT_LIST_HEAD(&ls->ls_root_list);
516 init_rwsem(&ls->ls_root_sem);
518 down_write(&ls->ls_in_recovery);
520 spin_lock(&lslist_lock);
521 list_add(&ls->ls_list, &lslist);
522 spin_unlock(&lslist_lock);
524 /* needs to find ls in lslist */
525 error = dlm_recoverd_start(ls);
526 if (error) {
527 log_error(ls, "can't start dlm_recoverd %d", error);
528 goto out_delist;
531 ls->ls_kobj.kset = dlm_kset;
532 error = kobject_init_and_add(&ls->ls_kobj, &dlm_ktype, NULL,
533 "%s", ls->ls_name);
534 if (error)
535 goto out_stop;
536 kobject_uevent(&ls->ls_kobj, KOBJ_ADD);
538 /* let kobject handle freeing of ls if there's an error */
539 do_unreg = 1;
541 /* This uevent triggers dlm_controld in userspace to add us to the
542 group of nodes that are members of this lockspace (managed by the
543 cluster infrastructure.) Once it's done that, it tells us who the
544 current lockspace members are (via configfs) and then tells the
545 lockspace to start running (via sysfs) in dlm_ls_start(). */
547 error = do_uevent(ls, 1);
548 if (error)
549 goto out_stop;
551 wait_for_completion(&ls->ls_members_done);
552 error = ls->ls_members_result;
553 if (error)
554 goto out_members;
556 dlm_create_debug_file(ls);
558 log_debug(ls, "join complete");
560 *lockspace = ls;
561 return 0;
563 out_members:
564 do_uevent(ls, 0);
565 dlm_clear_members(ls);
566 kfree(ls->ls_node_array);
567 out_stop:
568 dlm_recoverd_stop(ls);
569 out_delist:
570 spin_lock(&lslist_lock);
571 list_del(&ls->ls_list);
572 spin_unlock(&lslist_lock);
573 kfree(ls->ls_recover_buf);
574 out_dirfree:
575 kfree(ls->ls_dirtbl);
576 out_lkbfree:
577 kfree(ls->ls_lkbtbl);
578 out_rsbfree:
579 kfree(ls->ls_rsbtbl);
580 out_lsfree:
581 if (do_unreg)
582 kobject_put(&ls->ls_kobj);
583 else
584 kfree(ls);
585 out:
586 module_put(THIS_MODULE);
587 return error;
590 int dlm_new_lockspace(char *name, int namelen, void **lockspace,
591 uint32_t flags, int lvblen)
593 int error = 0;
595 mutex_lock(&ls_lock);
596 if (!ls_count)
597 error = threads_start();
598 if (error)
599 goto out;
601 error = new_lockspace(name, namelen, lockspace, flags, lvblen);
602 if (!error)
603 ls_count++;
604 else if (!ls_count)
605 threads_stop();
606 out:
607 mutex_unlock(&ls_lock);
608 return error;
611 /* Return 1 if the lockspace still has active remote locks,
612 * 2 if the lockspace still has active local locks.
614 static int lockspace_busy(struct dlm_ls *ls)
616 int i, lkb_found = 0;
617 struct dlm_lkb *lkb;
619 /* NOTE: We check the lockidtbl here rather than the resource table.
620 This is because there may be LKBs queued as ASTs that have been
621 unlinked from their RSBs and are pending deletion once the AST has
622 been delivered */
624 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
625 read_lock(&ls->ls_lkbtbl[i].lock);
626 if (!list_empty(&ls->ls_lkbtbl[i].list)) {
627 lkb_found = 1;
628 list_for_each_entry(lkb, &ls->ls_lkbtbl[i].list,
629 lkb_idtbl_list) {
630 if (!lkb->lkb_nodeid) {
631 read_unlock(&ls->ls_lkbtbl[i].lock);
632 return 2;
636 read_unlock(&ls->ls_lkbtbl[i].lock);
638 return lkb_found;
641 static int release_lockspace(struct dlm_ls *ls, int force)
643 struct dlm_lkb *lkb;
644 struct dlm_rsb *rsb;
645 struct list_head *head;
646 int i;
647 int busy = lockspace_busy(ls);
649 if (busy > force)
650 return -EBUSY;
652 if (force < 3)
653 do_uevent(ls, 0);
655 dlm_recoverd_stop(ls);
657 remove_lockspace(ls);
659 dlm_delete_debug_file(ls);
661 dlm_astd_suspend();
663 kfree(ls->ls_recover_buf);
666 * Free direntry structs.
669 dlm_dir_clear(ls);
670 kfree(ls->ls_dirtbl);
673 * Free all lkb's on lkbtbl[] lists.
676 for (i = 0; i < ls->ls_lkbtbl_size; i++) {
677 head = &ls->ls_lkbtbl[i].list;
678 while (!list_empty(head)) {
679 lkb = list_entry(head->next, struct dlm_lkb,
680 lkb_idtbl_list);
682 list_del(&lkb->lkb_idtbl_list);
684 dlm_del_ast(lkb);
686 if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
687 free_lvb(lkb->lkb_lvbptr);
689 free_lkb(lkb);
692 dlm_astd_resume();
694 kfree(ls->ls_lkbtbl);
697 * Free all rsb's on rsbtbl[] lists
700 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
701 head = &ls->ls_rsbtbl[i].list;
702 while (!list_empty(head)) {
703 rsb = list_entry(head->next, struct dlm_rsb,
704 res_hashchain);
706 list_del(&rsb->res_hashchain);
707 free_rsb(rsb);
710 head = &ls->ls_rsbtbl[i].toss;
711 while (!list_empty(head)) {
712 rsb = list_entry(head->next, struct dlm_rsb,
713 res_hashchain);
714 list_del(&rsb->res_hashchain);
715 free_rsb(rsb);
719 kfree(ls->ls_rsbtbl);
722 * Free structures on any other lists
725 dlm_purge_requestqueue(ls);
726 kfree(ls->ls_recover_args);
727 dlm_clear_free_entries(ls);
728 dlm_clear_members(ls);
729 dlm_clear_members_gone(ls);
730 kfree(ls->ls_node_array);
731 kobject_put(&ls->ls_kobj);
732 /* The ls structure will be freed when the kobject is done with */
734 mutex_lock(&ls_lock);
735 ls_count--;
736 if (!ls_count)
737 threads_stop();
738 mutex_unlock(&ls_lock);
740 module_put(THIS_MODULE);
741 return 0;
745 * Called when a system has released all its locks and is not going to use the
746 * lockspace any longer. We free everything we're managing for this lockspace.
747 * Remaining nodes will go through the recovery process as if we'd died. The
748 * lockspace must continue to function as usual, participating in recoveries,
749 * until this returns.
751 * Force has 4 possible values:
752 * 0 - don't destroy locksapce if it has any LKBs
753 * 1 - destroy lockspace if it has remote LKBs but not if it has local LKBs
754 * 2 - destroy lockspace regardless of LKBs
755 * 3 - destroy lockspace as part of a forced shutdown
758 int dlm_release_lockspace(void *lockspace, int force)
760 struct dlm_ls *ls;
762 ls = dlm_find_lockspace_local(lockspace);
763 if (!ls)
764 return -EINVAL;
765 dlm_put_lockspace(ls);
766 return release_lockspace(ls, force);