]> sourceware.org Git - lvm2.git/blame - lib/activate/activate.c
Add check to vg_commit() to ensure lock is held before writing new VG metadata.
[lvm2.git] / lib / activate / activate.c
CommitLineData
b1713d28 1/*
67cdbd7e 2 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
be684599 3 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
b1713d28 4 *
6606c3ae
AK
5 * This file is part of LVM2.
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
be684599 9 * of the GNU Lesser General Public License v.2.1.
6606c3ae 10 *
be684599 11 * You should have received a copy of the GNU Lesser General Public License
6606c3ae
AK
12 * along with this program; if not, write to the Free Software Foundation,
13 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
b1713d28
JT
14 */
15
d1d9800e 16#include "lib.h"
a381c45a 17#include "metadata.h"
b1713d28 18#include "activate.h"
914c9723 19#include "memlock.h"
78125be9 20#include "display.h"
f7a14956 21#include "fs.h"
f894b4b1 22#include "lvm-exec.h"
7d1552c9 23#include "lvm-file.h"
41b2fd5f 24#include "lvm-string.h"
413cc918 25#include "toolcontext.h"
de6c9183 26#include "dev_manager.h"
de17d760 27#include "str_list.h"
4922197a 28#include "config.h"
352a99b9 29#include "filter.h"
15d91f5a 30#include "segtype.h"
12137231
JT
31
32#include <limits.h>
5986ec94 33#include <fcntl.h>
914c9723 34#include <unistd.h>
12137231 35
6d52fb46 36#define _skip(fmt, args...) log_very_verbose("Skipping: " fmt , ## args)
b1713d28 37
7d1552c9
AK
38int lvm1_present(struct cmd_context *cmd)
39{
40 char path[PATH_MAX];
41
0550c1b6 42 if (dm_snprintf(path, sizeof(path), "%s/lvm/global", cmd->proc_dir)
7d1552c9
AK
43 < 0) {
44 log_error("LVM1 proc global snprintf failed");
45 return 0;
46 }
47
48 if (path_exists(path))
49 return 1;
50 else
51 return 0;
52}
53
6c81ed26
AK
54int list_segment_modules(struct dm_pool *mem, const struct lv_segment *seg,
55 struct list *modules)
56{
57 unsigned int s;
58 struct lv_segment *seg2, *snap_seg;
59 struct list *snh;
60
61 if (seg->segtype->ops->modules_needed &&
62 !seg->segtype->ops->modules_needed(mem, seg, modules)) {
63 log_error("module string allocation failed");
64 return 0;
65 }
66
67 if (lv_is_origin(seg->lv))
68 list_iterate(snh, &seg->lv->snapshot_segs)
69 if (!list_lv_modules(mem,
70 list_struct_base(snh,
71 struct lv_segment,
72 origin_list)->cow,
73 modules))
74 return_0;
75
76 if (lv_is_cow(seg->lv)) {
77 snap_seg = find_cow(seg->lv);
78 if (snap_seg->segtype->ops->modules_needed &&
79 !snap_seg->segtype->ops->modules_needed(mem, snap_seg,
80 modules)) {
81 log_error("snap_seg module string allocation failed");
82 return 0;
83 }
84 }
85
86 for (s = 0; s < seg->area_count; s++) {
87 switch (seg_type(seg, s)) {
88 case AREA_LV:
89 seg2 = find_seg_by_le(seg_lv(seg, s), seg_le(seg, s));
90 if (seg2 && !list_segment_modules(mem, seg2, modules))
91 return_0;
92 break;
93 case AREA_PV:
94 case AREA_UNASSIGNED:
95 ;
96 }
97 }
98
99 return 1;
100}
101
102int list_lv_modules(struct dm_pool *mem, const struct logical_volume *lv,
103 struct list *modules)
104{
105 struct lv_segment *seg;
106
107 list_iterate_items(seg, &lv->segments)
108 if (!list_segment_modules(mem, seg, modules))
109 return_0;
110
111 return 1;
112}
113
199e490e
AK
114#ifndef DEVMAPPER_SUPPORT
115void set_activation(int act)
116{
f2046e0a
AK
117 static int warned = 0;
118
119 if (warned || !act)
120 return;
121
122 log_error("Compiled without libdevmapper support. "
123 "Can't enable activation.");
124
125 warned = 1;
199e490e
AK
126}
127int activation(void)
128{
129 return 0;
130}
131int library_version(char *version, size_t size)
132{
133 return 0;
134}
135int driver_version(char *version, size_t size)
136{
137 return 0;
138}
bbf83db1
AK
139int target_version(const char *target_name, uint32_t *maj,
140 uint32_t *min, uint32_t *patchlevel)
141{
142 return 0;
143}
0ce83a83 144int target_present(const char *target_name, int use_modprobe)
d1f4953a
AK
145{
146 return 0;
147}
f894b4b1 148int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info,
a6b22cf3 149 int with_open_count, int with_read_ahead)
199e490e
AK
150{
151 return 0;
152}
4bd9480d 153int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s,
a6b22cf3 154 struct lvinfo *info, int with_open_count, int with_read_ahead)
4bd9480d
AK
155{
156 return 0;
157}
472ac5bd 158int lv_snapshot_percent(const struct logical_volume *lv, float *percent)
199e490e
AK
159{
160 return 0;
161}
472ac5bd
AK
162int lv_mirror_percent(struct cmd_context *cmd, struct logical_volume *lv,
163 int wait, float *percent, uint32_t *event_nr)
10b29b8d
AK
164{
165 return 0;
166}
199e490e
AK
167int lvs_in_vg_activated(struct volume_group *vg)
168{
169 return 0;
170}
1bf5aae9 171int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg)
b45c9f49
AK
172{
173 return 0;
174}
199e490e
AK
175int lvs_in_vg_opened(struct volume_group *vg)
176{
177 return 0;
178}
658b5812
AK
179int lv_suspend(struct cmd_context *cmd, const char *lvid_s)
180{
181 return 1;
182}
199e490e
AK
183int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s)
184{
185 return 1;
186}
658b5812
AK
187int lv_resume(struct cmd_context *cmd, const char *lvid_s)
188{
189 return 1;
190}
199e490e
AK
191int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s)
192{
193 return 1;
194}
195int lv_deactivate(struct cmd_context *cmd, const char *lvid_s)
196{
197 return 1;
198}
658b5812
AK
199int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
200 int *activate_lv)
201{
202 return 1;
203}
07d31831 204int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive)
199e490e
AK
205{
206 return 1;
207}
07d31831 208int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive)
658b5812
AK
209{
210 return 1;
211}
f7dd6d84
AK
212
213int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
214{
215 return 1;
216}
217
0ce83a83 218int pv_uses_vg(struct physical_volume *pv,
3e3d5d85 219 struct volume_group *vg)
352a99b9
AK
220{
221 return 0;
222}
223
2293567c
AK
224void activation_release(void)
225{
226 return;
227}
228
914c9723
AK
229void activation_exit(void)
230{
231 return;
232}
199e490e
AK
233
234#else /* DEVMAPPER_SUPPORT */
235
d1d9800e
AK
236static int _activation = 1;
237
8ef2b021 238void set_activation(int act)
d1d9800e 239{
8ef2b021 240 if (act == _activation)
d1d9800e
AK
241 return;
242
8ef2b021 243 _activation = act;
d1d9800e
AK
244 if (_activation)
245 log_verbose("Activation enabled. Device-mapper kernel "
246 "driver will be used.");
247 else
e7ddf416 248 log_warn("WARNING: Activation disabled. No device-mapper "
bfe2b548 249 "interaction will be attempted.");
d1d9800e
AK
250}
251
8ef2b021 252int activation(void)
d1d9800e
AK
253{
254 return _activation;
255}
256
de17d760
AK
257static int _passes_activation_filter(struct cmd_context *cmd,
258 struct logical_volume *lv)
259{
25579907 260 const struct config_node *cn;
de17d760
AK
261 struct config_value *cv;
262 char *str;
263 char path[PATH_MAX];
264
2293567c 265 if (!(cn = find_config_tree_node(cmd, "activation/volume_list"))) {
25579907 266 /* If no host tags defined, activate */
de17d760
AK
267 if (list_empty(&cmd->tags))
268 return 1;
269
270 /* If any host tag matches any LV or VG tag, activate */
271 if (str_list_match_list(&cmd->tags, &lv->tags) ||
272 str_list_match_list(&cmd->tags, &lv->vg->tags))
273 return 1;
274
275 /* Don't activate */
276 return 0;
277 }
278
279 for (cv = cn->v; cv; cv = cv->next) {
280 if (cv->type != CFG_STRING) {
281 log_error("Ignoring invalid string in config file "
282 "activation/volume_list");
283 continue;
284 }
285 str = cv->v.str;
286 if (!*str) {
287 log_error("Ignoring empty string in config file "
288 "activation/volume_list");
289 continue;
290 }
291
292 /* Tag? */
293 if (*str == '@') {
294 str++;
295 if (!*str) {
296 log_error("Ignoring empty tag in config file "
297 "activation/volume_list");
298 continue;
299 }
300 /* If any host tag matches any LV or VG tag, activate */
301 if (!strcmp(str, "*")) {
302 if (str_list_match_list(&cmd->tags, &lv->tags)
303 || str_list_match_list(&cmd->tags,
304 &lv->vg->tags))
305 return 1;
306 else
307 continue;
308 }
309 /* If supplied tag matches LV or VG tag, activate */
310 if (str_list_match_item(&lv->tags, str) ||
311 str_list_match_item(&lv->vg->tags, str))
312 return 1;
313 else
314 continue;
315 }
13835b5f 316 if (!strchr(str, '/')) {
de17d760
AK
317 /* vgname supplied */
318 if (!strcmp(str, lv->vg->name))
319 return 1;
320 else
321 continue;
322 }
323 /* vgname/lvname */
0550c1b6 324 if (dm_snprintf(path, sizeof(path), "%s/%s", lv->vg->name,
de17d760 325 lv->name) < 0) {
0550c1b6 326 log_error("dm_snprintf error from %s/%s", lv->vg->name,
de17d760
AK
327 lv->name);
328 continue;
329 }
330 if (!strcmp(path, str))
331 return 1;
332 }
333
334 return 0;
335}
336
fae0c576
AK
337int library_version(char *version, size_t size)
338{
d1d9800e
AK
339 if (!activation())
340 return 0;
341
f894b4b1 342 return dm_get_library_version(version, size);
fae0c576
AK
343}
344
fae0c576
AK
345int driver_version(char *version, size_t size)
346{
d1d9800e
AK
347 if (!activation())
348 return 0;
349
fae0c576 350 log_very_verbose("Getting driver version");
fae0c576 351
f894b4b1 352 return dm_driver_version(version, size);
fae0c576
AK
353}
354
bbf83db1
AK
355int target_version(const char *target_name, uint32_t *maj,
356 uint32_t *min, uint32_t *patchlevel)
d1f4953a
AK
357{
358 int r = 0;
359 struct dm_task *dmt;
360 struct dm_versions *target, *last_target;
361
d1f4953a 362 log_very_verbose("Getting target version for %s", target_name);
5f4b2acf
AK
363 if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
364 return_0;
d1f4953a
AK
365
366 if (!dm_task_run(dmt)) {
367 log_debug("Failed to get %s target version", target_name);
368 /* Assume this was because LIST_VERSIONS isn't supported */
369 return 1;
370 }
371
372 target = dm_task_get_versions(dmt);
373
374 do {
375 last_target = target;
376
377 if (!strcmp(target_name, target->name)) {
378 r = 1;
bbf83db1
AK
379 *maj = target->version[0];
380 *min = target->version[1];
381 *patchlevel = target->version[2];
d1f4953a
AK
382 goto out;
383 }
384
385 target = (void *) target + target->next;
386 } while (last_target != target);
387
388 out:
389 dm_task_destroy(dmt);
390
391 return r;
392}
393
5f4b2acf 394int target_present(const char *target_name, int use_modprobe)
f894b4b1 395{
bbf83db1 396 uint32_t maj, min, patchlevel;
03b49fe1 397#ifdef MODPROBE_CMD
f894b4b1 398 char module[128];
03b49fe1 399#endif
f894b4b1
AK
400
401 if (!activation())
402 return 0;
403
404#ifdef MODPROBE_CMD
5f4b2acf 405 if (use_modprobe) {
bbf83db1 406 if (target_version(target_name, &maj, &min, &patchlevel))
5f4b2acf 407 return 1;
f894b4b1 408
0550c1b6 409 if (dm_snprintf(module, sizeof(module), "dm-%s", target_name)
5f4b2acf
AK
410 < 0) {
411 log_error("target_present module name too long: %s",
412 target_name);
413 return 0;
414 }
f894b4b1 415
5f4b2acf
AK
416 if (!exec_cmd(MODPROBE_CMD, module, "", ""))
417 return_0;
f894b4b1
AK
418 }
419#endif
420
bbf83db1 421 return target_version(target_name, &maj, &min, &patchlevel);
f894b4b1
AK
422}
423
de6c9183
JT
424/*
425 * Returns 1 if info structure populated, else 0 on failure.
426 */
f894b4b1 427static int _lv_info(struct cmd_context *cmd, const struct logical_volume *lv, int with_mknodes,
a6b22cf3 428 struct lvinfo *info, int with_open_count, int with_read_ahead, unsigned by_uuid_only)
37ed70b9 429{
199e490e 430 struct dm_info dminfo;
b45c9f49 431 char *name = NULL;
4a624ca0 432
d1d9800e
AK
433 if (!activation())
434 return 0;
435
b45c9f49
AK
436 if (!by_uuid_only &&
437 !(name = build_dm_name(cmd->mem, lv->vg->name, lv->name, NULL)))
5f4b2acf 438 return_0;
4a624ca0 439
f894b4b1 440 log_debug("Getting device info for %s", name);
03b49fe1 441 if (!dev_manager_info(lv->vg->cmd->mem, name, lv, with_mknodes,
a6b22cf3
AK
442 with_open_count, with_read_ahead, &dminfo,
443 &info->read_ahead)) {
b45c9f49
AK
444 if (name)
445 dm_pool_free(cmd->mem, name);
5f4b2acf 446 return_0;
f894b4b1 447 }
4a624ca0 448
199e490e
AK
449 info->exists = dminfo.exists;
450 info->suspended = dminfo.suspended;
451 info->open_count = dminfo.open_count;
452 info->major = dminfo.major;
453 info->minor = dminfo.minor;
454 info->read_only = dminfo.read_only;
5f4b2acf
AK
455 info->live_table = dminfo.live_table;
456 info->inactive_table = dminfo.inactive_table;
199e490e 457
b45c9f49
AK
458 if (name)
459 dm_pool_free(cmd->mem, name);
460
f894b4b1 461 return 1;
de6c9183 462}
a62ee8ad 463
f894b4b1 464int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info,
a6b22cf3 465 int with_open_count, int with_read_ahead)
8c0388e4 466{
a6b22cf3 467 return _lv_info(cmd, lv, 0, info, with_open_count, with_read_ahead, 0);
8c0388e4
AK
468}
469
4bd9480d 470int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s,
a6b22cf3 471 struct lvinfo *info, int with_open_count, int with_read_ahead)
4bd9480d
AK
472{
473 struct logical_volume *lv;
474
7a593325 475 if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
4bd9480d
AK
476 return 0;
477
a6b22cf3 478 return _lv_info(cmd, lv, 0, info, with_open_count, with_read_ahead, 0);
4bd9480d
AK
479}
480
1951dba9
AL
481/*
482 * Returns 1 if percent set, else 0 on failure.
483 */
472ac5bd 484int lv_snapshot_percent(const struct logical_volume *lv, float *percent)
1951dba9
AL
485{
486 int r;
487 struct dev_manager *dm;
488
d1d9800e
AK
489 if (!activation())
490 return 0;
491
5f4b2acf
AK
492 if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name)))
493 return_0;
1951dba9 494
c826c0d1 495 if (!(r = dev_manager_snapshot_percent(dm, lv, percent)))
1951dba9 496 stack;
c826c0d1 497
1951dba9
AL
498 dev_manager_destroy(dm);
499
500 return r;
501}
502
10b29b8d 503/* FIXME Merge with snapshot_percent */
472ac5bd
AK
504int lv_mirror_percent(struct cmd_context *cmd, struct logical_volume *lv,
505 int wait, float *percent, uint32_t *event_nr)
10b29b8d
AK
506{
507 int r;
508 struct dev_manager *dm;
b65b777d 509 struct lvinfo info;
10b29b8d 510
876003dc
AK
511 /* If mirrored LV is temporarily shrinked to 1 area (= linear),
512 * it should be considered in-sync. */
513 if (list_size(&lv->segments) == 1 && first_seg(lv)->area_count == 1) {
514 *percent = 100.0;
515 return 1;
516 }
517
10b29b8d
AK
518 if (!activation())
519 return 0;
520
a6b22cf3 521 if (!lv_info(cmd, lv, &info, 0, 0))
5f4b2acf 522 return_0;
b65b777d
AK
523
524 if (!info.exists)
525 return 0;
526
5f4b2acf
AK
527 if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name)))
528 return_0;
10b29b8d
AK
529
530 if (!(r = dev_manager_mirror_percent(dm, lv, wait, percent, event_nr)))
531 stack;
532
533 dev_manager_destroy(dm);
534
535 return r;
536}
537
b45c9f49
AK
538static int _lv_active(struct cmd_context *cmd, struct logical_volume *lv,
539 unsigned by_uuid_only)
2ba80b43 540{
199e490e 541 struct lvinfo info;
2ba80b43 542
a6b22cf3 543 if (!_lv_info(cmd, lv, 0, &info, 0, 0, by_uuid_only)) {
2ba80b43 544 stack;
de6c9183 545 return -1;
2ba80b43
JT
546 }
547
de6c9183 548 return info.exists;
2ba80b43
JT
549}
550
f894b4b1 551static int _lv_open_count(struct cmd_context *cmd, struct logical_volume *lv)
5986ec94 552{
199e490e 553 struct lvinfo info;
5986ec94 554
a6b22cf3 555 if (!lv_info(cmd, lv, &info, 1, 0)) {
5986ec94 556 stack;
de6c9183 557 return -1;
5986ec94
JT
558 }
559
de6c9183 560 return info.open_count;
5986ec94
JT
561}
562
658b5812 563static int _lv_activate_lv(struct logical_volume *lv)
b1713d28 564{
6d52fb46 565 int r;
de6c9183 566 struct dev_manager *dm;
b1713d28 567
5f4b2acf
AK
568 if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name)))
569 return_0;
ae2bb665 570
0fe3a2c5 571 if (!(r = dev_manager_activate(dm, lv)))
6d52fb46 572 stack;
ae2bb665 573
de6c9183 574 dev_manager_destroy(dm);
ae2bb665 575 return r;
b1713d28 576}
a381c45a 577
5f4b2acf 578static int _lv_preload(struct logical_volume *lv)
0a5e4a14 579{
de6c9183
JT
580 int r;
581 struct dev_manager *dm;
37ed70b9 582
5f4b2acf
AK
583 if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name)))
584 return_0;
585
586 if (!(r = dev_manager_preload(dm, lv)))
6d52fb46 587 stack;
5f4b2acf
AK
588
589 dev_manager_destroy(dm);
590 return r;
591}
592
593static int _lv_deactivate(struct logical_volume *lv)
594{
595 int r;
596 struct dev_manager *dm;
597
598 if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name)))
599 return_0;
37ed70b9 600
de6c9183 601 if (!(r = dev_manager_deactivate(dm, lv)))
37ed70b9 602 stack;
37ed70b9 603
de6c9183
JT
604 dev_manager_destroy(dm);
605 return r;
37ed70b9
JT
606}
607
9cd3426d 608static int _lv_suspend_lv(struct logical_volume *lv, int lockfs)
4a624ca0 609{
20c5fcf7
AK
610 int r;
611 struct dev_manager *dm;
c2d72fd4 612
5f4b2acf
AK
613 if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name)))
614 return_0;
0a5e4a14 615
9cd3426d 616 if (!(r = dev_manager_suspend(dm, lv, lockfs)))
37ed70b9 617 stack;
0a5e4a14 618
20c5fcf7
AK
619 dev_manager_destroy(dm);
620 return r;
6d52fb46 621}
4a624ca0 622
8c013da4 623/*
f75c11ed 624 * These two functions return the number of visible LVs in the state,
8c013da4
AK
625 * or -1 on error.
626 */
b45c9f49 627static int _lvs_in_vg_activated(struct volume_group *vg, unsigned by_uuid_only)
f047219b 628{
60f13f01 629 struct lv_list *lvl;
94b8220f 630 int count = 0;
37ed70b9 631
d1d9800e
AK
632 if (!activation())
633 return 0;
634
60f13f01
AK
635 list_iterate_items(lvl, &vg->lvs) {
636 if (lvl->lv->status & VISIBLE_LV)
b45c9f49 637 count += (_lv_active(vg->cmd, lvl->lv, by_uuid_only) == 1);
37ed70b9
JT
638 }
639
640 return count;
f047219b 641}
2ba80b43 642
b45c9f49
AK
643int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg)
644{
645 return _lvs_in_vg_activated(vg, 1);
646}
647
648int lvs_in_vg_activated(struct volume_group *vg)
649{
650 return _lvs_in_vg_activated(vg, 0);
651}
652
08c9ff43 653int lvs_in_vg_opened(const struct volume_group *vg)
2ba80b43 654{
08c9ff43 655 const struct lv_list *lvl;
94b8220f 656 int count = 0;
2ba80b43 657
d1d9800e
AK
658 if (!activation())
659 return 0;
660
60f13f01
AK
661 list_iterate_items(lvl, &vg->lvs) {
662 if (lvl->lv->status & VISIBLE_LV)
f894b4b1 663 count += (_lv_open_count(vg->cmd, lvl->lv) > 0);
2ba80b43
JT
664 }
665
666 return count;
667}
413cc918 668
3e3d5d85 669/*
8a37910d
AK
670 * Returns 0 if an attempt to (un)monitor the device failed.
671 * Returns 1 otherwise.
3e3d5d85 672 */
8a37910d
AK
673int monitor_dev_for_events(struct cmd_context *cmd,
674 struct logical_volume *lv, int monitor)
15d91f5a 675{
ed09d7e3 676#ifdef DMEVENTD
8a37910d
AK
677 int i, pending = 0, monitored;
678 int r = 1;
67961c7c 679 struct list *tmp, *snh, *snht;
15d91f5a 680 struct lv_segment *seg;
24f4552b 681 int (*monitor_fn) (struct lv_segment *s, int e);
4e9083db 682 uint32_t s;
15d91f5a 683
20db8ffc
AK
684 /* skip dmeventd code altogether */
685 if (dmeventd_monitor_mode() == DMEVENTD_MONITOR_IGNORE)
686 return 1;
687
8a37910d
AK
688 /*
689 * Nothing to do if dmeventd configured not to be used.
690 */
691 if (monitor && !dmeventd_monitor_mode())
3e3d5d85
AK
692 return 1;
693
67961c7c
PR
694 /*
695 * In case of a snapshot device, we monitor lv->snapshot->lv,
696 * not the actual LV itself.
697 */
698 if (lv_is_cow(lv))
699 return monitor_dev_for_events(cmd, lv->snapshot->lv, monitor);
700
701 /*
702 * In case this LV is a snapshot origin, we instead monitor
703 * each of its respective snapshots (the origin itself does
704 * not need to be monitored).
705 *
706 * TODO: This may change when snapshots of mirrors are allowed.
707 */
708 if (lv_is_origin(lv)) {
709 list_iterate_safe(snh, snht, &lv->snapshot_segs)
0c06de63
AK
710 if (!monitor_dev_for_events(cmd, list_struct_base(snh,
711 struct lv_segment, origin_list)->cow, monitor))
712 r = 0;
67961c7c
PR
713 return r;
714 }
715
15d91f5a
AK
716 list_iterate(tmp, &lv->segments) {
717 seg = list_item(tmp, struct lv_segment);
718
4e9083db
AK
719 /* Recurse for AREA_LV */
720 for (s = 0; s < seg->area_count; s++) {
721 if (seg_type(seg, s) != AREA_LV)
722 continue;
723 if (!monitor_dev_for_events(cmd, seg_lv(seg, s),
724 monitor)) {
725 log_error("Failed to %smonitor %s",
726 monitor ? "" : "un",
727 seg_lv(seg, s)->name);
728 r = 0;
729 }
730 }
731
8ef6eb30
AK
732 if (!seg_monitored(seg) || (seg->status & PVMOVE))
733 continue;
8a37910d
AK
734
735 monitor_fn = NULL;
ed09d7e3 736
8ef6eb30 737 /* Check monitoring status */
8a37910d
AK
738 if (seg->segtype->ops->target_monitored)
739 monitored = seg->segtype->ops->target_monitored(seg, &pending);
8ef6eb30
AK
740 else
741 continue; /* segtype doesn't support registration */
742
743 /*
744 * FIXME: We should really try again if pending
745 */
8a37910d 746 monitored = (pending) ? 0 : monitored;
8ef6eb30 747
8a37910d
AK
748 if (monitor) {
749 if (monitored)
8ef6eb30 750 log_verbose("%s/%s already monitored.", lv->vg->name, lv->name);
8a37910d
AK
751 else if (seg->segtype->ops->target_monitor_events)
752 monitor_fn = seg->segtype->ops->target_monitor_events;
8ef6eb30 753 } else {
8a37910d 754 if (!monitored)
8ef6eb30 755 log_verbose("%s/%s already not monitored.", lv->vg->name, lv->name);
8a37910d
AK
756 else if (seg->segtype->ops->target_unmonitor_events)
757 monitor_fn = seg->segtype->ops->target_unmonitor_events;
8ef6eb30 758 }
15d91f5a 759
8ef6eb30 760 /* Do [un]monitor */
8a37910d 761 if (!monitor_fn)
3e3d5d85 762 continue;
e24e7130 763
8a37910d
AK
764 log_verbose("%sonitoring %s/%s", monitor ? "M" : "Not m", lv->vg->name, lv->name);
765
3e3d5d85 766 /* FIXME specify events */
57fc4cc0 767 if (!monitor_fn(seg, 0)) {
8a37910d
AK
768 log_error("%s/%s: %s segment monitoring function failed.",
769 lv->vg->name, lv->name, seg->segtype->name);
770 return 0;
e24e7130 771 }
3e3d5d85 772
8ef6eb30
AK
773 /* Check [un]monitor results */
774 /* Try a couple times if pending, but not forever... */
775 for (i = 0; i < 10; i++) {
776 pending = 0;
8a37910d 777 monitored = seg->segtype->ops->target_monitored(seg, &pending);
8ef6eb30 778 if (pending ||
8a37910d
AK
779 (!monitored && monitor) ||
780 (monitored && !monitor))
781 log_very_verbose("%s/%s %smonitoring still pending: waiting...",
782 lv->vg->name, lv->name, monitor ? "" : "un");
8ef6eb30
AK
783 else
784 break;
785 sleep(1);
786 }
787
8a37910d 788 r = (monitored && monitor) || (!monitored && !monitor);
15d91f5a 789 }
e6493477 790
3e3d5d85
AK
791 return r;
792#else
15d91f5a 793 return 1;
3e3d5d85 794#endif
15d91f5a 795}
15d91f5a 796
658b5812
AK
797static int _lv_suspend(struct cmd_context *cmd, const char *lvid_s,
798 int error_if_not_suspended)
413cc918 799{
8b888354 800 struct logical_volume *lv, *lv_pre;
199e490e 801 struct lvinfo info;
9cd3426d 802 int lockfs = 0;
413cc918 803
d1d9800e
AK
804 if (!activation())
805 return 1;
806
8b888354 807 if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
e408d62e 808 return_0;
8b888354 809
7a593325 810 /* Use precommitted metadata if present */
8b888354 811 if (!(lv_pre = lv_from_lvid(cmd, lvid_s, 1)))
e408d62e 812 return_0;
413cc918 813
20c5fcf7
AK
814 if (test_mode()) {
815 _skip("Suspending '%s'.", lv->name);
711f7fc6 816 return 1;
20c5fcf7
AK
817 }
818
a6b22cf3 819 if (!lv_info(cmd, lv, &info, 0, 0))
5f4b2acf 820 return_0;
41967a02 821
914c9723 822 if (!info.exists || info.suspended)
658b5812 823 return error_if_not_suspended ? 0 : 1;
914c9723 824
5f4b2acf 825 /* If VG was precommitted, preload devices for the LV */
8b888354
AK
826 if ((lv_pre->vg->status & PRECOMMITTED)) {
827 if (!_lv_preload(lv_pre)) {
5f4b2acf
AK
828 /* FIXME Revert preloading */
829 return_0;
830 }
831 }
832
8a37910d 833 if (!monitor_dev_for_events(cmd, lv, 0))
e24e7130 834 /* FIXME Consider aborting here */
ed09d7e3
AK
835 stack;
836
914c9723 837 memlock_inc();
9cd3426d
AK
838
839 if (lv_is_origin(lv_pre) || lv_is_cow(lv_pre))
840 lockfs = 1;
841
842 if (!_lv_suspend_lv(lv, lockfs)) {
914c9723
AK
843 memlock_dec();
844 fs_unlock();
845 return 0;
846 }
8c013da4 847
413cc918
AK
848 return 1;
849}
850
658b5812
AK
851/* Returns success if the device is not active */
852int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s)
853{
854 return _lv_suspend(cmd, lvid_s, 0);
855}
856
857int lv_suspend(struct cmd_context *cmd, const char *lvid_s)
858{
859 return _lv_suspend(cmd, lvid_s, 1);
860}
861
862static int _lv_resume(struct cmd_context *cmd, const char *lvid_s,
863 int error_if_not_active)
413cc918
AK
864{
865 struct logical_volume *lv;
199e490e 866 struct lvinfo info;
413cc918 867
d1d9800e
AK
868 if (!activation())
869 return 1;
870
7a593325 871 if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
413cc918
AK
872 return 0;
873
20c5fcf7
AK
874 if (test_mode()) {
875 _skip("Resuming '%s'.", lv->name);
711f7fc6 876 return 1;
20c5fcf7
AK
877 }
878
a6b22cf3 879 if (!lv_info(cmd, lv, &info, 0, 0))
5f4b2acf 880 return_0;
41967a02 881
914c9723 882 if (!info.exists || !info.suspended)
658b5812 883 return error_if_not_active ? 0 : 1;
914c9723 884
658b5812 885 if (!_lv_activate_lv(lv))
914c9723
AK
886 return 0;
887
888 memlock_dec();
889 fs_unlock();
413cc918 890
8a37910d 891 if (!monitor_dev_for_events(cmd, lv, 1))
ed09d7e3 892 stack;
15d91f5a 893
413cc918
AK
894 return 1;
895}
896
658b5812
AK
897/* Returns success if the device is not active */
898int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s)
899{
900 return _lv_resume(cmd, lvid_s, 0);
901}
902
903int lv_resume(struct cmd_context *cmd, const char *lvid_s)
904{
905 return _lv_resume(cmd, lvid_s, 1);
906}
907
be326a2f 908int lv_deactivate(struct cmd_context *cmd, const char *lvid_s)
f4cbeaf0
AK
909{
910 struct logical_volume *lv;
199e490e 911 struct lvinfo info;
914c9723 912 int r;
f4cbeaf0 913
d1d9800e
AK
914 if (!activation())
915 return 1;
916
7a593325 917 if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
f4cbeaf0
AK
918 return 0;
919
20c5fcf7
AK
920 if (test_mode()) {
921 _skip("Deactivating '%s'.", lv->name);
711f7fc6 922 return 1;
20c5fcf7
AK
923 }
924
a6b22cf3 925 if (!lv_info(cmd, lv, &info, 1, 0))
5f4b2acf 926 return_0;
41967a02 927
914c9723
AK
928 if (!info.exists)
929 return 1;
f4cbeaf0 930
c1f50521 931 if (info.open_count && (lv->status & VISIBLE_LV)) {
5f4b2acf 932 log_error("LV %s/%s in use: not deactivating", lv->vg->name,
0cf96f33
AK
933 lv->name);
934 return 0;
935 }
936
8a37910d 937 if (!monitor_dev_for_events(cmd, lv, 0))
ed09d7e3 938 stack;
15d91f5a 939
914c9723
AK
940 memlock_inc();
941 r = _lv_deactivate(lv);
942 memlock_dec();
943 fs_unlock();
944
945 return r;
f4cbeaf0
AK
946}
947
658b5812
AK
948/* Test if LV passes filter */
949int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
950 int *activate_lv)
951{
952 struct logical_volume *lv;
953
954 if (!activation())
955 goto activate;
956
7a593325 957 if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
658b5812
AK
958 return 0;
959
960 if (!_passes_activation_filter(cmd, lv)) {
961 log_verbose("Not activating %s/%s due to config file settings",
962 lv->vg->name, lv->name);
963 *activate_lv = 0;
964 return 1;
965 }
966
967 activate:
968 *activate_lv = 1;
969 return 1;
970}
971
07d31831
AK
972static int _lv_activate(struct cmd_context *cmd, const char *lvid_s,
973 int exclusive, int filter)
f4cbeaf0
AK
974{
975 struct logical_volume *lv;
199e490e 976 struct lvinfo info;
914c9723 977 int r;
f4cbeaf0 978
d1d9800e
AK
979 if (!activation())
980 return 1;
981
7a593325 982 if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
f4cbeaf0
AK
983 return 0;
984
658b5812 985 if (filter && !_passes_activation_filter(cmd, lv)) {
de17d760
AK
986 log_verbose("Not activating %s/%s due to config file settings",
987 lv->vg->name, lv->name);
988 return 0;
989 }
990
20c5fcf7
AK
991 if (test_mode()) {
992 _skip("Activating '%s'.", lv->name);
711f7fc6 993 return 1;
20c5fcf7
AK
994 }
995
a6b22cf3 996 if (!lv_info(cmd, lv, &info, 0, 0))
5f4b2acf 997 return_0;
8c013da4 998
5f4b2acf 999 if (info.exists && !info.suspended && info.live_table)
914c9723 1000 return 1;
f4cbeaf0 1001
07d31831
AK
1002 if (exclusive)
1003 lv->status |= ACTIVATE_EXCL;
1004
914c9723 1005 memlock_inc();
658b5812 1006 r = _lv_activate_lv(lv);
914c9723
AK
1007 memlock_dec();
1008 fs_unlock();
1009
5efd97f1 1010 if (r && !monitor_dev_for_events(cmd, lv, 1))
ed09d7e3 1011 stack;
15d91f5a 1012
914c9723 1013 return r;
f4cbeaf0 1014}
199e490e 1015
658b5812 1016/* Activate LV */
07d31831 1017int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive)
658b5812 1018{
07d31831 1019 return _lv_activate(cmd, lvid_s, exclusive, 0);
658b5812
AK
1020}
1021
1022/* Activate LV only if it passes filter */
07d31831 1023int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive)
658b5812 1024{
07d31831 1025 return _lv_activate(cmd, lvid_s, exclusive, 1);
658b5812
AK
1026}
1027
f7dd6d84
AK
1028int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
1029{
1030 struct lvinfo info;
1031 int r = 1;
1032
8b076648 1033 if (!lv) {
2262b320 1034 r = dm_mknodes(NULL);
8b076648
AK
1035 fs_unlock();
1036 return r;
1037 }
1038
a6b22cf3 1039 if (!_lv_info(cmd, lv, 1, &info, 0, 0, 0))
5f4b2acf 1040 return_0;
f7dd6d84
AK
1041
1042 if (info.exists)
f09fe0ad 1043 r = dev_manager_lv_mknodes(lv);
f7dd6d84 1044 else
f09fe0ad 1045 r = dev_manager_lv_rmnodes(lv);
f7dd6d84
AK
1046
1047 fs_unlock();
1048
1049 return r;
1050}
1051
352a99b9
AK
1052/*
1053 * Does PV use VG somewhere in its construction?
1054 * Returns 1 on failure.
1055 */
898e6f8e 1056int pv_uses_vg(struct physical_volume *pv,
3e3d5d85 1057 struct volume_group *vg)
352a99b9 1058{
352a99b9
AK
1059 if (!activation())
1060 return 0;
1061
1062 if (!dm_is_dm_major(MAJOR(pv->dev->dev)))
1063 return 0;
1064
898e6f8e 1065 return dev_manager_device_uses_vg(pv->dev, vg);
352a99b9
AK
1066}
1067
2293567c
AK
1068void activation_release(void)
1069{
1070 dev_manager_release();
1071}
1072
914c9723
AK
1073void activation_exit(void)
1074{
1075 dev_manager_exit();
1076}
199e490e 1077#endif
This page took 0.173822 seconds and 5 git commands to generate.