ARM: dts: gemini-dlink-dir-685: rename gpio-i2c to i2c
[linux-2.6-block.git] / fs / dlm / lockspace.c
CommitLineData
2522fe45 1// SPDX-License-Identifier: GPL-2.0-only
e7fd4179
DT
2/******************************************************************************
3*******************************************************************************
4**
5** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
60f98d18 6** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
e7fd4179 7**
e7fd4179
DT
8**
9*******************************************************************************
10******************************************************************************/
11
7963b8a5
PG
12#include <linux/module.h>
13
e7fd4179
DT
14#include "dlm_internal.h"
15#include "lockspace.h"
16#include "member.h"
17#include "recoverd.h"
e7fd4179
DT
18#include "dir.h"
19#include "lowcomms.h"
20#include "config.h"
21#include "memory.h"
22#include "lock.h"
c56b39cd 23#include "recover.h"
2896ee37 24#include "requestqueue.h"
0f8e0d9a 25#include "user.h"
23e8e1aa 26#include "ast.h"
e7fd4179 27
e7fd4179 28static int ls_count;
90135925 29static struct mutex ls_lock;
e7fd4179
DT
30static struct list_head lslist;
31static spinlock_t lslist_lock;
32static struct task_struct * scand_task;
33
34
35static ssize_t dlm_control_store(struct dlm_ls *ls, const char *buf, size_t len)
36{
37 ssize_t ret = len;
6edb5687
FF
38 int n;
39 int rc = kstrtoint(buf, 0, &n);
e7fd4179 40
6edb5687
FF
41 if (rc)
42 return rc;
e2de7f56
PC
43 ls = dlm_find_lockspace_local(ls->ls_local_handle);
44 if (!ls)
45 return -EINVAL;
46
e7fd4179
DT
47 switch (n) {
48 case 0:
49 dlm_ls_stop(ls);
50 break;
51 case 1:
52 dlm_ls_start(ls);
53 break;
54 default:
55 ret = -EINVAL;
56 }
e2de7f56 57 dlm_put_lockspace(ls);
e7fd4179
DT
58 return ret;
59}
60
61static ssize_t dlm_event_store(struct dlm_ls *ls, const char *buf, size_t len)
62{
6edb5687
FF
63 int rc = kstrtoint(buf, 0, &ls->ls_uevent_result);
64
65 if (rc)
66 return rc;
e7fd4179
DT
67 set_bit(LSFL_UEVENT_WAIT, &ls->ls_flags);
68 wake_up(&ls->ls_uevent_wait);
69 return len;
70}
71
72static ssize_t dlm_id_show(struct dlm_ls *ls, char *buf)
73{
a1d144c7 74 return snprintf(buf, PAGE_SIZE, "%u\n", ls->ls_global_id);
e7fd4179
DT
75}
76
77static ssize_t dlm_id_store(struct dlm_ls *ls, const char *buf, size_t len)
78{
6edb5687
FF
79 int rc = kstrtouint(buf, 0, &ls->ls_global_id);
80
81 if (rc)
82 return rc;
e7fd4179
DT
83 return len;
84}
85
4875647a
DT
86static ssize_t dlm_nodir_show(struct dlm_ls *ls, char *buf)
87{
88 return snprintf(buf, PAGE_SIZE, "%u\n", dlm_no_directory(ls));
89}
90
91static ssize_t dlm_nodir_store(struct dlm_ls *ls, const char *buf, size_t len)
92{
6edb5687
FF
93 int val;
94 int rc = kstrtoint(buf, 0, &val);
95
96 if (rc)
97 return rc;
4875647a
DT
98 if (val == 1)
99 set_bit(LSFL_NODIR, &ls->ls_flags);
100 return len;
101}
102
c56b39cd
DT
103static ssize_t dlm_recover_status_show(struct dlm_ls *ls, char *buf)
104{
105 uint32_t status = dlm_recover_status(ls);
a1d144c7 106 return snprintf(buf, PAGE_SIZE, "%x\n", status);
c56b39cd
DT
107}
108
faa0f267
DT
109static ssize_t dlm_recover_nodeid_show(struct dlm_ls *ls, char *buf)
110{
a1d144c7 111 return snprintf(buf, PAGE_SIZE, "%d\n", ls->ls_recover_nodeid);
faa0f267
DT
112}
113
e7fd4179
DT
114struct dlm_attr {
115 struct attribute attr;
116 ssize_t (*show)(struct dlm_ls *, char *);
117 ssize_t (*store)(struct dlm_ls *, const char *, size_t);
118};
119
120static struct dlm_attr dlm_attr_control = {
121 .attr = {.name = "control", .mode = S_IWUSR},
122 .store = dlm_control_store
123};
124
125static struct dlm_attr dlm_attr_event = {
126 .attr = {.name = "event_done", .mode = S_IWUSR},
127 .store = dlm_event_store
128};
129
130static struct dlm_attr dlm_attr_id = {
131 .attr = {.name = "id", .mode = S_IRUGO | S_IWUSR},
132 .show = dlm_id_show,
133 .store = dlm_id_store
134};
135
4875647a
DT
136static struct dlm_attr dlm_attr_nodir = {
137 .attr = {.name = "nodir", .mode = S_IRUGO | S_IWUSR},
138 .show = dlm_nodir_show,
139 .store = dlm_nodir_store
140};
141
c56b39cd
DT
142static struct dlm_attr dlm_attr_recover_status = {
143 .attr = {.name = "recover_status", .mode = S_IRUGO},
144 .show = dlm_recover_status_show
145};
146
faa0f267
DT
147static struct dlm_attr dlm_attr_recover_nodeid = {
148 .attr = {.name = "recover_nodeid", .mode = S_IRUGO},
149 .show = dlm_recover_nodeid_show
150};
151
e7fd4179
DT
152static struct attribute *dlm_attrs[] = {
153 &dlm_attr_control.attr,
154 &dlm_attr_event.attr,
155 &dlm_attr_id.attr,
4875647a 156 &dlm_attr_nodir.attr,
c56b39cd 157 &dlm_attr_recover_status.attr,
faa0f267 158 &dlm_attr_recover_nodeid.attr,
e7fd4179
DT
159 NULL,
160};
c9c5b5e1 161ATTRIBUTE_GROUPS(dlm);
e7fd4179
DT
162
163static ssize_t dlm_attr_show(struct kobject *kobj, struct attribute *attr,
164 char *buf)
165{
166 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
167 struct dlm_attr *a = container_of(attr, struct dlm_attr, attr);
168 return a->show ? a->show(ls, buf) : 0;
169}
170
171static ssize_t dlm_attr_store(struct kobject *kobj, struct attribute *attr,
172 const char *buf, size_t len)
173{
174 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
175 struct dlm_attr *a = container_of(attr, struct dlm_attr, attr);
176 return a->store ? a->store(ls, buf, len) : len;
177}
178
ba542e3b
PC
179static void lockspace_kobj_release(struct kobject *k)
180{
181 struct dlm_ls *ls = container_of(k, struct dlm_ls, ls_kobj);
182 kfree(ls);
183}
184
52cf25d0 185static const struct sysfs_ops dlm_attr_ops = {
e7fd4179
DT
186 .show = dlm_attr_show,
187 .store = dlm_attr_store,
188};
189
190static struct kobj_type dlm_ktype = {
c9c5b5e1 191 .default_groups = dlm_groups,
e7fd4179 192 .sysfs_ops = &dlm_attr_ops,
ba542e3b 193 .release = lockspace_kobj_release,
e7fd4179
DT
194};
195
d405936b 196static struct kset *dlm_kset;
e7fd4179 197
e7fd4179
DT
198static int do_uevent(struct dlm_ls *ls, int in)
199{
e7fd4179
DT
200 if (in)
201 kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
202 else
203 kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
204
075f0177 205 log_rinfo(ls, "%s the lockspace group...", in ? "joining" : "leaving");
8b0e7b2c
DT
206
207 /* dlm_controld will see the uevent, do the necessary group management
208 and then write to sysfs to wake us */
209
f084a4f4
RL
210 wait_event(ls->ls_uevent_wait,
211 test_and_clear_bit(LSFL_UEVENT_WAIT, &ls->ls_flags));
8b0e7b2c 212
f084a4f4 213 log_rinfo(ls, "group event done %d", ls->ls_uevent_result);
e7fd4179 214
f084a4f4 215 return ls->ls_uevent_result;
e7fd4179
DT
216}
217
b4a5d4bc
SW
218static int dlm_uevent(struct kset *kset, struct kobject *kobj,
219 struct kobj_uevent_env *env)
220{
221 struct dlm_ls *ls = container_of(kobj, struct dlm_ls, ls_kobj);
222
223 add_uevent_var(env, "LOCKSPACE=%s", ls->ls_name);
224 return 0;
225}
226
417f7c59 227static const struct kset_uevent_ops dlm_uevent_ops = {
b4a5d4bc
SW
228 .uevent = dlm_uevent,
229};
e7fd4179 230
30727174 231int __init dlm_lockspace_init(void)
e7fd4179 232{
e7fd4179 233 ls_count = 0;
90135925 234 mutex_init(&ls_lock);
e7fd4179
DT
235 INIT_LIST_HEAD(&lslist);
236 spin_lock_init(&lslist_lock);
237
b4a5d4bc 238 dlm_kset = kset_create_and_add("dlm", &dlm_uevent_ops, kernel_kobj);
d405936b 239 if (!dlm_kset) {
8e24eea7 240 printk(KERN_WARNING "%s: can not create kset\n", __func__);
d405936b
GKH
241 return -ENOMEM;
242 }
243 return 0;
e7fd4179
DT
244}
245
246void dlm_lockspace_exit(void)
247{
d405936b 248 kset_unregister(dlm_kset);
e7fd4179
DT
249}
250
c1dcf65f
DT
251static struct dlm_ls *find_ls_to_scan(void)
252{
253 struct dlm_ls *ls;
254
255 spin_lock(&lslist_lock);
256 list_for_each_entry(ls, &lslist, ls_list) {
257 if (time_after_eq(jiffies, ls->ls_scan_time +
258 dlm_config.ci_scan_secs * HZ)) {
259 spin_unlock(&lslist_lock);
260 return ls;
261 }
262 }
263 spin_unlock(&lslist_lock);
264 return NULL;
265}
266
e7fd4179
DT
267static int dlm_scand(void *data)
268{
269 struct dlm_ls *ls;
270
271 while (!kthread_should_stop()) {
c1dcf65f
DT
272 ls = find_ls_to_scan();
273 if (ls) {
85e86edf 274 if (dlm_lock_recovery_try(ls)) {
c1dcf65f 275 ls->ls_scan_time = jiffies;
85e86edf 276 dlm_scan_rsbs(ls);
3ae1acf9 277 dlm_scan_timeout(ls);
c6ff669b 278 dlm_scan_waiters(ls);
85e86edf 279 dlm_unlock_recovery(ls);
c1dcf65f
DT
280 } else {
281 ls->ls_scan_time += HZ;
85e86edf 282 }
c6ff669b 283 continue;
85e86edf 284 }
c6ff669b 285 schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
e7fd4179
DT
286 }
287 return 0;
288}
289
290static int dlm_scand_start(void)
291{
292 struct task_struct *p;
293 int error = 0;
294
295 p = kthread_run(dlm_scand, NULL, "dlm_scand");
296 if (IS_ERR(p))
297 error = PTR_ERR(p);
298 else
299 scand_task = p;
300 return error;
301}
302
303static void dlm_scand_stop(void)
304{
305 kthread_stop(scand_task);
306}
307
e7fd4179
DT
308struct dlm_ls *dlm_find_lockspace_global(uint32_t id)
309{
310 struct dlm_ls *ls;
311
312 spin_lock(&lslist_lock);
313
314 list_for_each_entry(ls, &lslist, ls_list) {
315 if (ls->ls_global_id == id) {
316 ls->ls_count++;
317 goto out;
318 }
319 }
320 ls = NULL;
321 out:
322 spin_unlock(&lslist_lock);
323 return ls;
324}
325
597d0cae 326struct dlm_ls *dlm_find_lockspace_local(dlm_lockspace_t *lockspace)
e7fd4179 327{
597d0cae 328 struct dlm_ls *ls;
e7fd4179
DT
329
330 spin_lock(&lslist_lock);
597d0cae
DT
331 list_for_each_entry(ls, &lslist, ls_list) {
332 if (ls->ls_local_handle == lockspace) {
333 ls->ls_count++;
334 goto out;
335 }
336 }
337 ls = NULL;
338 out:
339 spin_unlock(&lslist_lock);
340 return ls;
341}
342
343struct dlm_ls *dlm_find_lockspace_device(int minor)
344{
345 struct dlm_ls *ls;
346
347 spin_lock(&lslist_lock);
348 list_for_each_entry(ls, &lslist, ls_list) {
349 if (ls->ls_device.minor == minor) {
350 ls->ls_count++;
351 goto out;
352 }
353 }
354 ls = NULL;
355 out:
e7fd4179
DT
356 spin_unlock(&lslist_lock);
357 return ls;
358}
359
360void dlm_put_lockspace(struct dlm_ls *ls)
361{
362 spin_lock(&lslist_lock);
363 ls->ls_count--;
364 spin_unlock(&lslist_lock);
365}
366
367static void remove_lockspace(struct dlm_ls *ls)
368{
369 for (;;) {
370 spin_lock(&lslist_lock);
371 if (ls->ls_count == 0) {
0f8e0d9a 372 WARN_ON(ls->ls_create_count != 0);
e7fd4179
DT
373 list_del(&ls->ls_list);
374 spin_unlock(&lslist_lock);
375 return;
376 }
377 spin_unlock(&lslist_lock);
378 ssleep(1);
379 }
380}
381
382static int threads_start(void)
383{
384 int error;
385
e7fd4179
DT
386 error = dlm_scand_start();
387 if (error) {
388 log_print("cannot start dlm_scand thread %d", error);
23e8e1aa 389 goto fail;
e7fd4179
DT
390 }
391
392 /* Thread for sending/receiving messages for all lockspace's */
393 error = dlm_lowcomms_start();
394 if (error) {
395 log_print("cannot start dlm lowcomms %d", error);
396 goto scand_fail;
397 }
398
399 return 0;
400
401 scand_fail:
402 dlm_scand_stop();
e7fd4179
DT
403 fail:
404 return error;
405}
406
60f98d18
DT
407static int new_lockspace(const char *name, const char *cluster,
408 uint32_t flags, int lvblen,
409 const struct dlm_lockspace_ops *ops, void *ops_arg,
410 int *ops_result, dlm_lockspace_t **lockspace)
e7fd4179
DT
411{
412 struct dlm_ls *ls;
0f8e0d9a 413 int i, size, error;
79d72b54 414 int do_unreg = 0;
60f98d18 415 int namelen = strlen(name);
e7fd4179 416
3f0806d2 417 if (namelen > DLM_LOCKSPACE_LEN || namelen == 0)
e7fd4179
DT
418 return -EINVAL;
419
420 if (!lvblen || (lvblen % 8))
421 return -EINVAL;
422
423 if (!try_module_get(THIS_MODULE))
424 return -EINVAL;
425
dc68c7ed 426 if (!dlm_user_daemon_available()) {
60f98d18
DT
427 log_print("dlm user daemon not available");
428 error = -EUNATCH;
429 goto out;
430 }
431
432 if (ops && ops_result) {
433 if (!dlm_config.ci_recover_callbacks)
434 *ops_result = -EOPNOTSUPP;
435 else
436 *ops_result = 0;
437 }
438
3b0e761b
ZL
439 if (!cluster)
440 log_print("dlm cluster name '%s' is being used without an application provided cluster name",
441 dlm_config.ci_cluster_name);
442
60f98d18
DT
443 if (dlm_config.ci_recover_callbacks && cluster &&
444 strncmp(cluster, dlm_config.ci_cluster_name, DLM_LOCKSPACE_LEN)) {
8e174374
GH
445 log_print("dlm cluster name '%s' does not match "
446 "the application cluster name '%s'",
60f98d18
DT
447 dlm_config.ci_cluster_name, cluster);
448 error = -EBADR;
449 goto out;
dc68c7ed
DT
450 }
451
0f8e0d9a
DT
452 error = 0;
453
454 spin_lock(&lslist_lock);
455 list_for_each_entry(ls, &lslist, ls_list) {
456 WARN_ON(ls->ls_create_count <= 0);
457 if (ls->ls_namelen != namelen)
458 continue;
459 if (memcmp(ls->ls_name, name, namelen))
460 continue;
461 if (flags & DLM_LSFL_NEWEXCL) {
462 error = -EEXIST;
463 break;
464 }
465 ls->ls_create_count++;
8511a272
DT
466 *lockspace = ls;
467 error = 1;
0f8e0d9a 468 break;
e7fd4179 469 }
0f8e0d9a
DT
470 spin_unlock(&lslist_lock);
471
0f8e0d9a 472 if (error)
8511a272 473 goto out;
0f8e0d9a
DT
474
475 error = -ENOMEM;
e7fd4179 476
573c24c4 477 ls = kzalloc(sizeof(struct dlm_ls) + namelen, GFP_NOFS);
e7fd4179
DT
478 if (!ls)
479 goto out;
e7fd4179
DT
480 memcpy(ls->ls_name, name, namelen);
481 ls->ls_namelen = namelen;
e7fd4179
DT
482 ls->ls_lvblen = lvblen;
483 ls->ls_count = 0;
484 ls->ls_flags = 0;
c1dcf65f 485 ls->ls_scan_time = jiffies;
e7fd4179 486
60f98d18
DT
487 if (ops && dlm_config.ci_recover_callbacks) {
488 ls->ls_ops = ops;
489 ls->ls_ops_arg = ops_arg;
490 }
491
3ae1acf9
DT
492 if (flags & DLM_LSFL_TIMEWARN)
493 set_bit(LSFL_TIMEWARN, &ls->ls_flags);
3ae1acf9 494
fad59c13 495 /* ls_exflags are forced to match among nodes, and we don't
0f8e0d9a
DT
496 need to require all nodes to have some flags set */
497 ls->ls_exflags = (flags & ~(DLM_LSFL_TIMEWARN | DLM_LSFL_FS |
498 DLM_LSFL_NEWEXCL));
fad59c13 499
68c817a1 500 size = dlm_config.ci_rsbtbl_size;
e7fd4179
DT
501 ls->ls_rsbtbl_size = size;
502
42bc47b3 503 ls->ls_rsbtbl = vmalloc(array_size(size, sizeof(struct dlm_rsbtable)));
e7fd4179
DT
504 if (!ls->ls_rsbtbl)
505 goto out_lsfree;
506 for (i = 0; i < size; i++) {
9beb3bf5
BP
507 ls->ls_rsbtbl[i].keep.rb_node = NULL;
508 ls->ls_rsbtbl[i].toss.rb_node = NULL;
c7be761a 509 spin_lock_init(&ls->ls_rsbtbl[i].lock);
e7fd4179
DT
510 }
511
05c32f47
DT
512 spin_lock_init(&ls->ls_remove_spin);
513
514 for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++) {
515 ls->ls_remove_names[i] = kzalloc(DLM_RESNAME_MAXLEN+1,
516 GFP_KERNEL);
517 if (!ls->ls_remove_names[i])
518 goto out_rsbtbl;
519 }
520
3d6aa675
DT
521 idr_init(&ls->ls_lkbidr);
522 spin_lock_init(&ls->ls_lkbidr_spin);
e7fd4179 523
e7fd4179 524 INIT_LIST_HEAD(&ls->ls_waiters);
90135925 525 mutex_init(&ls->ls_waiters_mutex);
ef0c2bb0
DT
526 INIT_LIST_HEAD(&ls->ls_orphans);
527 mutex_init(&ls->ls_orphans_mutex);
3ae1acf9
DT
528 INIT_LIST_HEAD(&ls->ls_timeout);
529 mutex_init(&ls->ls_timeout_mutex);
e7fd4179 530
3881ac04
DT
531 INIT_LIST_HEAD(&ls->ls_new_rsb);
532 spin_lock_init(&ls->ls_new_rsb_spin);
533
e7fd4179
DT
534 INIT_LIST_HEAD(&ls->ls_nodes);
535 INIT_LIST_HEAD(&ls->ls_nodes_gone);
536 ls->ls_num_nodes = 0;
537 ls->ls_low_nodeid = 0;
538 ls->ls_total_weight = 0;
539 ls->ls_node_array = NULL;
540
541 memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
542 ls->ls_stub_rsb.res_ls = ls;
543
5de6319b
DT
544 ls->ls_debug_rsb_dentry = NULL;
545 ls->ls_debug_waiters_dentry = NULL;
e7fd4179
DT
546
547 init_waitqueue_head(&ls->ls_uevent_wait);
548 ls->ls_uevent_result = 0;
8b0e7b2c
DT
549 init_completion(&ls->ls_members_done);
550 ls->ls_members_result = -1;
e7fd4179 551
23e8e1aa
DT
552 mutex_init(&ls->ls_cb_mutex);
553 INIT_LIST_HEAD(&ls->ls_cb_delay);
554
e7fd4179 555 ls->ls_recoverd_task = NULL;
90135925 556 mutex_init(&ls->ls_recoverd_active);
e7fd4179 557 spin_lock_init(&ls->ls_recover_lock);
98f176fb
DT
558 spin_lock_init(&ls->ls_rcom_spin);
559 get_random_bytes(&ls->ls_rcom_seq, sizeof(uint64_t));
e7fd4179
DT
560 ls->ls_recover_status = 0;
561 ls->ls_recover_seq = 0;
562 ls->ls_recover_args = NULL;
563 init_rwsem(&ls->ls_in_recovery);
c36258b5 564 init_rwsem(&ls->ls_recv_active);
e7fd4179 565 INIT_LIST_HEAD(&ls->ls_requestqueue);
90135925 566 mutex_init(&ls->ls_requestqueue_mutex);
597d0cae 567 mutex_init(&ls->ls_clear_proc_locks);
e7fd4179 568
9f8f9c77 569 ls->ls_recover_buf = kmalloc(LOWCOMMS_MAX_TX_BUFFER_LEN, GFP_NOFS);
e7fd4179 570 if (!ls->ls_recover_buf)
05c32f47 571 goto out_lkbidr;
e7fd4179 572
757a4271
DT
573 ls->ls_slot = 0;
574 ls->ls_num_slots = 0;
575 ls->ls_slots_size = 0;
576 ls->ls_slots = NULL;
577
e7fd4179
DT
578 INIT_LIST_HEAD(&ls->ls_recover_list);
579 spin_lock_init(&ls->ls_recover_list_lock);
1d7c484e
DT
580 idr_init(&ls->ls_recover_idr);
581 spin_lock_init(&ls->ls_recover_idr_lock);
e7fd4179 582 ls->ls_recover_list_count = 0;
597d0cae 583 ls->ls_local_handle = ls;
e7fd4179
DT
584 init_waitqueue_head(&ls->ls_wait_general);
585 INIT_LIST_HEAD(&ls->ls_root_list);
586 init_rwsem(&ls->ls_root_sem);
587
5f88f1ea 588 spin_lock(&lslist_lock);
0f8e0d9a 589 ls->ls_create_count = 1;
5f88f1ea
DT
590 list_add(&ls->ls_list, &lslist);
591 spin_unlock(&lslist_lock);
592
23e8e1aa
DT
593 if (flags & DLM_LSFL_FS) {
594 error = dlm_callback_start(ls);
595 if (error) {
596 log_error(ls, "can't start dlm_callback %d", error);
597 goto out_delist;
598 }
599 }
600
475f230c
DT
601 init_waitqueue_head(&ls->ls_recover_lock_wait);
602
603 /*
604 * Once started, dlm_recoverd first looks for ls in lslist, then
605 * initializes ls_in_recovery as locked in "down" mode. We need
606 * to wait for the wakeup from dlm_recoverd because in_recovery
607 * has to start out in down mode.
608 */
609
e7fd4179
DT
610 error = dlm_recoverd_start(ls);
611 if (error) {
612 log_error(ls, "can't start dlm_recoverd %d", error);
23e8e1aa 613 goto out_callback;
e7fd4179
DT
614 }
615
475f230c
DT
616 wait_event(ls->ls_recover_lock_wait,
617 test_bit(LSFL_RECOVER_LOCK, &ls->ls_flags));
618
0ffddafc
WH
619 /* let kobject handle freeing of ls if there's an error */
620 do_unreg = 1;
621
901195ed
GKH
622 ls->ls_kobj.kset = dlm_kset;
623 error = kobject_init_and_add(&ls->ls_kobj, &dlm_ktype, NULL,
624 "%s", ls->ls_name);
e7fd4179 625 if (error)
23e8e1aa 626 goto out_recoverd;
901195ed 627 kobject_uevent(&ls->ls_kobj, KOBJ_ADD);
79d72b54 628
8b0e7b2c
DT
629 /* This uevent triggers dlm_controld in userspace to add us to the
630 group of nodes that are members of this lockspace (managed by the
631 cluster infrastructure.) Once it's done that, it tells us who the
632 current lockspace members are (via configfs) and then tells the
633 lockspace to start running (via sysfs) in dlm_ls_start(). */
634
e7fd4179
DT
635 error = do_uevent(ls, 1);
636 if (error)
23e8e1aa 637 goto out_recoverd;
79d72b54 638
8b0e7b2c
DT
639 wait_for_completion(&ls->ls_members_done);
640 error = ls->ls_members_result;
641 if (error)
642 goto out_members;
643
79d72b54
DT
644 dlm_create_debug_file(ls);
645
075f0177 646 log_rinfo(ls, "join complete");
e7fd4179
DT
647 *lockspace = ls;
648 return 0;
649
8b0e7b2c
DT
650 out_members:
651 do_uevent(ls, 0);
652 dlm_clear_members(ls);
653 kfree(ls->ls_node_array);
23e8e1aa 654 out_recoverd:
5f88f1ea 655 dlm_recoverd_stop(ls);
23e8e1aa
DT
656 out_callback:
657 dlm_callback_stop(ls);
79d72b54 658 out_delist:
e7fd4179
DT
659 spin_lock(&lslist_lock);
660 list_del(&ls->ls_list);
661 spin_unlock(&lslist_lock);
1d7c484e 662 idr_destroy(&ls->ls_recover_idr);
e7fd4179 663 kfree(ls->ls_recover_buf);
05c32f47 664 out_lkbidr:
3d6aa675 665 idr_destroy(&ls->ls_lkbidr);
b982896c 666 out_rsbtbl:
3456880f
TM
667 for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++)
668 kfree(ls->ls_remove_names[i]);
c282af49 669 vfree(ls->ls_rsbtbl);
e7fd4179 670 out_lsfree:
79d72b54 671 if (do_unreg)
197b12d6 672 kobject_put(&ls->ls_kobj);
79d72b54
DT
673 else
674 kfree(ls);
e7fd4179
DT
675 out:
676 module_put(THIS_MODULE);
677 return error;
678}
679
60f98d18
DT
680int dlm_new_lockspace(const char *name, const char *cluster,
681 uint32_t flags, int lvblen,
682 const struct dlm_lockspace_ops *ops, void *ops_arg,
683 int *ops_result, dlm_lockspace_t **lockspace)
e7fd4179
DT
684{
685 int error = 0;
686
90135925 687 mutex_lock(&ls_lock);
e7fd4179
DT
688 if (!ls_count)
689 error = threads_start();
690 if (error)
691 goto out;
692
60f98d18
DT
693 error = new_lockspace(name, cluster, flags, lvblen, ops, ops_arg,
694 ops_result, lockspace);
e7fd4179
DT
695 if (!error)
696 ls_count++;
8511a272
DT
697 if (error > 0)
698 error = 0;
9d232469
AA
699 if (!ls_count) {
700 dlm_scand_stop();
701 dlm_lowcomms_shutdown();
702 dlm_lowcomms_stop();
703 }
e7fd4179 704 out:
90135925 705 mutex_unlock(&ls_lock);
e7fd4179
DT
706 return error;
707}
708
3d6aa675 709static int lkb_idr_is_local(int id, void *p, void *data)
e7fd4179 710{
3d6aa675
DT
711 struct dlm_lkb *lkb = p;
712
a97f4a66 713 return lkb->lkb_nodeid == 0 && lkb->lkb_grmode != DLM_LOCK_IV;
3d6aa675
DT
714}
715
716static int lkb_idr_is_any(int id, void *p, void *data)
717{
718 return 1;
719}
720
721static int lkb_idr_free(int id, void *p, void *data)
722{
723 struct dlm_lkb *lkb = p;
724
3d6aa675
DT
725 if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
726 dlm_free_lvb(lkb->lkb_lvbptr);
727
728 dlm_free_lkb(lkb);
729 return 0;
730}
731
732/* NOTE: We check the lkbidr here rather than the resource table.
733 This is because there may be LKBs queued as ASTs that have been unlinked
734 from their RSBs and are pending deletion once the AST has been delivered */
735
736static int lockspace_busy(struct dlm_ls *ls, int force)
737{
738 int rv;
739
740 spin_lock(&ls->ls_lkbidr_spin);
741 if (force == 0) {
742 rv = idr_for_each(&ls->ls_lkbidr, lkb_idr_is_any, ls);
743 } else if (force == 1) {
744 rv = idr_for_each(&ls->ls_lkbidr, lkb_idr_is_local, ls);
745 } else {
746 rv = 0;
e7fd4179 747 }
3d6aa675
DT
748 spin_unlock(&ls->ls_lkbidr_spin);
749 return rv;
e7fd4179
DT
750}
751
752static int release_lockspace(struct dlm_ls *ls, int force)
753{
e7fd4179 754 struct dlm_rsb *rsb;
9beb3bf5 755 struct rb_node *n;
0f8e0d9a
DT
756 int i, busy, rv;
757
3d6aa675 758 busy = lockspace_busy(ls, force);
0f8e0d9a
DT
759
760 spin_lock(&lslist_lock);
761 if (ls->ls_create_count == 1) {
3d6aa675 762 if (busy) {
0f8e0d9a 763 rv = -EBUSY;
3d6aa675 764 } else {
0f8e0d9a
DT
765 /* remove_lockspace takes ls off lslist */
766 ls->ls_create_count = 0;
767 rv = 0;
768 }
769 } else if (ls->ls_create_count > 1) {
770 rv = --ls->ls_create_count;
771 } else {
772 rv = -EINVAL;
773 }
774 spin_unlock(&lslist_lock);
775
776 if (rv) {
777 log_debug(ls, "release_lockspace no remove %d", rv);
778 return rv;
779 }
e7fd4179 780
0f8e0d9a 781 dlm_device_deregister(ls);
e7fd4179 782
dc68c7ed 783 if (force < 3 && dlm_user_daemon_available())
e7fd4179
DT
784 do_uevent(ls, 0);
785
786 dlm_recoverd_stop(ls);
787
9d232469
AA
788 if (ls_count == 1) {
789 dlm_scand_stop();
790 dlm_lowcomms_shutdown();
791 }
792
23e8e1aa
DT
793 dlm_callback_stop(ls);
794
e7fd4179
DT
795 remove_lockspace(ls);
796
797 dlm_delete_debug_file(ls);
798
8fc6ed9a 799 idr_destroy(&ls->ls_recover_idr);
e7fd4179
DT
800 kfree(ls->ls_recover_buf);
801
e7fd4179 802 /*
3d6aa675 803 * Free all lkb's in idr
e7fd4179
DT
804 */
805
3d6aa675 806 idr_for_each(&ls->ls_lkbidr, lkb_idr_free, ls);
3d6aa675 807 idr_destroy(&ls->ls_lkbidr);
e7fd4179 808
e7fd4179
DT
809 /*
810 * Free all rsb's on rsbtbl[] lists
811 */
812
813 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
9beb3bf5
BP
814 while ((n = rb_first(&ls->ls_rsbtbl[i].keep))) {
815 rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
816 rb_erase(n, &ls->ls_rsbtbl[i].keep);
52bda2b5 817 dlm_free_rsb(rsb);
e7fd4179
DT
818 }
819
9beb3bf5
BP
820 while ((n = rb_first(&ls->ls_rsbtbl[i].toss))) {
821 rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
822 rb_erase(n, &ls->ls_rsbtbl[i].toss);
52bda2b5 823 dlm_free_rsb(rsb);
e7fd4179
DT
824 }
825 }
826
c282af49 827 vfree(ls->ls_rsbtbl);
e7fd4179 828
05c32f47
DT
829 for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++)
830 kfree(ls->ls_remove_names[i]);
831
3881ac04
DT
832 while (!list_empty(&ls->ls_new_rsb)) {
833 rsb = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb,
834 res_hashchain);
835 list_del(&rsb->res_hashchain);
836 dlm_free_rsb(rsb);
837 }
838
e7fd4179
DT
839 /*
840 * Free structures on any other lists
841 */
842
2896ee37 843 dlm_purge_requestqueue(ls);
e7fd4179 844 kfree(ls->ls_recover_args);
e7fd4179
DT
845 dlm_clear_members(ls);
846 dlm_clear_members_gone(ls);
847 kfree(ls->ls_node_array);
075f0177 848 log_rinfo(ls, "release_lockspace final free");
197b12d6 849 kobject_put(&ls->ls_kobj);
79d72b54 850 /* The ls structure will be freed when the kobject is done with */
e7fd4179 851
e7fd4179
DT
852 module_put(THIS_MODULE);
853 return 0;
854}
855
856/*
857 * Called when a system has released all its locks and is not going to use the
858 * lockspace any longer. We free everything we're managing for this lockspace.
859 * Remaining nodes will go through the recovery process as if we'd died. The
860 * lockspace must continue to function as usual, participating in recoveries,
861 * until this returns.
862 *
863 * Force has 4 possible values:
864 * 0 - don't destroy locksapce if it has any LKBs
865 * 1 - destroy lockspace if it has remote LKBs but not if it has local LKBs
866 * 2 - destroy lockspace regardless of LKBs
867 * 3 - destroy lockspace as part of a forced shutdown
868 */
869
870int dlm_release_lockspace(void *lockspace, int force)
871{
872 struct dlm_ls *ls;
0f8e0d9a 873 int error;
e7fd4179
DT
874
875 ls = dlm_find_lockspace_local(lockspace);
876 if (!ls)
877 return -EINVAL;
878 dlm_put_lockspace(ls);
0f8e0d9a
DT
879
880 mutex_lock(&ls_lock);
881 error = release_lockspace(ls, force);
882 if (!error)
883 ls_count--;
278afcbf 884 if (!ls_count)
9d232469 885 dlm_lowcomms_stop();
0f8e0d9a
DT
886 mutex_unlock(&ls_lock);
887
888 return error;
e7fd4179
DT
889}
890
dc68c7ed
DT
891void dlm_stop_lockspaces(void)
892{
893 struct dlm_ls *ls;
696b3d84 894 int count;
dc68c7ed
DT
895
896 restart:
696b3d84 897 count = 0;
dc68c7ed
DT
898 spin_lock(&lslist_lock);
899 list_for_each_entry(ls, &lslist, ls_list) {
696b3d84
DT
900 if (!test_bit(LSFL_RUNNING, &ls->ls_flags)) {
901 count++;
dc68c7ed 902 continue;
696b3d84 903 }
dc68c7ed
DT
904 spin_unlock(&lslist_lock);
905 log_error(ls, "no userland control daemon, stopping lockspace");
906 dlm_ls_stop(ls);
907 goto restart;
908 }
909 spin_unlock(&lslist_lock);
696b3d84
DT
910
911 if (count)
912 log_print("dlm user daemon left %d lockspaces", count);
dc68c7ed
DT
913}
914