blob: 561dcad08ad6e2070ea715ff0a2c37c1f373e90e [file] [log] [blame]
Thomas Gleixner2522fe42019-05-28 09:57:20 -07001// SPDX-License-Identifier: GPL-2.0-only
David Teiglande7fd4172006-01-18 09:30:29 +00002/******************************************************************************
3*******************************************************************************
4**
5** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
David Teigland60f98d12011-11-02 14:30:58 -05006** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
David Teiglande7fd4172006-01-18 09:30:29 +00007**
David Teiglande7fd4172006-01-18 09:30:29 +00008**
9*******************************************************************************
10******************************************************************************/
11
Paul Gortmaker7963b8a2016-09-19 16:44:50 -040012#include <linux/module.h>
13
David Teiglande7fd4172006-01-18 09:30:29 +000014#include "dlm_internal.h"
15#include "lockspace.h"
16#include "member.h"
17#include "recoverd.h"
David Teiglande7fd4172006-01-18 09:30:29 +000018#include "dir.h"
19#include "lowcomms.h"
20#include "config.h"
21#include "memory.h"
22#include "lock.h"
David Teiglandc56b39c2006-04-28 10:51:53 -040023#include "recover.h"
David Teigland2896ee32006-11-27 11:31:22 -060024#include "requestqueue.h"
David Teigland0f8e0d92008-08-06 13:30:24 -050025#include "user.h"
David Teigland23e8e1a2011-04-05 13:16:24 -050026#include "ast.h"
David Teiglande7fd4172006-01-18 09:30:29 +000027
David Teiglande7fd4172006-01-18 09:30:29 +000028static int ls_count;
David Teigland90135922006-01-20 08:47:07 +000029static struct mutex ls_lock;
David Teiglande7fd4172006-01-18 09:30:29 +000030static 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;
Fabian Frederick6edb5682014-06-06 14:38:25 -070038 int n;
39 int rc = kstrtoint(buf, 0, &n);
David Teiglande7fd4172006-01-18 09:30:29 +000040
Fabian Frederick6edb5682014-06-06 14:38:25 -070041 if (rc)
42 return rc;
Patrick Caulfielde2de7f52006-11-06 08:53:28 +000043 ls = dlm_find_lockspace_local(ls->ls_local_handle);
44 if (!ls)
45 return -EINVAL;
46
David Teiglande7fd4172006-01-18 09:30:29 +000047 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 }
Patrick Caulfielde2de7f52006-11-06 08:53:28 +000057 dlm_put_lockspace(ls);
David Teiglande7fd4172006-01-18 09:30:29 +000058 return ret;
59}
60
61static ssize_t dlm_event_store(struct dlm_ls *ls, const char *buf, size_t len)
62{
Fabian Frederick6edb5682014-06-06 14:38:25 -070063 int rc = kstrtoint(buf, 0, &ls->ls_uevent_result);
64
65 if (rc)
66 return rc;
David Teiglande7fd4172006-01-18 09:30:29 +000067 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{
David Teiglanda1d144c2006-09-06 17:01:40 -050074 return snprintf(buf, PAGE_SIZE, "%u\n", ls->ls_global_id);
David Teiglande7fd4172006-01-18 09:30:29 +000075}
76
77static ssize_t dlm_id_store(struct dlm_ls *ls, const char *buf, size_t len)
78{
Fabian Frederick6edb5682014-06-06 14:38:25 -070079 int rc = kstrtouint(buf, 0, &ls->ls_global_id);
80
81 if (rc)
82 return rc;
David Teiglande7fd4172006-01-18 09:30:29 +000083 return len;
84}
85
David Teigland48756472012-04-26 15:54:29 -050086static 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{
Fabian Frederick6edb5682014-06-06 14:38:25 -070093 int val;
94 int rc = kstrtoint(buf, 0, &val);
95
96 if (rc)
97 return rc;
David Teigland48756472012-04-26 15:54:29 -050098 if (val == 1)
99 set_bit(LSFL_NODIR, &ls->ls_flags);
100 return len;
101}
102
David Teiglandc56b39c2006-04-28 10:51:53 -0400103static ssize_t dlm_recover_status_show(struct dlm_ls *ls, char *buf)
104{
105 uint32_t status = dlm_recover_status(ls);
David Teiglanda1d144c2006-09-06 17:01:40 -0500106 return snprintf(buf, PAGE_SIZE, "%x\n", status);
David Teiglandc56b39c2006-04-28 10:51:53 -0400107}
108
David Teiglandfaa0f262006-08-08 17:08:42 -0500109static ssize_t dlm_recover_nodeid_show(struct dlm_ls *ls, char *buf)
110{
David Teiglanda1d144c2006-09-06 17:01:40 -0500111 return snprintf(buf, PAGE_SIZE, "%d\n", ls->ls_recover_nodeid);
David Teiglandfaa0f262006-08-08 17:08:42 -0500112}
113
David Teiglande7fd4172006-01-18 09:30:29 +0000114struct 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
David Teigland48756472012-04-26 15:54:29 -0500136static 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
David Teiglandc56b39c2006-04-28 10:51:53 -0400142static struct dlm_attr dlm_attr_recover_status = {
143 .attr = {.name = "recover_status", .mode = S_IRUGO},
144 .show = dlm_recover_status_show
145};
146
David Teiglandfaa0f262006-08-08 17:08:42 -0500147static struct dlm_attr dlm_attr_recover_nodeid = {
148 .attr = {.name = "recover_nodeid", .mode = S_IRUGO},
149 .show = dlm_recover_nodeid_show
150};
151
David Teiglande7fd4172006-01-18 09:30:29 +0000152static struct attribute *dlm_attrs[] = {
153 &dlm_attr_control.attr,
154 &dlm_attr_event.attr,
155 &dlm_attr_id.attr,
David Teigland48756472012-04-26 15:54:29 -0500156 &dlm_attr_nodir.attr,
David Teiglandc56b39c2006-04-28 10:51:53 -0400157 &dlm_attr_recover_status.attr,
David Teiglandfaa0f262006-08-08 17:08:42 -0500158 &dlm_attr_recover_nodeid.attr,
David Teiglande7fd4172006-01-18 09:30:29 +0000159 NULL,
160};
Kimberly Brownc9c5b5e2019-05-07 21:48:05 -0400161ATTRIBUTE_GROUPS(dlm);
David Teiglande7fd4172006-01-18 09:30:29 +0000162
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
Patrick Caulfieldba542e32006-11-02 14:41:23 +0000179static 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
Emese Revfy52cf25d2010-01-19 02:58:23 +0100185static const struct sysfs_ops dlm_attr_ops = {
David Teiglande7fd4172006-01-18 09:30:29 +0000186 .show = dlm_attr_show,
187 .store = dlm_attr_store,
188};
189
190static struct kobj_type dlm_ktype = {
Kimberly Brownc9c5b5e2019-05-07 21:48:05 -0400191 .default_groups = dlm_groups,
David Teiglande7fd4172006-01-18 09:30:29 +0000192 .sysfs_ops = &dlm_attr_ops,
Patrick Caulfieldba542e32006-11-02 14:41:23 +0000193 .release = lockspace_kobj_release,
David Teiglande7fd4172006-01-18 09:30:29 +0000194};
195
Greg Kroah-Hartmand4059362007-10-29 20:13:17 +0100196static struct kset *dlm_kset;
David Teiglande7fd4172006-01-18 09:30:29 +0000197
David Teiglande7fd4172006-01-18 09:30:29 +0000198static int do_uevent(struct dlm_ls *ls, int in)
199{
David Teiglande7fd4172006-01-18 09:30:29 +0000200 if (in)
201 kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
202 else
203 kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
204
David Teigland075f0172014-02-14 11:54:44 -0600205 log_rinfo(ls, "%s the lockspace group...", in ? "joining" : "leaving");
David Teigland8b0e7b22007-05-18 09:03:35 -0500206
207 /* dlm_controld will see the uevent, do the necessary group management
208 and then write to sysfs to wake us */
209
Ross Lagerwallf084a4f2020-04-29 13:15:41 +0100210 wait_event(ls->ls_uevent_wait,
211 test_and_clear_bit(LSFL_UEVENT_WAIT, &ls->ls_flags));
David Teigland8b0e7b22007-05-18 09:03:35 -0500212
Ross Lagerwallf084a4f2020-04-29 13:15:41 +0100213 log_rinfo(ls, "group event done %d", ls->ls_uevent_result);
David Teigland8b0e7b22007-05-18 09:03:35 -0500214
Ross Lagerwallf084a4f2020-04-29 13:15:41 +0100215 return ls->ls_uevent_result;
David Teiglande7fd4172006-01-18 09:30:29 +0000216}
217
Steven Whitehouseb4a5d4b2010-02-17 09:41:34 +0000218static 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
Bhumika Goyal417f7c52017-07-28 18:49:17 +0530227static const struct kset_uevent_ops dlm_uevent_ops = {
Steven Whitehouseb4a5d4b2010-02-17 09:41:34 +0000228 .uevent = dlm_uevent,
229};
David Teiglande7fd4172006-01-18 09:30:29 +0000230
Denis Cheng30727172008-02-02 01:53:46 +0800231int __init dlm_lockspace_init(void)
David Teiglande7fd4172006-01-18 09:30:29 +0000232{
David Teiglande7fd4172006-01-18 09:30:29 +0000233 ls_count = 0;
David Teigland90135922006-01-20 08:47:07 +0000234 mutex_init(&ls_lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000235 INIT_LIST_HEAD(&lslist);
236 spin_lock_init(&lslist_lock);
237
Steven Whitehouseb4a5d4b2010-02-17 09:41:34 +0000238 dlm_kset = kset_create_and_add("dlm", &dlm_uevent_ops, kernel_kobj);
Greg Kroah-Hartmand4059362007-10-29 20:13:17 +0100239 if (!dlm_kset) {
Harvey Harrison8e24eea2008-04-30 00:55:09 -0700240 printk(KERN_WARNING "%s: can not create kset\n", __func__);
Greg Kroah-Hartmand4059362007-10-29 20:13:17 +0100241 return -ENOMEM;
242 }
243 return 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000244}
245
246void dlm_lockspace_exit(void)
247{
Greg Kroah-Hartmand4059362007-10-29 20:13:17 +0100248 kset_unregister(dlm_kset);
David Teiglande7fd4172006-01-18 09:30:29 +0000249}
250
David Teiglandc1dcf652008-08-18 14:03:25 -0500251static struct dlm_ls *find_ls_to_scan(void)
David Teiglande7fd4172006-01-18 09:30:29 +0000252{
253 struct dlm_ls *ls;
254
David Teiglandc1dcf652008-08-18 14:03:25 -0500255 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
267static int dlm_scand(void *data)
268{
269 struct dlm_ls *ls;
David Teiglandc1dcf652008-08-18 14:03:25 -0500270
David Teiglande7fd4172006-01-18 09:30:29 +0000271 while (!kthread_should_stop()) {
David Teiglandc1dcf652008-08-18 14:03:25 -0500272 ls = find_ls_to_scan();
273 if (ls) {
David Teigland85e86ed2007-05-18 08:58:15 -0500274 if (dlm_lock_recovery_try(ls)) {
David Teiglandc1dcf652008-08-18 14:03:25 -0500275 ls->ls_scan_time = jiffies;
David Teigland85e86ed2007-05-18 08:58:15 -0500276 dlm_scan_rsbs(ls);
David Teigland3ae1acf2007-05-18 08:59:31 -0500277 dlm_scan_timeout(ls);
David Teiglandc6ff6692011-03-28 14:17:26 -0500278 dlm_scan_waiters(ls);
David Teigland85e86ed2007-05-18 08:58:15 -0500279 dlm_unlock_recovery(ls);
David Teiglandc1dcf652008-08-18 14:03:25 -0500280 } else {
281 ls->ls_scan_time += HZ;
David Teigland85e86ed2007-05-18 08:58:15 -0500282 }
David Teiglandc6ff6692011-03-28 14:17:26 -0500283 continue;
David Teigland85e86ed2007-05-18 08:58:15 -0500284 }
David Teiglandc6ff6692011-03-28 14:17:26 -0500285 schedule_timeout_interruptible(dlm_config.ci_scan_secs * HZ);
David Teiglande7fd4172006-01-18 09:30:29 +0000286 }
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
David Teiglande7fd4172006-01-18 09:30:29 +0000308struct 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
David Teigland597d0ca2006-07-12 16:44:04 -0500326struct dlm_ls *dlm_find_lockspace_local(dlm_lockspace_t *lockspace)
David Teiglande7fd4172006-01-18 09:30:29 +0000327{
David Teigland597d0ca2006-07-12 16:44:04 -0500328 struct dlm_ls *ls;
David Teiglande7fd4172006-01-18 09:30:29 +0000329
330 spin_lock(&lslist_lock);
David Teigland597d0ca2006-07-12 16:44:04 -0500331 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:
David Teiglande7fd4172006-01-18 09:30:29 +0000356 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) {
David Teigland0f8e0d92008-08-06 13:30:24 -0500372 WARN_ON(ls->ls_create_count != 0);
David Teiglande7fd4172006-01-18 09:30:29 +0000373 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
David Teiglande7fd4172006-01-18 09:30:29 +0000386 error = dlm_scand_start();
387 if (error) {
388 log_print("cannot start dlm_scand thread %d", error);
David Teigland23e8e1a2011-04-05 13:16:24 -0500389 goto fail;
David Teiglande7fd4172006-01-18 09:30:29 +0000390 }
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();
David Teiglande7fd4172006-01-18 09:30:29 +0000403 fail:
404 return error;
405}
406
407static void threads_stop(void)
408{
409 dlm_scand_stop();
410 dlm_lowcomms_stop();
David Teiglande7fd4172006-01-18 09:30:29 +0000411}
412
David Teigland60f98d12011-11-02 14:30:58 -0500413static int new_lockspace(const char *name, const char *cluster,
414 uint32_t flags, int lvblen,
415 const struct dlm_lockspace_ops *ops, void *ops_arg,
416 int *ops_result, dlm_lockspace_t **lockspace)
David Teiglande7fd4172006-01-18 09:30:29 +0000417{
418 struct dlm_ls *ls;
David Teigland0f8e0d92008-08-06 13:30:24 -0500419 int i, size, error;
David Teigland79d72b52007-05-18 09:02:20 -0500420 int do_unreg = 0;
David Teigland60f98d12011-11-02 14:30:58 -0500421 int namelen = strlen(name);
David Teiglande7fd4172006-01-18 09:30:29 +0000422
Tycho Andersen3f0806d2018-11-02 14:18:21 -0600423 if (namelen > DLM_LOCKSPACE_LEN || namelen == 0)
David Teiglande7fd4172006-01-18 09:30:29 +0000424 return -EINVAL;
425
426 if (!lvblen || (lvblen % 8))
427 return -EINVAL;
428
429 if (!try_module_get(THIS_MODULE))
430 return -EINVAL;
431
David Teiglanddc68c7e2008-08-18 11:43:30 -0500432 if (!dlm_user_daemon_available()) {
David Teigland60f98d12011-11-02 14:30:58 -0500433 log_print("dlm user daemon not available");
434 error = -EUNATCH;
435 goto out;
436 }
437
438 if (ops && ops_result) {
439 if (!dlm_config.ci_recover_callbacks)
440 *ops_result = -EOPNOTSUPP;
441 else
442 *ops_result = 0;
443 }
444
Zhu Lingshan3b0e7612017-07-11 09:26:55 -0500445 if (!cluster)
446 log_print("dlm cluster name '%s' is being used without an application provided cluster name",
447 dlm_config.ci_cluster_name);
448
David Teigland60f98d12011-11-02 14:30:58 -0500449 if (dlm_config.ci_recover_callbacks && cluster &&
450 strncmp(cluster, dlm_config.ci_cluster_name, DLM_LOCKSPACE_LEN)) {
Gang He8e174372017-05-18 10:42:12 +0800451 log_print("dlm cluster name '%s' does not match "
452 "the application cluster name '%s'",
David Teigland60f98d12011-11-02 14:30:58 -0500453 dlm_config.ci_cluster_name, cluster);
454 error = -EBADR;
455 goto out;
David Teiglanddc68c7e2008-08-18 11:43:30 -0500456 }
457
David Teigland0f8e0d92008-08-06 13:30:24 -0500458 error = 0;
459
460 spin_lock(&lslist_lock);
461 list_for_each_entry(ls, &lslist, ls_list) {
462 WARN_ON(ls->ls_create_count <= 0);
463 if (ls->ls_namelen != namelen)
464 continue;
465 if (memcmp(ls->ls_name, name, namelen))
466 continue;
467 if (flags & DLM_LSFL_NEWEXCL) {
468 error = -EEXIST;
469 break;
470 }
471 ls->ls_create_count++;
David Teigland8511a272009-04-08 15:38:43 -0500472 *lockspace = ls;
473 error = 1;
David Teigland0f8e0d92008-08-06 13:30:24 -0500474 break;
David Teiglande7fd4172006-01-18 09:30:29 +0000475 }
David Teigland0f8e0d92008-08-06 13:30:24 -0500476 spin_unlock(&lslist_lock);
477
David Teigland0f8e0d92008-08-06 13:30:24 -0500478 if (error)
David Teigland8511a272009-04-08 15:38:43 -0500479 goto out;
David Teigland0f8e0d92008-08-06 13:30:24 -0500480
481 error = -ENOMEM;
David Teiglande7fd4172006-01-18 09:30:29 +0000482
David Teigland573c24c2009-11-30 16:34:43 -0600483 ls = kzalloc(sizeof(struct dlm_ls) + namelen, GFP_NOFS);
David Teiglande7fd4172006-01-18 09:30:29 +0000484 if (!ls)
485 goto out;
David Teiglande7fd4172006-01-18 09:30:29 +0000486 memcpy(ls->ls_name, name, namelen);
487 ls->ls_namelen = namelen;
David Teiglande7fd4172006-01-18 09:30:29 +0000488 ls->ls_lvblen = lvblen;
489 ls->ls_count = 0;
490 ls->ls_flags = 0;
David Teiglandc1dcf652008-08-18 14:03:25 -0500491 ls->ls_scan_time = jiffies;
David Teiglande7fd4172006-01-18 09:30:29 +0000492
David Teigland60f98d12011-11-02 14:30:58 -0500493 if (ops && dlm_config.ci_recover_callbacks) {
494 ls->ls_ops = ops;
495 ls->ls_ops_arg = ops_arg;
496 }
497
David Teigland3ae1acf2007-05-18 08:59:31 -0500498 if (flags & DLM_LSFL_TIMEWARN)
499 set_bit(LSFL_TIMEWARN, &ls->ls_flags);
David Teigland3ae1acf2007-05-18 08:59:31 -0500500
David Teiglandfad59c12007-06-11 10:47:18 -0500501 /* ls_exflags are forced to match among nodes, and we don't
David Teigland0f8e0d92008-08-06 13:30:24 -0500502 need to require all nodes to have some flags set */
503 ls->ls_exflags = (flags & ~(DLM_LSFL_TIMEWARN | DLM_LSFL_FS |
504 DLM_LSFL_NEWEXCL));
David Teiglandfad59c12007-06-11 10:47:18 -0500505
David Teigland68c817a2007-01-09 09:41:48 -0600506 size = dlm_config.ci_rsbtbl_size;
David Teiglande7fd4172006-01-18 09:30:29 +0000507 ls->ls_rsbtbl_size = size;
508
Kees Cook42bc47b2018-06-12 14:27:11 -0700509 ls->ls_rsbtbl = vmalloc(array_size(size, sizeof(struct dlm_rsbtable)));
David Teiglande7fd4172006-01-18 09:30:29 +0000510 if (!ls->ls_rsbtbl)
511 goto out_lsfree;
512 for (i = 0; i < size; i++) {
Bob Peterson9beb3bf2011-10-26 15:24:55 -0500513 ls->ls_rsbtbl[i].keep.rb_node = NULL;
514 ls->ls_rsbtbl[i].toss.rb_node = NULL;
David Teiglandc7be7612009-01-07 16:50:41 -0600515 spin_lock_init(&ls->ls_rsbtbl[i].lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000516 }
517
David Teigland05c32f42012-06-14 12:17:32 -0500518 spin_lock_init(&ls->ls_remove_spin);
519
520 for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++) {
521 ls->ls_remove_names[i] = kzalloc(DLM_RESNAME_MAXLEN+1,
522 GFP_KERNEL);
523 if (!ls->ls_remove_names[i])
524 goto out_rsbtbl;
525 }
526
David Teigland3d6aa672011-07-06 17:00:54 -0500527 idr_init(&ls->ls_lkbidr);
528 spin_lock_init(&ls->ls_lkbidr_spin);
David Teiglande7fd4172006-01-18 09:30:29 +0000529
David Teiglande7fd4172006-01-18 09:30:29 +0000530 INIT_LIST_HEAD(&ls->ls_waiters);
David Teigland90135922006-01-20 08:47:07 +0000531 mutex_init(&ls->ls_waiters_mutex);
David Teiglandef0c2bb2007-03-28 09:56:46 -0500532 INIT_LIST_HEAD(&ls->ls_orphans);
533 mutex_init(&ls->ls_orphans_mutex);
David Teigland3ae1acf2007-05-18 08:59:31 -0500534 INIT_LIST_HEAD(&ls->ls_timeout);
535 mutex_init(&ls->ls_timeout_mutex);
David Teiglande7fd4172006-01-18 09:30:29 +0000536
David Teigland3881ac02011-07-07 14:05:03 -0500537 INIT_LIST_HEAD(&ls->ls_new_rsb);
538 spin_lock_init(&ls->ls_new_rsb_spin);
539
David Teiglande7fd4172006-01-18 09:30:29 +0000540 INIT_LIST_HEAD(&ls->ls_nodes);
541 INIT_LIST_HEAD(&ls->ls_nodes_gone);
542 ls->ls_num_nodes = 0;
543 ls->ls_low_nodeid = 0;
544 ls->ls_total_weight = 0;
545 ls->ls_node_array = NULL;
546
547 memset(&ls->ls_stub_rsb, 0, sizeof(struct dlm_rsb));
548 ls->ls_stub_rsb.res_ls = ls;
549
David Teigland5de63192006-07-25 13:44:31 -0500550 ls->ls_debug_rsb_dentry = NULL;
551 ls->ls_debug_waiters_dentry = NULL;
David Teiglande7fd4172006-01-18 09:30:29 +0000552
553 init_waitqueue_head(&ls->ls_uevent_wait);
554 ls->ls_uevent_result = 0;
David Teigland8b0e7b22007-05-18 09:03:35 -0500555 init_completion(&ls->ls_members_done);
556 ls->ls_members_result = -1;
David Teiglande7fd4172006-01-18 09:30:29 +0000557
David Teigland23e8e1a2011-04-05 13:16:24 -0500558 mutex_init(&ls->ls_cb_mutex);
559 INIT_LIST_HEAD(&ls->ls_cb_delay);
560
David Teiglande7fd4172006-01-18 09:30:29 +0000561 ls->ls_recoverd_task = NULL;
David Teigland90135922006-01-20 08:47:07 +0000562 mutex_init(&ls->ls_recoverd_active);
David Teiglande7fd4172006-01-18 09:30:29 +0000563 spin_lock_init(&ls->ls_recover_lock);
David Teigland98f176f2006-11-27 13:19:28 -0600564 spin_lock_init(&ls->ls_rcom_spin);
565 get_random_bytes(&ls->ls_rcom_seq, sizeof(uint64_t));
David Teiglande7fd4172006-01-18 09:30:29 +0000566 ls->ls_recover_status = 0;
567 ls->ls_recover_seq = 0;
568 ls->ls_recover_args = NULL;
569 init_rwsem(&ls->ls_in_recovery);
David Teiglandc36258b2007-09-27 15:53:38 -0500570 init_rwsem(&ls->ls_recv_active);
David Teiglande7fd4172006-01-18 09:30:29 +0000571 INIT_LIST_HEAD(&ls->ls_requestqueue);
David Teigland90135922006-01-20 08:47:07 +0000572 mutex_init(&ls->ls_requestqueue_mutex);
David Teigland597d0ca2006-07-12 16:44:04 -0500573 mutex_init(&ls->ls_clear_proc_locks);
David Teiglande7fd4172006-01-18 09:30:29 +0000574
Alexander Aring9f8f9c72020-11-02 20:04:17 -0500575 ls->ls_recover_buf = kmalloc(LOWCOMMS_MAX_TX_BUFFER_LEN, GFP_NOFS);
David Teiglande7fd4172006-01-18 09:30:29 +0000576 if (!ls->ls_recover_buf)
David Teigland05c32f42012-06-14 12:17:32 -0500577 goto out_lkbidr;
David Teiglande7fd4172006-01-18 09:30:29 +0000578
David Teigland757a4272011-10-20 13:26:28 -0500579 ls->ls_slot = 0;
580 ls->ls_num_slots = 0;
581 ls->ls_slots_size = 0;
582 ls->ls_slots = NULL;
583
David Teiglande7fd4172006-01-18 09:30:29 +0000584 INIT_LIST_HEAD(&ls->ls_recover_list);
585 spin_lock_init(&ls->ls_recover_list_lock);
David Teigland1d7c4842012-05-15 16:07:49 -0500586 idr_init(&ls->ls_recover_idr);
587 spin_lock_init(&ls->ls_recover_idr_lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000588 ls->ls_recover_list_count = 0;
David Teigland597d0ca2006-07-12 16:44:04 -0500589 ls->ls_local_handle = ls;
David Teiglande7fd4172006-01-18 09:30:29 +0000590 init_waitqueue_head(&ls->ls_wait_general);
591 INIT_LIST_HEAD(&ls->ls_root_list);
592 init_rwsem(&ls->ls_root_sem);
593
David Teigland5f88f1e2006-08-24 14:47:20 -0500594 spin_lock(&lslist_lock);
David Teigland0f8e0d92008-08-06 13:30:24 -0500595 ls->ls_create_count = 1;
David Teigland5f88f1e2006-08-24 14:47:20 -0500596 list_add(&ls->ls_list, &lslist);
597 spin_unlock(&lslist_lock);
598
David Teigland23e8e1a2011-04-05 13:16:24 -0500599 if (flags & DLM_LSFL_FS) {
600 error = dlm_callback_start(ls);
601 if (error) {
602 log_error(ls, "can't start dlm_callback %d", error);
603 goto out_delist;
604 }
605 }
606
David Teigland475f2302012-08-02 11:08:21 -0500607 init_waitqueue_head(&ls->ls_recover_lock_wait);
608
609 /*
610 * Once started, dlm_recoverd first looks for ls in lslist, then
611 * initializes ls_in_recovery as locked in "down" mode. We need
612 * to wait for the wakeup from dlm_recoverd because in_recovery
613 * has to start out in down mode.
614 */
615
David Teiglande7fd4172006-01-18 09:30:29 +0000616 error = dlm_recoverd_start(ls);
617 if (error) {
618 log_error(ls, "can't start dlm_recoverd %d", error);
David Teigland23e8e1a2011-04-05 13:16:24 -0500619 goto out_callback;
David Teiglande7fd4172006-01-18 09:30:29 +0000620 }
621
David Teigland475f2302012-08-02 11:08:21 -0500622 wait_event(ls->ls_recover_lock_wait,
623 test_bit(LSFL_RECOVER_LOCK, &ls->ls_flags));
624
Wang Hai0ffddaf2020-06-15 11:25:33 +0800625 /* let kobject handle freeing of ls if there's an error */
626 do_unreg = 1;
627
Greg Kroah-Hartman901195e2007-12-17 15:54:39 -0400628 ls->ls_kobj.kset = dlm_kset;
629 error = kobject_init_and_add(&ls->ls_kobj, &dlm_ktype, NULL,
630 "%s", ls->ls_name);
David Teiglande7fd4172006-01-18 09:30:29 +0000631 if (error)
David Teigland23e8e1a2011-04-05 13:16:24 -0500632 goto out_recoverd;
Greg Kroah-Hartman901195e2007-12-17 15:54:39 -0400633 kobject_uevent(&ls->ls_kobj, KOBJ_ADD);
David Teigland79d72b52007-05-18 09:02:20 -0500634
David Teigland8b0e7b22007-05-18 09:03:35 -0500635 /* This uevent triggers dlm_controld in userspace to add us to the
636 group of nodes that are members of this lockspace (managed by the
637 cluster infrastructure.) Once it's done that, it tells us who the
638 current lockspace members are (via configfs) and then tells the
639 lockspace to start running (via sysfs) in dlm_ls_start(). */
640
David Teiglande7fd4172006-01-18 09:30:29 +0000641 error = do_uevent(ls, 1);
642 if (error)
David Teigland23e8e1a2011-04-05 13:16:24 -0500643 goto out_recoverd;
David Teigland79d72b52007-05-18 09:02:20 -0500644
David Teigland8b0e7b22007-05-18 09:03:35 -0500645 wait_for_completion(&ls->ls_members_done);
646 error = ls->ls_members_result;
647 if (error)
648 goto out_members;
649
David Teigland79d72b52007-05-18 09:02:20 -0500650 dlm_create_debug_file(ls);
651
David Teigland075f0172014-02-14 11:54:44 -0600652 log_rinfo(ls, "join complete");
David Teiglande7fd4172006-01-18 09:30:29 +0000653 *lockspace = ls;
654 return 0;
655
David Teigland8b0e7b22007-05-18 09:03:35 -0500656 out_members:
657 do_uevent(ls, 0);
658 dlm_clear_members(ls);
659 kfree(ls->ls_node_array);
David Teigland23e8e1a2011-04-05 13:16:24 -0500660 out_recoverd:
David Teigland5f88f1e2006-08-24 14:47:20 -0500661 dlm_recoverd_stop(ls);
David Teigland23e8e1a2011-04-05 13:16:24 -0500662 out_callback:
663 dlm_callback_stop(ls);
David Teigland79d72b52007-05-18 09:02:20 -0500664 out_delist:
David Teiglande7fd4172006-01-18 09:30:29 +0000665 spin_lock(&lslist_lock);
666 list_del(&ls->ls_list);
667 spin_unlock(&lslist_lock);
David Teigland1d7c4842012-05-15 16:07:49 -0500668 idr_destroy(&ls->ls_recover_idr);
David Teiglande7fd4172006-01-18 09:30:29 +0000669 kfree(ls->ls_recover_buf);
David Teigland05c32f42012-06-14 12:17:32 -0500670 out_lkbidr:
David Teigland3d6aa672011-07-06 17:00:54 -0500671 idr_destroy(&ls->ls_lkbidr);
Vasily Averinb9828962018-11-15 13:15:05 +0300672 out_rsbtbl:
Thomas Meyer34568802018-12-03 10:02:01 -0600673 for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++)
674 kfree(ls->ls_remove_names[i]);
Bryn M. Reevesc282af42011-07-01 15:49:23 -0500675 vfree(ls->ls_rsbtbl);
David Teiglande7fd4172006-01-18 09:30:29 +0000676 out_lsfree:
David Teigland79d72b52007-05-18 09:02:20 -0500677 if (do_unreg)
Greg Kroah-Hartman197b12d2007-12-20 08:13:05 -0800678 kobject_put(&ls->ls_kobj);
David Teigland79d72b52007-05-18 09:02:20 -0500679 else
680 kfree(ls);
David Teiglande7fd4172006-01-18 09:30:29 +0000681 out:
682 module_put(THIS_MODULE);
683 return error;
684}
685
David Teigland60f98d12011-11-02 14:30:58 -0500686int dlm_new_lockspace(const char *name, const char *cluster,
687 uint32_t flags, int lvblen,
688 const struct dlm_lockspace_ops *ops, void *ops_arg,
689 int *ops_result, dlm_lockspace_t **lockspace)
David Teiglande7fd4172006-01-18 09:30:29 +0000690{
691 int error = 0;
692
David Teigland90135922006-01-20 08:47:07 +0000693 mutex_lock(&ls_lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000694 if (!ls_count)
695 error = threads_start();
696 if (error)
697 goto out;
698
David Teigland60f98d12011-11-02 14:30:58 -0500699 error = new_lockspace(name, cluster, flags, lvblen, ops, ops_arg,
700 ops_result, lockspace);
David Teiglande7fd4172006-01-18 09:30:29 +0000701 if (!error)
702 ls_count++;
David Teigland8511a272009-04-08 15:38:43 -0500703 if (error > 0)
704 error = 0;
705 if (!ls_count)
David Teigland8b0e7b22007-05-18 09:03:35 -0500706 threads_stop();
David Teiglande7fd4172006-01-18 09:30:29 +0000707 out:
David Teigland90135922006-01-20 08:47:07 +0000708 mutex_unlock(&ls_lock);
David Teiglande7fd4172006-01-18 09:30:29 +0000709 return error;
710}
711
David Teigland3d6aa672011-07-06 17:00:54 -0500712static int lkb_idr_is_local(int id, void *p, void *data)
David Teiglande7fd4172006-01-18 09:30:29 +0000713{
David Teigland3d6aa672011-07-06 17:00:54 -0500714 struct dlm_lkb *lkb = p;
David Teiglande7fd4172006-01-18 09:30:29 +0000715
Bart Van Asschea97f4a62013-10-16 14:20:25 +0200716 return lkb->lkb_nodeid == 0 && lkb->lkb_grmode != DLM_LOCK_IV;
David Teigland3d6aa672011-07-06 17:00:54 -0500717}
David Teiglande7fd4172006-01-18 09:30:29 +0000718
David Teigland3d6aa672011-07-06 17:00:54 -0500719static int lkb_idr_is_any(int id, void *p, void *data)
720{
721 return 1;
722}
723
724static int lkb_idr_free(int id, void *p, void *data)
725{
726 struct dlm_lkb *lkb = p;
727
David Teigland3d6aa672011-07-06 17:00:54 -0500728 if (lkb->lkb_lvbptr && lkb->lkb_flags & DLM_IFL_MSTCPY)
729 dlm_free_lvb(lkb->lkb_lvbptr);
730
731 dlm_free_lkb(lkb);
732 return 0;
733}
734
735/* NOTE: We check the lkbidr here rather than the resource table.
736 This is because there may be LKBs queued as ASTs that have been unlinked
737 from their RSBs and are pending deletion once the AST has been delivered */
738
739static int lockspace_busy(struct dlm_ls *ls, int force)
740{
741 int rv;
742
743 spin_lock(&ls->ls_lkbidr_spin);
744 if (force == 0) {
745 rv = idr_for_each(&ls->ls_lkbidr, lkb_idr_is_any, ls);
746 } else if (force == 1) {
747 rv = idr_for_each(&ls->ls_lkbidr, lkb_idr_is_local, ls);
748 } else {
749 rv = 0;
David Teiglande7fd4172006-01-18 09:30:29 +0000750 }
David Teigland3d6aa672011-07-06 17:00:54 -0500751 spin_unlock(&ls->ls_lkbidr_spin);
752 return rv;
David Teiglande7fd4172006-01-18 09:30:29 +0000753}
754
755static int release_lockspace(struct dlm_ls *ls, int force)
756{
David Teiglande7fd4172006-01-18 09:30:29 +0000757 struct dlm_rsb *rsb;
Bob Peterson9beb3bf2011-10-26 15:24:55 -0500758 struct rb_node *n;
David Teigland0f8e0d92008-08-06 13:30:24 -0500759 int i, busy, rv;
David Teiglande7fd4172006-01-18 09:30:29 +0000760
David Teigland3d6aa672011-07-06 17:00:54 -0500761 busy = lockspace_busy(ls, force);
David Teigland0f8e0d92008-08-06 13:30:24 -0500762
763 spin_lock(&lslist_lock);
764 if (ls->ls_create_count == 1) {
David Teigland3d6aa672011-07-06 17:00:54 -0500765 if (busy) {
David Teigland0f8e0d92008-08-06 13:30:24 -0500766 rv = -EBUSY;
David Teigland3d6aa672011-07-06 17:00:54 -0500767 } else {
David Teigland0f8e0d92008-08-06 13:30:24 -0500768 /* remove_lockspace takes ls off lslist */
769 ls->ls_create_count = 0;
770 rv = 0;
771 }
772 } else if (ls->ls_create_count > 1) {
773 rv = --ls->ls_create_count;
774 } else {
775 rv = -EINVAL;
776 }
777 spin_unlock(&lslist_lock);
778
779 if (rv) {
780 log_debug(ls, "release_lockspace no remove %d", rv);
781 return rv;
782 }
783
784 dlm_device_deregister(ls);
David Teiglande7fd4172006-01-18 09:30:29 +0000785
David Teiglanddc68c7e2008-08-18 11:43:30 -0500786 if (force < 3 && dlm_user_daemon_available())
David Teiglande7fd4172006-01-18 09:30:29 +0000787 do_uevent(ls, 0);
788
789 dlm_recoverd_stop(ls);
790
David Teigland23e8e1a2011-04-05 13:16:24 -0500791 dlm_callback_stop(ls);
792
David Teiglande7fd4172006-01-18 09:30:29 +0000793 remove_lockspace(ls);
794
795 dlm_delete_debug_file(ls);
796
David Teigland8fc6ed92018-11-15 11:17:40 -0600797 idr_destroy(&ls->ls_recover_idr);
David Teiglande7fd4172006-01-18 09:30:29 +0000798 kfree(ls->ls_recover_buf);
799
800 /*
David Teigland3d6aa672011-07-06 17:00:54 -0500801 * Free all lkb's in idr
David Teiglande7fd4172006-01-18 09:30:29 +0000802 */
803
David Teigland3d6aa672011-07-06 17:00:54 -0500804 idr_for_each(&ls->ls_lkbidr, lkb_idr_free, ls);
David Teigland3d6aa672011-07-06 17:00:54 -0500805 idr_destroy(&ls->ls_lkbidr);
David Teiglande7fd4172006-01-18 09:30:29 +0000806
David Teiglande7fd4172006-01-18 09:30:29 +0000807 /*
808 * Free all rsb's on rsbtbl[] lists
809 */
810
811 for (i = 0; i < ls->ls_rsbtbl_size; i++) {
Bob Peterson9beb3bf2011-10-26 15:24:55 -0500812 while ((n = rb_first(&ls->ls_rsbtbl[i].keep))) {
813 rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
814 rb_erase(n, &ls->ls_rsbtbl[i].keep);
David Teigland52bda2b2007-11-07 09:06:49 -0600815 dlm_free_rsb(rsb);
David Teiglande7fd4172006-01-18 09:30:29 +0000816 }
817
Bob Peterson9beb3bf2011-10-26 15:24:55 -0500818 while ((n = rb_first(&ls->ls_rsbtbl[i].toss))) {
819 rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
820 rb_erase(n, &ls->ls_rsbtbl[i].toss);
David Teigland52bda2b2007-11-07 09:06:49 -0600821 dlm_free_rsb(rsb);
David Teiglande7fd4172006-01-18 09:30:29 +0000822 }
823 }
824
Bryn M. Reevesc282af42011-07-01 15:49:23 -0500825 vfree(ls->ls_rsbtbl);
David Teiglande7fd4172006-01-18 09:30:29 +0000826
David Teigland05c32f42012-06-14 12:17:32 -0500827 for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++)
828 kfree(ls->ls_remove_names[i]);
829
David Teigland3881ac02011-07-07 14:05:03 -0500830 while (!list_empty(&ls->ls_new_rsb)) {
831 rsb = list_first_entry(&ls->ls_new_rsb, struct dlm_rsb,
832 res_hashchain);
833 list_del(&rsb->res_hashchain);
834 dlm_free_rsb(rsb);
835 }
836
David Teiglande7fd4172006-01-18 09:30:29 +0000837 /*
838 * Free structures on any other lists
839 */
840
David Teigland2896ee32006-11-27 11:31:22 -0600841 dlm_purge_requestqueue(ls);
David Teiglande7fd4172006-01-18 09:30:29 +0000842 kfree(ls->ls_recover_args);
David Teiglande7fd4172006-01-18 09:30:29 +0000843 dlm_clear_members(ls);
844 dlm_clear_members_gone(ls);
845 kfree(ls->ls_node_array);
David Teigland075f0172014-02-14 11:54:44 -0600846 log_rinfo(ls, "release_lockspace final free");
Greg Kroah-Hartman197b12d2007-12-20 08:13:05 -0800847 kobject_put(&ls->ls_kobj);
David Teigland79d72b52007-05-18 09:02:20 -0500848 /* The ls structure will be freed when the kobject is done with */
David Teiglande7fd4172006-01-18 09:30:29 +0000849
David Teiglande7fd4172006-01-18 09:30:29 +0000850 module_put(THIS_MODULE);
851 return 0;
852}
853
854/*
855 * Called when a system has released all its locks and is not going to use the
856 * lockspace any longer. We free everything we're managing for this lockspace.
857 * Remaining nodes will go through the recovery process as if we'd died. The
858 * lockspace must continue to function as usual, participating in recoveries,
859 * until this returns.
860 *
861 * Force has 4 possible values:
862 * 0 - don't destroy locksapce if it has any LKBs
863 * 1 - destroy lockspace if it has remote LKBs but not if it has local LKBs
864 * 2 - destroy lockspace regardless of LKBs
865 * 3 - destroy lockspace as part of a forced shutdown
866 */
867
868int dlm_release_lockspace(void *lockspace, int force)
869{
870 struct dlm_ls *ls;
David Teigland0f8e0d92008-08-06 13:30:24 -0500871 int error;
David Teiglande7fd4172006-01-18 09:30:29 +0000872
873 ls = dlm_find_lockspace_local(lockspace);
874 if (!ls)
875 return -EINVAL;
876 dlm_put_lockspace(ls);
David Teigland0f8e0d92008-08-06 13:30:24 -0500877
878 mutex_lock(&ls_lock);
879 error = release_lockspace(ls, force);
880 if (!error)
881 ls_count--;
David Teigland278afcb2008-11-13 13:22:34 -0600882 if (!ls_count)
David Teigland0f8e0d92008-08-06 13:30:24 -0500883 threads_stop();
884 mutex_unlock(&ls_lock);
885
886 return error;
David Teiglande7fd4172006-01-18 09:30:29 +0000887}
888
David Teiglanddc68c7e2008-08-18 11:43:30 -0500889void dlm_stop_lockspaces(void)
890{
891 struct dlm_ls *ls;
David Teigland696b3d82013-06-25 12:48:01 -0500892 int count;
David Teiglanddc68c7e2008-08-18 11:43:30 -0500893
894 restart:
David Teigland696b3d82013-06-25 12:48:01 -0500895 count = 0;
David Teiglanddc68c7e2008-08-18 11:43:30 -0500896 spin_lock(&lslist_lock);
897 list_for_each_entry(ls, &lslist, ls_list) {
David Teigland696b3d82013-06-25 12:48:01 -0500898 if (!test_bit(LSFL_RUNNING, &ls->ls_flags)) {
899 count++;
David Teiglanddc68c7e2008-08-18 11:43:30 -0500900 continue;
David Teigland696b3d82013-06-25 12:48:01 -0500901 }
David Teiglanddc68c7e2008-08-18 11:43:30 -0500902 spin_unlock(&lslist_lock);
903 log_error(ls, "no userland control daemon, stopping lockspace");
904 dlm_ls_stop(ls);
905 goto restart;
906 }
907 spin_unlock(&lslist_lock);
David Teigland696b3d82013-06-25 12:48:01 -0500908
909 if (count)
910 log_print("dlm user daemon left %d lockspaces", count);
David Teiglanddc68c7e2008-08-18 11:43:30 -0500911}
912