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