[lvm-devel] master - activate_lvs: use exclusive activation
Zdenek Kabelac
zkabelac at sourceware.org
Wed Nov 15 13:09:47 UTC 2017
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=838592a17119814adc5564569ef431fb0000c639
Commit: 838592a17119814adc5564569ef431fb0000c639
Parent: 8212e1047e2f42f4e13e2aadec5cf73b8d3a082e
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Tue Nov 14 11:46:43 2017 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Wed Nov 15 14:03:22 2017 +0100
activate_lvs: use exclusive activation
There is no need to differentiation between clustered VG and normal VG.
As the activation depends on locking type.
Use unconditionally locally exclusive activation for pvmove.
---
lib/locking/locking.c | 11 +---
lib/locking/locking.h | 2 +-
tools/pvmove.c | 119 ++++++++----------------------------------------
3 files changed, 24 insertions(+), 108 deletions(-)
diff --git a/lib/locking/locking.c b/lib/locking/locking.c
index 067cd69..0426744 100644
--- a/lib/locking/locking.c
+++ b/lib/locking/locking.c
@@ -460,19 +460,14 @@ int activate_lv_excl(struct cmd_context *cmd, const struct logical_volume *lv)
}
/* Lock a list of LVs */
-int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs, unsigned exclusive)
+int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs)
{
struct dm_list *lvh;
struct lv_list *lvl;
dm_list_iterate_items(lvl, lvs) {
- if (!exclusive && !lv_is_active_exclusive(lvl->lv)) {
- if (!activate_lv(cmd, lvl->lv)) {
- log_error("Failed to activate %s", lvl->lv->name);
- return 0;
- }
- } else if (!activate_lv_excl(cmd, lvl->lv)) {
- log_error("Failed to activate %s", lvl->lv->name);
+ if (!activate_lv_excl_local(cmd, lvl->lv)) {
+ log_error("Failed to activate %s", display_lvname(lvl->lv));
dm_list_uniterate(lvh, lvs, &lvl->list) {
lvl = dm_list_item(lvh, struct lv_list);
if (!deactivate_lv(cmd, lvl->lv))
diff --git a/lib/locking/locking.h b/lib/locking/locking.h
index d39a725..4b5490e 100644
--- a/lib/locking/locking.h
+++ b/lib/locking/locking.h
@@ -266,6 +266,6 @@ int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs,
struct volume_group *vg_to_revert);
int resume_lvs(struct cmd_context *cmd, struct dm_list *lvs);
int revert_lvs(struct cmd_context *cmd, struct dm_list *lvs);
-int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs, unsigned exclusive);
+int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs);
#endif
diff --git a/tools/pvmove.c b/tools/pvmove.c
index 0f54a50..ff36b55 100644
--- a/tools/pvmove.c
+++ b/tools/pvmove.c
@@ -64,16 +64,6 @@ static int _pvmove_target_present(struct cmd_context *cmd, int clustered)
return found;
}
-static unsigned _pvmove_is_exclusive(struct cmd_context *cmd,
- struct volume_group *vg)
-{
- if (vg_is_clustered(vg))
- if (!_pvmove_target_present(cmd, 1))
- return 1;
-
- return 0;
-}
-
/* Allow /dev/vgname/lvname, vgname/lvname or lvname */
static const char *_extract_lvname(struct cmd_context *cmd, const char *vgname,
const char *arg)
@@ -346,8 +336,7 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
const char *lv_name,
struct dm_list *allocatable_pvs,
alloc_policy_t alloc,
- struct dm_list **lvs_changed,
- unsigned *exclusive)
+ struct dm_list **lvs_changed)
{
struct logical_volume *lv_mirr, *lv;
struct lv_segment *seg;
@@ -555,25 +544,6 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
return NULL;
}
- if (vg_is_clustered(vg) && lv_active_count && *exclusive) {
- log_error("Cannot move in clustered VG %s, "
- "clustered mirror (cmirror) not detected "
- "and LVs are activated non-exclusively.",
- vg->name);
- return NULL;
- }
-
- if (vg_is_clustered(vg) && lv_exclusive_count) {
- if (lv_active_count) {
- log_error("Cannot move in clustered VG %s "
- "if some LVs are activated "
- "exclusively while others don't.",
- vg->name);
- return NULL;
- }
- *exclusive = 1;
- }
-
if (!lv_add_mirrors(cmd, lv_mirr, 1, 1, 0, 0, log_count,
allocatable_pvs, alloc,
(arg_is_set(cmd, atomic_ARG)) ?
@@ -590,83 +560,37 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
return lv_mirr;
}
-static int _activate_lv(struct cmd_context *cmd, struct logical_volume *lv_mirr,
- unsigned exclusive)
-{
- int r = 0;
-
- if (exclusive || lv_is_active_exclusive(lv_mirr))
- r = activate_lv_excl(cmd, lv_mirr);
- else
- r = activate_lv(cmd, lv_mirr);
-
- if (!r)
- stack;
-
- return r;
-}
-
/*
* Called to set up initial pvmove LV only.
* (Not called after first or any other section completes.)
*/
-static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
- struct logical_volume *lv_mirr,
- struct dm_list *lvs_changed, unsigned exclusive)
+static int _update_metadata(struct logical_volume *lv_mirr,
+ struct dm_list *lvs_changed)
{
- int r = 0;
-
- log_verbose("Setting up pvmove in on-disk volume group metadata.");
- if (!vg_write(vg)) {
- log_error("ABORTING: Volume group metadata update failed.");
- return 0;
- }
-
- if (!suspend_lvs(cmd, lvs_changed, vg)) {
- log_error("ABORTING: Temporary pvmove mirror activation failed.");
- /* FIXME Add a recovery path for first time too. */
- return 0;
- }
+ struct lv_list *lvl;
+ struct logical_volume *lv = lv_mirr;
- /* Commit on-disk metadata */
- if (!vg_commit(vg)) {
- log_error("ABORTING: Volume group metadata update failed.");
- if (!resume_lvs(cmd, lvs_changed))
- log_error("Unable to resume logical volumes.");
- return 0;
+ dm_list_iterate_items(lvl, lvs_changed) {
+ lv = lvl->lv;
+ break;
}
- /* Activate the temporary mirror LV */
- /* Only the first mirror segment gets activated as a mirror */
- /* FIXME: Add option to use a log */
- if (!exclusive && _pvmove_is_exclusive(cmd, vg))
- exclusive = 1;
+ if (!lv_update_and_reload(lv))
+ return_0;
- if (!_activate_lv(cmd, lv_mirr, exclusive)) {
- if (test_mode()) {
- r = 1;
- goto out;
- }
+ /* Ensure mirror LV is active */
+ if (!activate_lv_excl_local(lv_mirr->vg->cmd, lv_mirr)) {
+ if (test_mode())
+ return 1;
/*
* FIXME Run --abort internally here.
*/
log_error("ABORTING: Temporary pvmove mirror activation failed. Run pvmove --abort.");
- goto out;
- }
-
- r = 1;
-
-out:
- if (!resume_lvs(cmd, lvs_changed)) {
- log_error("Unable to resume logical volumes.");
- r = 0;
+ return 0;
}
- if (r)
- backup(vg);
-
- return r;
+ return 1;
}
static int _copy_id_components(struct cmd_context *cmd,
@@ -698,7 +622,6 @@ static int _pvmove_setup_single(struct cmd_context *cmd,
struct logical_volume *lv = NULL;
const char *pv_name = pv_dev_name(pv);
unsigned flags = PVMOVE_FIRST_TIME;
- unsigned exclusive;
int r = ECMD_FAILED;
pp->found_pv = 1;
@@ -745,8 +668,6 @@ static int _pvmove_setup_single(struct cmd_context *cmd,
}
}
- exclusive = _pvmove_is_exclusive(cmd, vg);
-
if ((lv_mirr = find_pvmove_lv(vg, pv_dev(pv), PVMOVE))) {
log_print_unless_silent("Detected pvmove in progress for %s.", pv_name);
if (pp->pv_count || lv_name)
@@ -758,7 +679,7 @@ static int _pvmove_setup_single(struct cmd_context *cmd,
}
/* Ensure mirror LV is active */
- if (!_activate_lv(cmd, lv_mirr, exclusive)) {
+ if (!activate_lv_excl_local(cmd, lv_mirr)) {
log_error("ABORTING: Temporary mirror activation failed.");
goto out;
}
@@ -783,12 +704,12 @@ static int _pvmove_setup_single(struct cmd_context *cmd,
if (!(lv_mirr = _set_up_pvmove_lv(cmd, vg, source_pvl, lv_name,
allocatable_pvs, pp->alloc,
- &lvs_changed, &exclusive)))
+ &lvs_changed)))
goto_out;
}
/* Lock lvs_changed and activate (with old metadata) */
- if (!activate_lvs(cmd, lvs_changed, exclusive))
+ if (!activate_lvs(cmd, lvs_changed))
goto_out;
/* FIXME Presence of a mirror once set PVMOVE - now remove associated logic */
@@ -799,7 +720,7 @@ static int _pvmove_setup_single(struct cmd_context *cmd,
goto out;
if (flags & PVMOVE_FIRST_TIME)
- if (!_update_metadata(cmd, vg, lv_mirr, lvs_changed, exclusive))
+ if (!_update_metadata(lv_mirr, lvs_changed))
goto_out;
/* LVs are all in status LOCKED */
More information about the lvm-devel
mailing list