From 2d6fcbf67d131c7969bd60798b2bfe3cc2316205 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 17 Aug 2010 16:25:32 +0000 Subject: [PATCH] Allow internal suspend and resume of origin without its snapshots. --- WHATS_NEW | 1 + daemons/clvmd/clvmd.c | 2 +- daemons/clvmd/lvm-functions.c | 36 +++++------ daemons/clvmd/lvm-functions.h | 5 +- lib/activate/activate.c | 109 ++++++++++++++++++++-------------- lib/activate/activate.h | 17 +++--- lib/activate/dev_manager.c | 63 +++++++++++--------- lib/activate/dev_manager.h | 7 ++- lib/display/display.c | 4 +- lib/locking/file_locking.c | 6 +- lib/locking/no_locking.c | 6 +- lib/metadata/lv_manip.c | 4 +- lib/metadata/mirror.c | 8 +-- lib/mirror/mirrored.c | 4 +- lib/report/report.c | 10 ++-- liblvm/lvm_lv.c | 4 +- tools/lvchange.c | 12 ++-- tools/lvconvert.c | 6 +- tools/lvresize.c | 4 +- tools/lvscan.c | 2 +- tools/vgchange.c | 6 +- tools/vgconvert.c | 2 +- tools/vgreduce.c | 2 +- 23 files changed, 176 insertions(+), 144 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 6ac2f2205..db1705afc 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.73 - ================================ + Allow internal suspend and resume of origin without its snapshots. Fix dev_manager_transient to access -real device not snapshot-origin. Monitor origin -real device below snapshot instead of overlay device. Don't really change monitoring status when in test mode. diff --git a/daemons/clvmd/clvmd.c b/daemons/clvmd/clvmd.c index a99e555d9..5810730fb 100644 --- a/daemons/clvmd/clvmd.c +++ b/daemons/clvmd/clvmd.c @@ -1885,7 +1885,7 @@ static void lvm_thread_fn(void *arg) pthread_sigmask(SIG_BLOCK, &ss, NULL); /* Initialise the interface to liblvm */ - init_lvm(lvm_params->using_gulm, lvm_params->argv); + init_clvm(lvm_params->using_gulm, lvm_params->argv); /* Allow others to get moving */ pthread_mutex_unlock(&lvm_start_mutex); diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c index aedc92317..80555635c 100644 --- a/daemons/clvmd/lvm-functions.c +++ b/daemons/clvmd/lvm-functions.c @@ -214,7 +214,7 @@ void destroy_lvhash() } /* Gets a real lock and keeps the info in the hash table */ -int hold_lock(char *resource, int mode, int flags) +static int hold_lock(char *resource, int mode, int flags) { int status; int saved_errno; @@ -269,7 +269,7 @@ int hold_lock(char *resource, int mode, int flags) } /* Unlock and remove it from the hash table */ -int hold_unlock(char *resource) +static int hold_unlock(char *resource) { struct lv_info *lvi; int status; @@ -350,12 +350,14 @@ static int do_activate_lv(char *resource, unsigned char lock_flags, int mode) } /* If it's suspended then resume it */ - if (!lv_info_by_lvid(cmd, resource, &lvi, 0, 0)) + // FIXME Set origin_only + if (!lv_info_by_lvid(cmd, resource, 0, &lvi, 0, 0)) goto error; if (lvi.suspended) { memlock_inc(cmd); - if (!lv_resume(cmd, resource)) { + // FIXME Set origin_only + if (!lv_resume(cmd, resource, 0)) { memlock_dec(cmd); goto error; } @@ -385,7 +387,8 @@ static int do_resume_lv(char *resource, unsigned char lock_flags) return 0; /* We don't need to do anything */ } - if (!lv_resume_if_active(cmd, resource)) + // FIXME Set origin_only + if (!lv_resume_if_active(cmd, resource, 0)) return EIO; return 0; @@ -405,14 +408,14 @@ static int do_suspend_lv(char *resource, unsigned char lock_flags) } /* Only suspend it if it exists */ - if (!lv_info_by_lvid(cmd, resource, &lvi, 0, 0)) + // FIXME Set origin_only + if (!lv_info_by_lvid(cmd, resource, 0, &lvi, 0, 0)) + return EIO; + + // FIXME Set origin_only + if (lvi.exists && !lv_suspend_if_active(cmd, resource, 0)) return EIO; - if (lvi.exists) { - if (!lv_suspend_if_active(cmd, resource)) { - return EIO; - } - } return 0; } @@ -571,7 +574,8 @@ int post_lock_lv(unsigned char command, unsigned char lock_flags, struct lvinfo lvi; pthread_mutex_lock(&lvm_lock); - status = lv_info_by_lvid(cmd, resource, &lvi, 0, 0); + // FIXME Set origin_only + status = lv_info_by_lvid(cmd, resource, 0, &lvi, 0, 0); pthread_mutex_unlock(&lvm_lock); if (!status) return EIO; @@ -579,10 +583,8 @@ int post_lock_lv(unsigned char command, unsigned char lock_flags, if (lvi.exists) { if (hold_lock(resource, LCK_READ, LCKF_CONVERT)) return errno; - } else { - if (hold_unlock(resource)) - return errno; - } + } else if (hold_unlock(resource)) + return errno; } } return 0; @@ -882,7 +884,7 @@ struct dm_hash_node *get_next_excl_lock(struct dm_hash_node *v, char **name) } /* Called to initialise the LVM context of the daemon */ -int init_lvm(int using_gulm, char **argv) +int init_clvm(int using_gulm, char **argv) { if (!(cmd = create_toolcontext(1, NULL))) { log_error("Failed to allocate command context"); diff --git a/daemons/clvmd/lvm-functions.h b/daemons/clvmd/lvm-functions.h index 06f6434e2..97153d49e 100644 --- a/daemons/clvmd/lvm-functions.h +++ b/daemons/clvmd/lvm-functions.h @@ -27,15 +27,14 @@ extern int post_lock_lv(unsigned char lock_cmd, unsigned char lock_flags, char *resource); extern int do_check_lvm1(const char *vgname); extern int do_refresh_cache(void); -extern int init_lvm(int using_gulm, char **argv); +extern int init_clvm(int using_gulm, char **argv); extern void destroy_lvm(void); extern void init_lvhash(void); extern void destroy_lvhash(void); extern void lvm_do_backup(const char *vgname); -extern int hold_unlock(char *resource); -extern int hold_lock(char *resource, int mode, int flags); extern char *get_last_lvm_error(void); extern void do_lock_vg(unsigned char command, unsigned char lock_flags, char *resource); extern struct dm_hash_node *get_next_excl_lock(struct dm_hash_node *v, char **name); + #endif diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 681eba704..40c0fdea5 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -147,12 +147,13 @@ int target_present(struct cmd_context *cmd, const char *target_name, { return 0; } -int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info, - int with_open_count, int with_read_ahead) +int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, unsigned origin_only, + struct lvinfo *info, int with_open_count, int with_read_ahead) { return 0; } int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, + unsigned origin_only, struct lvinfo *info, int with_open_count, int with_read_ahead) { return 0; @@ -176,10 +177,12 @@ int lvs_in_vg_opened(struct volume_group *vg) { return 0; } +/****** int lv_suspend(struct cmd_context *cmd, const char *lvid_s) { return 1; } +*******/ int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s) { return 1; @@ -451,7 +454,7 @@ int target_present(struct cmd_context *cmd, const char *target_name, /* * Returns 1 if info structure populated, else 0 on failure. */ -int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, +int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, unsigned origin_only, struct lvinfo *info, int with_open_count, int with_read_ahead) { struct dm_info dminfo; @@ -459,7 +462,7 @@ int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, if (!activation()) return 0; - if (!dev_manager_info(lv->vg->cmd->mem, lv, with_open_count, + if (!dev_manager_info(lv->vg->cmd->mem, lv, origin_only ? "real" : NULL, with_open_count, with_read_ahead, &dminfo, &info->read_ahead)) return_0; @@ -476,6 +479,7 @@ int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, } int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, + unsigned origin_only, struct lvinfo *info, int with_open_count, int with_read_ahead) { int r; @@ -484,7 +488,10 @@ int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, if (!(lv = lv_from_lvid(cmd, lvid_s, 0))) return 0; - r = lv_info(cmd, lv, info, with_open_count, with_read_ahead); + if (!lv_is_origin(lv)) + origin_only = 0; + + r = lv_info(cmd, lv, origin_only, info, with_open_count, with_read_ahead); vg_release(lv->vg); return r; @@ -554,7 +561,7 @@ int lv_mirror_percent(struct cmd_context *cmd, struct logical_volume *lv, if (!activation()) return 0; - if (!lv_info(cmd, lv, &info, 0, 0)) + if (!lv_info(cmd, lv, 0, &info, 0, 0)) return_0; if (!info.exists) @@ -576,7 +583,7 @@ static int _lv_active(struct cmd_context *cmd, struct logical_volume *lv) { struct lvinfo info; - if (!lv_info(cmd, lv, &info, 0, 0)) { + if (!lv_info(cmd, lv, 0, &info, 0, 0)) { stack; return -1; } @@ -588,7 +595,7 @@ static int _lv_open_count(struct cmd_context *cmd, struct logical_volume *lv) { struct lvinfo info; - if (!lv_info(cmd, lv, &info, 1, 0)) { + if (!lv_info(cmd, lv, 0, &info, 1, 0)) { stack; return -1; } @@ -596,7 +603,7 @@ static int _lv_open_count(struct cmd_context *cmd, struct logical_volume *lv) return info.open_count; } -static int _lv_activate_lv(struct logical_volume *lv) +static int _lv_activate_lv(struct logical_volume *lv, unsigned origin_only) { int r; struct dev_manager *dm; @@ -604,14 +611,14 @@ static int _lv_activate_lv(struct logical_volume *lv) if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name))) return_0; - if (!(r = dev_manager_activate(dm, lv))) + if (!(r = dev_manager_activate(dm, lv, origin_only))) stack; dev_manager_destroy(dm); return r; } -static int _lv_preload(struct logical_volume *lv, int *flush_required) +static int _lv_preload(struct logical_volume *lv, unsigned origin_only, int *flush_required) { int r; struct dev_manager *dm; @@ -619,7 +626,7 @@ static int _lv_preload(struct logical_volume *lv, int *flush_required) if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name))) return_0; - if (!(r = dev_manager_preload(dm, lv, flush_required))) + if (!(r = dev_manager_preload(dm, lv, origin_only, flush_required))) stack; dev_manager_destroy(dm); @@ -641,7 +648,7 @@ static int _lv_deactivate(struct logical_volume *lv) return r; } -static int _lv_suspend_lv(struct logical_volume *lv, int lockfs, int flush_required) +static int _lv_suspend_lv(struct logical_volume *lv, unsigned origin_only, int lockfs, int flush_required) { int r; struct dev_manager *dm; @@ -649,7 +656,7 @@ static int _lv_suspend_lv(struct logical_volume *lv, int lockfs, int flush_requi if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name))) return_0; - if (!(r = dev_manager_suspend(dm, lv, lockfs, flush_required))) + if (!(r = dev_manager_suspend(dm, lv, origin_only, lockfs, flush_required))) stack; dev_manager_destroy(dm); @@ -841,8 +848,8 @@ int target_register_events(struct cmd_context *cmd, const char *dso, struct logi * Returns 0 if an attempt to (un)monitor the device failed. * Returns 1 otherwise. */ -int monitor_dev_for_events(struct cmd_context *cmd, - struct logical_volume *lv, int monitor) +int monitor_dev_for_events(struct cmd_context *cmd, struct logical_volume *lv, + unsigned origin_only, int monitor) { #ifdef DMEVENTD int i, pending = 0, monitored; @@ -868,17 +875,17 @@ int monitor_dev_for_events(struct cmd_context *cmd, * not the actual LV itself. */ if (lv_is_cow(lv) && !lv_is_merging_cow(lv)) - return monitor_dev_for_events(cmd, lv->snapshot->lv, monitor); + return monitor_dev_for_events(cmd, lv->snapshot->lv, 0, monitor); /* * In case this LV is a snapshot origin, we instead monitor * each of its respective snapshots. The origin itself may * also need to be monitored if it is a mirror, for example. */ - if (lv_is_origin(lv)) + if (!origin_only && lv_is_origin(lv)) dm_list_iterate_safe(snh, snht, &lv->snapshot_segs) if (!monitor_dev_for_events(cmd, dm_list_struct_base(snh, - struct lv_segment, origin_list)->cow, monitor)) + struct lv_segment, origin_list)->cow, 0, monitor)) r = 0; /* @@ -888,7 +895,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, if ((seg = first_seg(lv)) != NULL && seg->log_lv != NULL && (log_seg = first_seg(seg->log_lv)) != NULL && seg_is_mirrored(log_seg)) - if (!monitor_dev_for_events(cmd, seg->log_lv, monitor)) + if (!monitor_dev_for_events(cmd, seg->log_lv, 0, monitor)) r = 0; dm_list_iterate(tmp, &lv->segments) { @@ -898,7 +905,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, for (s = 0; s < seg->area_count; s++) { if (seg_type(seg, s) != AREA_LV) continue; - if (!monitor_dev_for_events(cmd, seg_lv(seg, s), + if (!monitor_dev_for_events(cmd, seg_lv(seg, s), 0, monitor)) { log_error("Failed to %smonitor %s", monitor ? "" : "un", @@ -979,7 +986,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, } static int _lv_suspend(struct cmd_context *cmd, const char *lvid_s, - int error_if_not_suspended) + unsigned origin_only, int error_if_not_suspended) { struct logical_volume *lv = NULL, *lv_pre = NULL; struct lvinfo info; @@ -995,13 +1002,17 @@ static int _lv_suspend(struct cmd_context *cmd, const char *lvid_s, if (!(lv_pre = lv_from_lvid(cmd, lvid_s, 1))) goto_out; + /* Ignore origin_only unless LV is origin in both old and new metadata */ + if (!lv_is_origin(lv) || !lv_is_origin(lv_pre)) + origin_only = 0; + if (test_mode()) { - _skip("Suspending '%s'.", lv->name); + _skip("Suspending %s%s.", lv->name, origin_only ? " origin without snapshots" : ""); r = 1; goto out; } - if (!lv_info(cmd, lv, &info, 0, 0)) + if (!lv_info(cmd, lv, origin_only, &info, 0, 0)) goto_out; if (!info.exists || info.suspended) { @@ -1020,22 +1031,23 @@ static int _lv_suspend(struct cmd_context *cmd, const char *lvid_s, /* If VG was precommitted, preload devices for the LV */ if ((lv_pre->vg->status & PRECOMMITTED)) { - if (!_lv_preload(lv_pre, &flush_required)) { + if (!_lv_preload(lv_pre, origin_only, &flush_required)) { /* FIXME Revert preloading */ goto_out; } } - if (!monitor_dev_for_events(cmd, lv, 0)) + if (!monitor_dev_for_events(cmd, lv, origin_only, 0)) /* FIXME Consider aborting here */ stack; memlock_inc(cmd); - if (lv_is_origin(lv_pre) || lv_is_cow(lv_pre)) + if (!origin_only && + (lv_is_origin(lv_pre) || lv_is_cow(lv_pre))) lockfs = 1; - if (!_lv_suspend_lv(lv, lockfs, flush_required)) { + if (!_lv_suspend_lv(lv, origin_only, lockfs, flush_required)) { memlock_dec(cmd); fs_unlock(); goto out; @@ -1054,17 +1066,21 @@ out: } /* Returns success if the device is not active */ -int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s) +int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only) { - return _lv_suspend(cmd, lvid_s, 0); + return _lv_suspend(cmd, lvid_s, origin_only, 0); } +/* No longer used */ +/*********** int lv_suspend(struct cmd_context *cmd, const char *lvid_s) { return _lv_suspend(cmd, lvid_s, 1); } +***********/ static int _lv_resume(struct cmd_context *cmd, const char *lvid_s, + unsigned origin_only, int error_if_not_active) { struct logical_volume *lv; @@ -1077,13 +1093,16 @@ static int _lv_resume(struct cmd_context *cmd, const char *lvid_s, if (!(lv = lv_from_lvid(cmd, lvid_s, 0))) goto_out; + if (!lv_is_origin(lv)) + origin_only = 0; + if (test_mode()) { - _skip("Resuming '%s'.", lv->name); + _skip("Resuming %s%s.", lv->name, origin_only ? " without snapshots" : ""); r = 1; goto out; } - if (!lv_info(cmd, lv, &info, 0, 0)) + if (!lv_info(cmd, lv, origin_only, &info, 0, 0)) goto_out; if (!info.exists || !info.suspended) { @@ -1093,13 +1112,13 @@ static int _lv_resume(struct cmd_context *cmd, const char *lvid_s, goto out; } - if (!_lv_activate_lv(lv)) + if (!_lv_activate_lv(lv, origin_only)) goto_out; memlock_dec(cmd); fs_unlock(); - if (!monitor_dev_for_events(cmd, lv, 1)) + if (!monitor_dev_for_events(cmd, lv, origin_only, 1)) stack; r = 1; @@ -1111,14 +1130,14 @@ out: } /* Returns success if the device is not active */ -int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s) +int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only) { - return _lv_resume(cmd, lvid_s, 0); + return _lv_resume(cmd, lvid_s, origin_only, 0); } -int lv_resume(struct cmd_context *cmd, const char *lvid_s) +int lv_resume(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only) { - return _lv_resume(cmd, lvid_s, 1); + return _lv_resume(cmd, lvid_s, origin_only, 1); } static int _lv_has_open_snapshots(struct logical_volume *lv) @@ -1128,7 +1147,7 @@ static int _lv_has_open_snapshots(struct logical_volume *lv) int r = 0; dm_list_iterate_items_gen(snap_seg, &lv->snapshot_segs, origin_list) { - if (!lv_info(lv->vg->cmd, snap_seg->cow, &info, 1, 0)) { + if (!lv_info(lv->vg->cmd, snap_seg->cow, 0, &info, 1, 0)) { r = 1; continue; } @@ -1162,7 +1181,7 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s) goto out; } - if (!lv_info(cmd, lv, &info, 1, 0)) + if (!lv_info(cmd, lv, 0, &info, 1, 0)) goto_out; if (!info.exists) { @@ -1185,7 +1204,7 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s) lv_calculate_readahead(lv, NULL); - if (!monitor_dev_for_events(cmd, lv, 0)) + if (!monitor_dev_for_events(cmd, lv, 0, 0)) stack; memlock_inc(cmd); @@ -1193,7 +1212,7 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s) memlock_dec(cmd); fs_unlock(); - if (!lv_info(cmd, lv, &info, 1, 0) || info.exists) + if (!lv_info(cmd, lv, 0, &info, 1, 0) || info.exists) r = 0; out: if (lv) { @@ -1270,7 +1289,7 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s, goto out; } - if (!lv_info(cmd, lv, &info, 0, 0)) + if (!lv_info(cmd, lv, 0, &info, 0, 0)) goto_out; if (info.exists && !info.suspended && info.live_table) { @@ -1287,12 +1306,12 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s, lv->status |= ACTIVATE_EXCL; memlock_inc(cmd); - if (!(r = _lv_activate_lv(lv))) + if (!(r = _lv_activate_lv(lv, 0))) stack; memlock_dec(cmd); fs_unlock(); - if (r && !monitor_dev_for_events(cmd, lv, 1)) + if (r && !monitor_dev_for_events(cmd, lv, 0, 1)) stack; out: diff --git a/lib/activate/activate.h b/lib/activate/activate.h index 1a0c37cbe..fb02a62f8 100644 --- a/lib/activate/activate.h +++ b/lib/activate/activate.h @@ -53,10 +53,10 @@ int list_lv_modules(struct dm_pool *mem, const struct logical_volume *lv, void activation_release(void); void activation_exit(void); -int lv_suspend(struct cmd_context *cmd, const char *lvid_s); -int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s); -int lv_resume(struct cmd_context *cmd, const char *lvid_s); -int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s); +/* int lv_suspend(struct cmd_context *cmd, const char *lvid_s); */ +int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only); +int lv_resume(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only); +int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only); int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive); int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive); @@ -67,9 +67,10 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv); /* * Returns 1 if info structure has been populated, else 0. */ -int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info, +int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, + unsigned origin_only, struct lvinfo *info, int with_open_count, int with_read_ahead); -int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, +int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only, struct lvinfo *info, int with_open_count, int with_read_ahead); /* @@ -99,8 +100,8 @@ int lv_is_active(struct logical_volume *lv); int lv_has_target_type(struct dm_pool *mem, struct logical_volume *lv, const char *layer, const char *target_type); -int monitor_dev_for_events(struct cmd_context *cmd, - struct logical_volume *lv, int do_reg); +int monitor_dev_for_events(struct cmd_context *cmd, struct logical_volume *lv, + unsigned origin_only, int do_reg); #ifdef DMEVENTD # include "libdevmapper-event.h" diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index f091f743b..4d556851a 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -222,19 +222,20 @@ static int _info_by_dev(uint32_t major, uint32_t minor, struct dm_info *info) } int dev_manager_info(struct dm_pool *mem, const struct logical_volume *lv, + const char *layer, int with_open_count, int with_read_ahead, struct dm_info *info, uint32_t *read_ahead) { char *dlid, *name; int r; - if (!(name = build_dm_name(mem, lv->vg->name, lv->name, NULL))) { + if (!(name = build_dm_name(mem, lv->vg->name, lv->name, layer))) { log_error("name build failed for %s", lv->name); return 0; } - if (!(dlid = build_dm_uuid(mem, lv->lvid.s, NULL))) { - log_error("dlid build failed for %s", lv->name); + if (!(dlid = build_dm_uuid(mem, lv->lvid.s, layer))) { + log_error("dlid build failed for %s", name); return 0; } @@ -559,11 +560,11 @@ int dev_manager_transient(struct dev_manager *dm, struct logical_volume *lv) char *type = NULL; char *params = NULL; char *dlid = NULL; - char *suffix = lv_is_origin(lv) ? "real" : NULL; + const char *layer = lv_is_origin(lv) ? "real" : NULL; const struct dm_list *segh = &lv->segments; struct lv_segment *seg = NULL; - if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, suffix))) + if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer))) return_0; if (!(dmt = _setup_task(0, dlid, NULL, DM_DEVICE_STATUS, 0, 0))) @@ -714,17 +715,17 @@ int dev_manager_mirror_percent(struct dev_manager *dm, { char *name; const char *dlid; - const char *suffix = (lv_is_origin(lv)) ? "real" : NULL; + const char *layer = (lv_is_origin(lv)) ? "real" : NULL; /* * Build a name for the top layer. */ - if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, suffix))) + if (!(name = build_dm_name(dm->mem, lv->vg->name, lv->name, layer))) return_0; /* FIXME dm_pool_free ? */ - if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, suffix))) { + if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, layer))) { log_error("dlid build failed for %s", lv->name); return 0; } @@ -1014,16 +1015,16 @@ static int _add_partial_replicator_to_dtree(struct dev_manager *dm, /* * Add LV and any known dependencies */ -static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree, struct logical_volume *lv) +static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree, struct logical_volume *lv, unsigned origin_only) { - if (!_add_dev_to_dtree(dm, dtree, lv, NULL)) + if (!origin_only && !_add_dev_to_dtree(dm, dtree, lv, NULL)) return_0; /* FIXME Can we avoid doing this every time? */ if (!_add_dev_to_dtree(dm, dtree, lv, "real")) return_0; - if (!_add_dev_to_dtree(dm, dtree, lv, "cow")) + if (!origin_only && !_add_dev_to_dtree(dm, dtree, lv, "cow")) return_0; if ((lv->status & MIRRORED) && first_seg(lv)->log_lv && @@ -1038,7 +1039,7 @@ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree, struc return 1; } -static struct dm_tree *_create_partial_dtree(struct dev_manager *dm, struct logical_volume *lv) +static struct dm_tree *_create_partial_dtree(struct dev_manager *dm, struct logical_volume *lv, unsigned origin_only) { struct dm_tree *dtree; struct dm_list *snh, *snht; @@ -1050,19 +1051,20 @@ static struct dm_tree *_create_partial_dtree(struct dev_manager *dm, struct logi return NULL; } - if (!_add_lv_to_dtree(dm, dtree, lv)) + if (!_add_lv_to_dtree(dm, dtree, lv, origin_only)) goto_bad; /* Add any snapshots of this LV */ - dm_list_iterate_safe(snh, snht, &lv->snapshot_segs) - if (!_add_lv_to_dtree(dm, dtree, dm_list_struct_base(snh, struct lv_segment, origin_list)->cow)) - goto_bad; + if (!origin_only) + dm_list_iterate_safe(snh, snht, &lv->snapshot_segs) + if (!_add_lv_to_dtree(dm, dtree, dm_list_struct_base(snh, struct lv_segment, origin_list)->cow, 0)) + goto_bad; /* Add any LVs used by segments in this LV */ dm_list_iterate_items(seg, &lv->segments) for (s = 0; s < seg->area_count; s++) if (seg_type(seg, s) == AREA_LV && seg_lv(seg, s)) { - if (!_add_lv_to_dtree(dm, dtree, seg_lv(seg, s))) + if (!_add_lv_to_dtree(dm, dtree, seg_lv(seg, s), 0)) goto_bad; } @@ -1622,14 +1624,15 @@ static int _clean_tree(struct dev_manager *dm, struct dm_tree_node *root) return 1; } -static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, action_t action) +static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, + unsigned origin_only, action_t action) { struct dm_tree *dtree; struct dm_tree_node *root; char *dlid; int r = 0; - if (!(dtree = _create_partial_dtree(dm, lv))) + if (!(dtree = _create_partial_dtree(dm, lv, origin_only))) return_0; if (!(root = dm_tree_find_node(dtree, 0, 0))) { @@ -1637,7 +1640,7 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, actio goto out; } - if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, NULL))) + if (!(dlid = build_dm_uuid(dm->mem, lv->lvid.s, origin_only ? "real" : NULL))) goto_out; /* Only process nodes with uuid of "LVM-" plus VG id. */ @@ -1669,7 +1672,7 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, actio case PRELOAD: case ACTIVATE: /* Add all required new devices to tree */ - if (!_add_new_lv_to_dtree(dm, dtree, lv, NULL)) + if (!_add_new_lv_to_dtree(dm, dtree, lv, origin_only ? "real" : NULL)) goto_out; /* Preload any devices required before any suspensions */ @@ -1710,22 +1713,24 @@ out: return r; } -int dev_manager_activate(struct dev_manager *dm, struct logical_volume *lv) +/* origin_only may only be set if we are resuming (not activating) an origin LV */ +int dev_manager_activate(struct dev_manager *dm, struct logical_volume *lv, unsigned origin_only) { - if (!_tree_action(dm, lv, ACTIVATE)) + if (!_tree_action(dm, lv, origin_only, ACTIVATE)) return_0; - return _tree_action(dm, lv, CLEAN); + return _tree_action(dm, lv, origin_only, CLEAN); } +/* origin_only may only be set if we are resuming (not activating) an origin LV */ int dev_manager_preload(struct dev_manager *dm, struct logical_volume *lv, - int *flush_required) + unsigned origin_only, int *flush_required) { /* FIXME Update the pvmove implementation! */ if ((lv->status & PVMOVE) || (lv->status & LOCKED)) return 1; - if (!_tree_action(dm, lv, PRELOAD)) + if (!_tree_action(dm, lv, origin_only, PRELOAD)) return 0; *flush_required = dm->flush_required; @@ -1737,17 +1742,17 @@ int dev_manager_deactivate(struct dev_manager *dm, struct logical_volume *lv) { int r; - r = _tree_action(dm, lv, DEACTIVATE); + r = _tree_action(dm, lv, 0, DEACTIVATE); return r; } int dev_manager_suspend(struct dev_manager *dm, struct logical_volume *lv, - int lockfs, int flush_required) + unsigned origin_only, int lockfs, int flush_required) { dm->flush_required = flush_required; - return _tree_action(dm, lv, lockfs ? SUSPEND_WITH_LOCKFS : SUSPEND); + return _tree_action(dm, lv, origin_only, lockfs ? SUSPEND_WITH_LOCKFS : SUSPEND); } /* diff --git a/lib/activate/dev_manager.h b/lib/activate/dev_manager.h index 614db859d..be6de51b9 100644 --- a/lib/activate/dev_manager.h +++ b/lib/activate/dev_manager.h @@ -41,6 +41,7 @@ void dev_manager_exit(void); * unsuspended until the snapshot is also created.) */ int dev_manager_info(struct dm_pool *mem, const struct logical_volume *lv, + const char *layer, int with_open_count, int with_read_ahead, struct dm_info *info, uint32_t *read_ahead); int dev_manager_snapshot_percent(struct dev_manager *dm, @@ -52,10 +53,10 @@ int dev_manager_mirror_percent(struct dev_manager *dm, float *percent, percent_range_t *percent_range, uint32_t *event_nr); int dev_manager_suspend(struct dev_manager *dm, struct logical_volume *lv, - int lockfs, int flush_required); -int dev_manager_activate(struct dev_manager *dm, struct logical_volume *lv); + unsigned origin_only, int lockfs, int flush_required); +int dev_manager_activate(struct dev_manager *dm, struct logical_volume *lv, unsigned origin_only); int dev_manager_preload(struct dev_manager *dm, struct logical_volume *lv, - int *flush_required); + unsigned origin_only, int *flush_required); int dev_manager_deactivate(struct dev_manager *dm, struct logical_volume *lv); int dev_manager_transient(struct dev_manager *dm, struct logical_volume *lv); diff --git a/lib/display/display.c b/lib/display/display.c index e5d62f7c9..86dc87fbf 100644 --- a/lib/display/display.c +++ b/lib/display/display.c @@ -452,7 +452,7 @@ void lvdisplay_colons(const struct logical_volume *lv) { int inkernel; struct lvinfo info; - inkernel = lv_info(lv->vg->cmd, lv, &info, 1, 0) && info.exists; + inkernel = lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) && info.exists; log_print("%s%s/%s:%s:%" PRIu64 ":%d:-1:%d:%" PRIu64 ":%d:-1:%d:%d:%d:%d", lv->vg->cmd->dev_dir, @@ -481,7 +481,7 @@ int lvdisplay_full(struct cmd_context *cmd, if (!id_write_format(&lv->lvid.id[1], uuid, sizeof(uuid))) return_0; - inkernel = lv_info(cmd, lv, &info, 1, 1) && info.exists; + inkernel = lv_info(cmd, lv, 0, &info, 1, 1) && info.exists; log_print("--- Logical volume ---"); diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c index 1bf8f1bca..5972fdf7e 100644 --- a/lib/locking/file_locking.c +++ b/lib/locking/file_locking.c @@ -279,7 +279,8 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource, switch (flags & LCK_TYPE_MASK) { case LCK_UNLOCK: log_very_verbose("Unlocking LV %s", resource); - if (!lv_resume_if_active(cmd, resource)) + // FIXME Set origin_only + if (!lv_resume_if_active(cmd, resource, 0)) return 0; break; case LCK_NULL: @@ -297,7 +298,8 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource, break; case LCK_WRITE: log_very_verbose("Locking LV %s (W)", resource); - if (!lv_suspend_if_active(cmd, resource)) + // FIXME Set origin_only + if (!lv_suspend_if_active(cmd, resource, 0)) return 0; break; case LCK_EXCL: diff --git a/lib/locking/no_locking.c b/lib/locking/no_locking.c index 9fbbac0cc..3dab7a3a9 100644 --- a/lib/locking/no_locking.c +++ b/lib/locking/no_locking.c @@ -44,11 +44,13 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource, case LCK_NULL: return lv_deactivate(cmd, resource); case LCK_UNLOCK: - return lv_resume_if_active(cmd, resource); + // FIXME Set origin_only + return lv_resume_if_active(cmd, resource, 0); case LCK_READ: return lv_activate_with_filter(cmd, resource, 0); case LCK_WRITE: - return lv_suspend_if_active(cmd, resource); + // FIXME Set origin_only + return lv_suspend_if_active(cmd, resource, 0); case LCK_EXCL: return lv_activate_with_filter(cmd, resource, 1); default: diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 52c80c4c3..2bcfcc7e9 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -2237,7 +2237,7 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, /* FIXME Ensure not referred to by another existing LVs */ - if (lv_info(cmd, lv, &info, 1, 0)) { + if (lv_info(cmd, lv, 0, &info, 1, 0)) { if (info.open_count) { log_error("Can't remove open logical volume \"%s\"", lv->name); @@ -3109,7 +3109,7 @@ int lv_create_single(struct volume_group *vg, return 0; } - if (!lv_info(cmd, org, &info, 0, 0)) { + if (!lv_info(cmd, org, 0, &info, 0, 0)) { log_error("Check for existence of snapshot " "origin '%s' failed.", org->name); return 0; diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c index 5fe14f9af..84a3f1deb 100644 --- a/lib/metadata/mirror.c +++ b/lib/metadata/mirror.c @@ -292,14 +292,14 @@ static int _init_mirror_log(struct cmd_context *cmd, } /* If the LV is active, deactivate it first. */ - if (lv_info(cmd, log_lv, &info, 0, 0) && info.exists) { + if (lv_info(cmd, log_lv, 0, &info, 0, 0) && info.exists) { (void)deactivate_lv(cmd, log_lv); /* * FIXME: workaround to fail early * Ensure that log is really deactivated because deactivate_lv * on cluster do not fail if there is log_lv with different UUID. */ - if (lv_info(cmd, log_lv, &info, 0, 0) && info.exists) { + if (lv_info(cmd, log_lv, 0, &info, 0, 0) && info.exists) { log_error("Aborting. Unable to deactivate mirror log."); goto revert_new_lv; } @@ -1587,7 +1587,7 @@ int remove_mirror_log(struct cmd_context *cmd, } /* Had disk log, switch to core. */ - if (lv_info(cmd, lv, &info, 0, 0) && info.exists) { + if (lv_info(cmd, lv, 0, &info, 0, 0) && info.exists) { if (!lv_mirror_percent(cmd, lv, 0, &sync_percent, &percent_range, NULL)) { log_error("Unable to determine mirror sync status."); @@ -1787,7 +1787,7 @@ int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv, * on remote nodes (even though it is inactive on this node) */ if (vg_is_clustered(lv->vg) && - !(lv_info(cmd, lv, &info, 0, 0) && info.exists)) { + !(lv_info(cmd, lv, 0, &info, 0, 0) && info.exists)) { log_error("Unable to convert the log of inactive " "cluster mirror %s", lv->name); return 0; diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c index 2745c14c0..da9bdbaae 100644 --- a/lib/mirror/mirrored.c +++ b/lib/mirror/mirrored.c @@ -296,7 +296,7 @@ static int _mirrored_transient_status(struct lv_segment *seg, char *params) if (!strcmp(log_args[0], "disk")) { char buf[32]; log = first_seg(lv)->log_lv; - lv_info(lv->vg->cmd, log, &info, 0, 0); + lv_info(lv->vg->cmd, log, 0, &info, 0, 0); log_debug("Found mirror log at %d:%d", info.major, info.minor); sprintf(buf, "%d:%d", info.major, info.minor); if (strcmp(buf, log_args[1])) { @@ -316,7 +316,7 @@ static int _mirrored_transient_status(struct lv_segment *seg, char *params) for (i = 0; i < seg->area_count; ++i) { char buf[32]; - lv_info(lv->vg->cmd, seg_lv(seg, i), &info, 0, 0); + lv_info(lv->vg->cmd, seg_lv(seg, i), 0, &info, 0, 0); log_debug("Found mirror leg at %d:%d", info.major, info.minor); sprintf(buf, "%d:%d", info.major, info.minor); for (j = 0; j < num_devs; ++j) { diff --git a/lib/report/report.c b/lib/report/report.c index b3f6544f5..718b28ecc 100644 --- a/lib/report/report.c +++ b/lib/report/report.c @@ -245,7 +245,7 @@ static int _lvkmaj_disp(struct dm_report *rh, struct dm_pool *mem __attribute__( const struct logical_volume *lv = (const struct logical_volume *) data; struct lvinfo info; - if (lv_info(lv->vg->cmd, lv, &info, 0, 0) && info.exists) + if (lv_info(lv->vg->cmd, lv, 0, &info, 0, 0) && info.exists) return dm_report_field_int(rh, field, &info.major); return dm_report_field_int32(rh, field, &_minusone32); @@ -258,7 +258,7 @@ static int _lvkmin_disp(struct dm_report *rh, struct dm_pool *mem __attribute__( const struct logical_volume *lv = (const struct logical_volume *) data; struct lvinfo info; - if (lv_info(lv->vg->cmd, lv, &info, 0, 0) && info.exists) + if (lv_info(lv->vg->cmd, lv, 0, &info, 0, 0) && info.exists) return dm_report_field_int(rh, field, &info.minor); return dm_report_field_int32(rh, field, &_minusone32); @@ -351,7 +351,7 @@ static int _lvstatus_disp(struct dm_report *rh __attribute__((unused)), struct d else repstr[3] = '-'; - if (lv_info(lv->vg->cmd, lv, &info, 1, 0) && info.exists) { + if (lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) && info.exists) { if (info.suspended) repstr[4] = 's'; /* Suspended */ else if (info.live_table) @@ -683,7 +683,7 @@ static int _lvkreadahead_disp(struct dm_report *rh, struct dm_pool *mem, const struct logical_volume *lv = (const struct logical_volume *) data; struct lvinfo info; - if (!lv_info(lv->vg->cmd, lv, &info, 0, 1) || !info.exists) + if (!lv_info(lv->vg->cmd, lv, 0, &info, 0, 1) || !info.exists) return dm_report_field_int32(rh, field, &_minusone32); return _size32_disp(rh, mem, field, &info.read_ahead, private); @@ -1085,7 +1085,7 @@ static int _snpercent_disp(struct dm_report *rh __attribute__((unused)), struct } if ((!lv_is_cow(lv) && !lv_is_merging_origin(lv)) || - !lv_info(lv->vg->cmd, lv, &info, 0, 0) || !info.exists) { + !lv_info(lv->vg->cmd, lv, 0, &info, 0, 0) || !info.exists) { *sortval = UINT64_C(0); dm_report_field_set_value(field, "", sortval); return 1; diff --git a/liblvm/lvm_lv.c b/liblvm/lvm_lv.c index 47b95f947..4519a7bdd 100644 --- a/liblvm/lvm_lv.c +++ b/liblvm/lvm_lv.c @@ -57,7 +57,7 @@ const char *lvm_lv_get_name(const lv_t lv) uint64_t lvm_lv_is_active(const lv_t lv) { struct lvinfo info; - if (lv_info(lv->vg->cmd, lv, &info, 1, 0) && + if (lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) && info.exists && info.live_table) return 1; return 0; @@ -66,7 +66,7 @@ uint64_t lvm_lv_is_active(const lv_t lv) uint64_t lvm_lv_is_suspended(const lv_t lv) { struct lvinfo info; - if (lv_info(lv->vg->cmd, lv, &info, 1, 0) && + if (lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) && info.exists && info.suspended) return 1; return 0; diff --git a/tools/lvchange.c b/tools/lvchange.c index 97c6044f4..fa40d7cc6 100644 --- a/tools/lvchange.c +++ b/tools/lvchange.c @@ -37,7 +37,7 @@ static int lvchange_permission(struct cmd_context *cmd, } if ((lv->status & MIRRORED) && (vg_is_clustered(lv->vg)) && - lv_info(cmd, lv, &info, 0, 0) && info.exists) { + lv_info(cmd, lv, 0, &info, 0, 0) && info.exists) { log_error("Cannot change permissions of mirror \"%s\" " "while active.", lv->name); return 0; @@ -86,7 +86,7 @@ static int lvchange_monitoring(struct cmd_context *cmd, { struct lvinfo info; - if (!lv_info(cmd, lv, &info, 0, 0) || !info.exists) { + if (!lv_info(cmd, lv, 0, &info, 0, 0) || !info.exists) { log_error("Logical volume, %s, is not active", lv->name); return 0; } @@ -96,7 +96,7 @@ static int lvchange_monitoring(struct cmd_context *cmd, return 1; if ((dmeventd_monitor_mode() != DMEVENTD_MONITOR_IGNORE) && - !monitor_dev_for_events(cmd, lv, dmeventd_monitor_mode())) + !monitor_dev_for_events(cmd, lv, 0, dmeventd_monitor_mode())) return_0; return 1; @@ -107,7 +107,7 @@ static int lvchange_background_polling(struct cmd_context *cmd, { struct lvinfo info; - if (!lv_info(cmd, lv, &info, 0, 0) || !info.exists) { + if (!lv_info(cmd, lv, 0, &info, 0, 0) || !info.exists) { log_error("Logical volume, %s, is not active", lv->name); return 0; } @@ -189,7 +189,7 @@ static int lvchange_resync(struct cmd_context *cmd, return 0; } - if (lv_info(cmd, lv, &info, 1, 0)) { + if (lv_info(cmd, lv, 0, &info, 1, 0)) { if (info.open_count) { log_error("Can't resync open logical volume \"%s\"", lv->name); @@ -446,7 +446,7 @@ static int lvchange_persistent(struct cmd_context *cmd, log_error("Major number must be specified with -My"); return 0; } - if (lv_info(cmd, lv, &info, 0, 0) && info.exists) + if (lv_info(cmd, lv, 0, &info, 0, 0) && info.exists) active = 1; if (active && !arg_count(cmd, force_ARG) && yes_no_prompt("Logical volume %s will be " diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 1be3a8da6..d39030bfb 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -1465,13 +1465,13 @@ static int lvconvert_merge(struct cmd_context *cmd, * constructor and DM should prevent appropriate devices from * being open. */ - if (lv_info(cmd, origin, &info, 1, 0)) { + if (lv_info(cmd, origin, 0, &info, 1, 0)) { if (info.open_count) { log_error("Can't merge over open origin volume"); merge_on_activate = 1; } } - if (lv_info(cmd, lv, &info, 1, 0)) { + if (lv_info(cmd, lv, 0, &info, 1, 0)) { if (info.open_count) { log_print("Can't merge when snapshot is open"); merge_on_activate = 1; @@ -1633,7 +1633,7 @@ static int poll_logical_volume(struct cmd_context *cmd, struct logical_volume *l { struct lvinfo info; - if (!lv_info(cmd, lv, &info, 1, 0) || !info.exists) { + if (!lv_info(cmd, lv, 0, &info, 1, 0) || !info.exists) { log_print("Conversion starts after activation."); return ECMD_PROCESSED; } diff --git a/tools/lvresize.c b/tools/lvresize.c index 1fa5aa82c..c6261ed85 100644 --- a/tools/lvresize.c +++ b/tools/lvresize.c @@ -90,7 +90,7 @@ static int _request_confirmation(struct cmd_context *cmd, memset(&info, 0, sizeof(info)); - if (!lv_info(cmd, lv, &info, 1, 0) && driver_version(NULL, 0)) { + if (!lv_info(cmd, lv, 0, &info, 1, 0) && driver_version(NULL, 0)) { log_error("lv_info failed: aborting"); return 0; } @@ -572,7 +572,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg, memset(&info, 0, sizeof(info)); - if (lv_info(cmd, lv, &info, 0, 0) && info.exists) { + if (lv_info(cmd, lv, 0, &info, 0, 0) && info.exists) { log_error("Snapshot origin volumes can be resized " "only while inactive: try lvchange -an"); return ECMD_FAILED; diff --git a/tools/lvscan.c b/tools/lvscan.c index c0522f09e..e028eaeec 100644 --- a/tools/lvscan.c +++ b/tools/lvscan.c @@ -31,7 +31,7 @@ static int lvscan_single(struct cmd_context *cmd, struct logical_volume *lv, if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv)) return ECMD_PROCESSED; - inkernel = lv_info(cmd, lv, &info, 1, 0) && info.exists; + inkernel = lv_info(cmd, lv, 0, &info, 1, 0) && info.exists; if (lv_is_origin(lv)) { dm_list_iterate_items_gen(snap_seg, &lv->snapshot_segs, origin_list) { diff --git a/tools/vgchange.c b/tools/vgchange.c index 36ff0c83b..b16fc54d9 100644 --- a/tools/vgchange.c +++ b/tools/vgchange.c @@ -30,7 +30,7 @@ static int _monitor_lvs_in_vg(struct cmd_context *cmd, dm_list_iterate_items(lvl, &vg->lvs) { lv = lvl->lv; - if (!lv_info(cmd, lv, &info, 0, 0)) + if (!lv_info(cmd, lv, 0, &info, 0, 0)) lv_active = 0; else lv_active = info.exists; @@ -41,7 +41,7 @@ static int _monitor_lvs_in_vg(struct cmd_context *cmd, if ((lv->status & PVMOVE) || !lv_active) continue; - if (!monitor_dev_for_events(cmd, lv, reg)) { + if (!monitor_dev_for_events(cmd, lv, 0, reg)) { r = ECMD_FAILED; continue; } else @@ -63,7 +63,7 @@ static int _poll_lvs_in_vg(struct cmd_context *cmd, dm_list_iterate_items(lvl, &vg->lvs) { lv = lvl->lv; - if (!lv_info(cmd, lv, &info, 0, 0)) + if (!lv_info(cmd, lv, 0, &info, 0, 0)) lv_active = 0; else lv_active = info.exists; diff --git a/tools/vgconvert.c b/tools/vgconvert.c index d24556b87..acae0fcfa 100644 --- a/tools/vgconvert.c +++ b/tools/vgconvert.c @@ -98,7 +98,7 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name, continue; if (lvnum_from_lvid(&lv->lvid) < MAX_RESTRICTED_LVS) continue; - if (lv_info(cmd, lv, &info, 0, 0) && info.exists) { + if (lv_info(cmd, lv, 0, &info, 0, 0) && info.exists) { log_error("Logical volume %s must be " "deactivated before conversion.", lv->name); diff --git a/tools/vgreduce.c b/tools/vgreduce.c index 83994ccbf..eceafcd5a 100644 --- a/tools/vgreduce.c +++ b/tools/vgreduce.c @@ -108,7 +108,7 @@ static int _remove_lv(struct cmd_context *cmd, struct logical_volume *lv, * the mirrored LV also should be cleaned up. * Clean-up is currently done by caller (_make_vg_consistent()). */ - if ((lv_info(cmd, lv, &info, 0, 0) && info.exists) || + if ((lv_info(cmd, lv, 0, &info, 0, 0) && info.exists) || find_mirror_seg(first_seg(lv))) { if (!replace_lv_with_error_segment(lv)) return_0;