master - dmeventd: Simplify replacement unmonitor code.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b975532433dcbc...
Commit: b975532433dcbcc01e3cc0ebe8c6165e2d6470f8
Parent: 97ee5a1cd326cac4fa5642395d13ebbf13965970
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Aug 23 12:16:39 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Aug 23 12:16:39 2016 +0100
dmeventd: Simplify replacement unmonitor code.
---
lib/activate/activate.c | 35 +++++++++++++----------------------
1 files changed, 13 insertions(+), 22 deletions(-)
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index de5deae..22e3afa 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1831,52 +1831,43 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
if (monitor) {
if (monitored)
log_verbose("%s already monitored.", display_lvname(lv));
- else if (seg->segtype->ops->target_monitor_events)
+ else if (seg->segtype->ops->target_monitor_events) {
+ log_verbose("Monitoring %s%s", display_lvname(lv), test_mode() ? " [Test mode: skipping this]" : "");
monitor_fn = seg->segtype->ops->target_monitor_events;
+ }
} else {
if (!monitored)
log_verbose("%s already not monitored.", display_lvname(lv));
- else if (*dso)
+ else if (*dso) {
/*
* Divert unmonitor away from code that depends on the new segment
* type instead of the existing one if it's changing.
*/
+ log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
new_unmonitor = 1;
- else if (seg->segtype->ops->target_unmonitor_events)
- monitor_fn = seg->segtype->ops->target_unmonitor_events;
+ }
}
- if (new_unmonitor) {
- log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
-
- /* FIXME Test mode should really continue a bit further. */
- if (test_mode())
- return 1;
+ /* FIXME Test mode should really continue a bit further. */
+ if (test_mode())
+ continue;
+ if (new_unmonitor) {
if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
log_error("%s: segment unmonitoring failed.",
display_lvname(lv));
return 0;
}
-
- } else if (!monitor_fn)
- continue;
- else if (monitor_fn) {
- log_verbose("%sonitoring %s%s", monitor ? "M" : "Not m", display_lvname(lv),
- test_mode() ? " [Test mode: skipping this]" : "");
-
- /* FIXME Test mode should really continue a bit further. */
- if (test_mode())
- continue;
-
+ } else if (monitor_fn) {
/* FIXME specify events */
if (!monitor_fn(seg, 0)) {
log_error("%s: %s segment monitoring function failed.",
display_lvname(lv), seg->segtype->name);
return 0;
}
- }
+ } else
+ continue;
/* Check [un]monitor results */
/* Try a couple times if pending, but not forever... */
7 years, 8 months
master - dmeventd: Start merging back replacement unmonitor code.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=97ee5a1cd326ca...
Commit: 97ee5a1cd326cac4fa5642395d13ebbf13965970
Parent: 952e4133283ac4a593d0fa8daccdc55c907379de
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Aug 23 11:30:34 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Aug 23 11:30:34 2016 +0100
dmeventd: Start merging back replacement unmonitor code.
---
lib/activate/activate.c | 86 ++++++++++++++++------------------------------
1 files changed, 30 insertions(+), 56 deletions(-)
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 908c411..de5deae 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1690,48 +1690,6 @@ int target_register_events(struct cmd_context *cmd, const char *dso, const struc
#endif
-#ifdef DMEVENTD
-/* FIXME Restructure all this code so that unmonitoring works cleanly regardless of current target type. */
-static int _segment_independent_unmonitor(struct cmd_context *cmd, const struct logical_volume *lv, const char *dso)
-{
- int i, pending = 0, monitored;
- int r;
-
- log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
-
- /* FIXME Test mode should really continue a bit further. */
- if (test_mode())
- return 1;
-
- if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
- log_error("%s: segment unmonitoring function failed.",
- display_lvname(lv));
-
- return 0;
- }
-
- /* Check [un]monitor results */
- /* Try a couple times if pending, but not forever... */
- for (i = 0; i < 40; i++) {
- pending = 0;
- monitored = _device_registered_with_dmeventd(cmd, lv, &pending, NULL);
- if (pending || monitored)
- log_very_verbose("%s unmonitoring still pending: waiting...",
- display_lvname(lv));
- else
- break;
- usleep(10000 * i);
- }
-
- r = !monitored;
-
- if (!r && !error_message_produced())
- log_error("Not monitoring %s failed.", display_lvname(lv));
-
- return r;
-}
-#endif
-
/*
* Returns 0 if an attempt to (un)monitor the device failed.
* Returns 1 otherwise.
@@ -1750,6 +1708,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
static const struct lv_activate_opts zlaopts = { 0 };
struct lvinfo info;
const char *dso;
+ int new_unmonitor;
if (!laopts)
laopts = &zlaopts;
@@ -1867,6 +1826,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
monitored = (pending) ? 0 : monitored;
monitor_fn = NULL;
+ new_unmonitor = 0;
if (monitor) {
if (monitored)
@@ -1878,30 +1838,44 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
log_verbose("%s already not monitored.", display_lvname(lv));
else if (*dso)
/*
- * Divert unmonitor away from code that depends on the new segment
+ * Divert unmonitor away from code that depends on the new segment
* type instead of the existing one if it's changing.
*/
- return _segment_independent_unmonitor(cmd, lv, dso);
+ new_unmonitor = 1;
else if (seg->segtype->ops->target_unmonitor_events)
monitor_fn = seg->segtype->ops->target_unmonitor_events;
}
- /* Do [un]monitor */
- if (!monitor_fn)
- continue;
+ if (new_unmonitor) {
+ log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
- log_verbose("%sonitoring %s%s", monitor ? "M" : "Not m", display_lvname(lv),
- test_mode() ? " [Test mode: skipping this]" : "");
+ /* FIXME Test mode should really continue a bit further. */
+ if (test_mode())
+ return 1;
+
+ if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
+ log_error("%s: segment unmonitoring failed.",
+ display_lvname(lv));
+
+ return 0;
+ }
- /* FIXME Test mode should really continue a bit further. */
- if (test_mode())
+ } else if (!monitor_fn)
continue;
+ else if (monitor_fn) {
+ log_verbose("%sonitoring %s%s", monitor ? "M" : "Not m", display_lvname(lv),
+ test_mode() ? " [Test mode: skipping this]" : "");
- /* FIXME specify events */
- if (!monitor_fn(seg, 0)) {
- log_error("%s: %s segment monitoring function failed.",
- display_lvname(lv), seg->segtype->name);
- return 0;
+ /* FIXME Test mode should really continue a bit further. */
+ if (test_mode())
+ continue;
+
+ /* FIXME specify events */
+ if (!monitor_fn(seg, 0)) {
+ log_error("%s: %s segment monitoring function failed.",
+ display_lvname(lv), seg->segtype->name);
+ return 0;
+ }
}
/* Check [un]monitor results */
7 years, 8 months
master - dmeventd: Fix unmonitoring when segtype changes.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=952e4133283ac4...
Commit: 952e4133283ac4a593d0fa8daccdc55c907379de
Parent: 7646741ec67845f47b77eb647ef0fedc78d6b92c
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Aug 23 02:24:30 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Aug 23 02:26:14 2016 +0100
dmeventd: Fix unmonitoring when segtype changes.
When the segment type is being changed, unmonitoring an LV requires
the existing dso to be specified as a parameter, not the new one.
---
WHATS_NEW | 1 +
lib/activate/activate.c | 90 +++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 0b23018..fdf63e4 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.165 -
===================================
+ Fix dmeventd unmonitoring when segment type (and dso) changes.
Don't allow lvconvert --repair on raid0 devices or attempt to monitor them.
No longer adjust incorrect number of raid stripes supplied to lvcreate.
Move lcm and gcd to lib/misc.
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index d4c297e..908c411 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1548,7 +1548,7 @@ static struct dm_event_handler *_create_dm_event_handler(struct cmd_context *cmd
if (dm_event_handler_set_dmeventd_path(dmevh, find_config_tree_str(cmd, dmeventd_executable_CFG, NULL)))
goto_bad;
- if (dm_event_handler_set_dso(dmevh, dso))
+ if (dso && dm_event_handler_set_dso(dmevh, dso))
goto_bad;
if (dm_event_handler_set_uuid(dmevh, dmuuid))
@@ -1592,6 +1592,39 @@ static char *_build_target_uuid(struct cmd_context *cmd, const struct logical_vo
return build_dm_uuid(cmd->mem, lv, layer);
}
+static int _device_registered_with_dmeventd(struct cmd_context *cmd, const struct logical_volume *lv, int *pending, const char **dso)
+{
+ char *uuid;
+ enum dm_event_mask evmask = 0;
+ struct dm_event_handler *dmevh;
+
+ *pending = 0;
+
+ if (!(uuid = _build_target_uuid(cmd, lv)))
+ return_0;
+
+ if (!(dmevh = _create_dm_event_handler(cmd, uuid, NULL, 0, DM_EVENT_ALL_ERRORS)))
+ return_0;
+
+ if (dm_event_get_registered_device(dmevh, 0)) {
+ dm_event_handler_destroy(dmevh);
+ return 0;
+ }
+
+ evmask = dm_event_handler_get_event_mask(dmevh);
+ if (evmask & DM_EVENT_REGISTRATION_PENDING) {
+ *pending = 1;
+ evmask &= ~DM_EVENT_REGISTRATION_PENDING;
+ }
+
+ if (dso && (*dso = dm_event_handler_get_dso(dmevh)) && !(*dso = dm_pool_strdup(cmd->mem, *dso)))
+ log_error("Failed to duplicate dso name.");
+
+ dm_event_handler_destroy(dmevh);
+
+ return evmask;
+}
+
int target_registered_with_dmeventd(struct cmd_context *cmd, const char *dso,
const struct logical_volume *lv, int *pending)
{
@@ -1657,6 +1690,48 @@ int target_register_events(struct cmd_context *cmd, const char *dso, const struc
#endif
+#ifdef DMEVENTD
+/* FIXME Restructure all this code so that unmonitoring works cleanly regardless of current target type. */
+static int _segment_independent_unmonitor(struct cmd_context *cmd, const struct logical_volume *lv, const char *dso)
+{
+ int i, pending = 0, monitored;
+ int r;
+
+ log_verbose("Not monitoring %s with %s%s", display_lvname(lv), dso, test_mode() ? " [Test mode: skipping this]" : "");
+
+ /* FIXME Test mode should really continue a bit further. */
+ if (test_mode())
+ return 1;
+
+ if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
+ log_error("%s: segment unmonitoring function failed.",
+ display_lvname(lv));
+
+ return 0;
+ }
+
+ /* Check [un]monitor results */
+ /* Try a couple times if pending, but not forever... */
+ for (i = 0; i < 40; i++) {
+ pending = 0;
+ monitored = _device_registered_with_dmeventd(cmd, lv, &pending, NULL);
+ if (pending || monitored)
+ log_very_verbose("%s unmonitoring still pending: waiting...",
+ display_lvname(lv));
+ else
+ break;
+ usleep(10000 * i);
+ }
+
+ r = !monitored;
+
+ if (!r && !error_message_produced())
+ log_error("Not monitoring %s failed.", display_lvname(lv));
+
+ return r;
+}
+#endif
+
/*
* Returns 0 if an attempt to (un)monitor the device failed.
* Returns 1 otherwise.
@@ -1674,6 +1749,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
uint32_t s;
static const struct lv_activate_opts zlaopts = { 0 };
struct lvinfo info;
+ const char *dso;
if (!laopts)
laopts = &zlaopts;
@@ -1781,7 +1857,11 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
!seg->segtype->ops->target_monitored) /* doesn't support registration */
continue;
- monitored = seg->segtype->ops->target_monitored(seg, &pending);
+ if (!monitor)
+ /* When unmonitoring, obtain existing dso being used. */
+ monitored = _device_registered_with_dmeventd(cmd, seg->lv, &pending, &dso);
+ else
+ monitored = seg->segtype->ops->target_monitored(seg, &pending);
/* FIXME: We should really try again if pending */
monitored = (pending) ? 0 : monitored;
@@ -1796,6 +1876,12 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
} else {
if (!monitored)
log_verbose("%s already not monitored.", display_lvname(lv));
+ else if (*dso)
+ /*
+ * Divert unmonitor away from code that depends on the new segment
+ * type instead of the existing one if it's changing.
+ */
+ return _segment_independent_unmonitor(cmd, lv, dso);
else if (seg->segtype->ops->target_unmonitor_events)
monitor_fn = seg->segtype->ops->target_unmonitor_events;
}
7 years, 8 months
master - raid: Don't monitor raid0 or raid0_meta LVs.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7646741ec67845...
Commit: 7646741ec67845f47b77eb647ef0fedc78d6b92c
Parent: 896912b14d80e49582759d0c5b14b16954b3857d
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Sat Aug 20 02:14:33 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Sat Aug 20 02:14:33 2016 +0100
raid: Don't monitor raid0 or raid0_meta LVs.
---
WHATS_NEW | 2 +-
lib/raid/raid.c | 7 ++++++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5a258c1..0b23018 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,6 @@
Version 2.02.165 -
===================================
- Don't allow lvconvert --repair on raid0 devices.
+ Don't allow lvconvert --repair on raid0 devices or attempt to monitor them.
No longer adjust incorrect number of raid stripes supplied to lvcreate.
Move lcm and gcd to lib/misc.
Suppress some unnecessary --stripesize parameter warnings.
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index ef5794f..3bc3c75 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -499,7 +499,12 @@ static struct segment_type *_init_raid_segtype(struct cmd_context *cmd,
segtype->ops = &_raid_ops;
segtype->name = rt->name;
- segtype->flags = SEG_RAID | SEG_ONLY_EXCLUSIVE | rt->extra_flags | monitored;
+ segtype->flags = SEG_RAID | SEG_ONLY_EXCLUSIVE | rt->extra_flags;
+
+ /* Never monitor raid0 or raid0_meta LVs */
+ if (!segtype_is_any_raid0(segtype))
+ segtype->flags |= monitored;
+
segtype->parity_devs = rt->parity;
log_very_verbose("Initialised segtype: %s", segtype->name);
7 years, 8 months
master - lvcreate: Never treat raid0 as linear.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=896912b14d80e4...
Commit: 896912b14d80e49582759d0c5b14b16954b3857d
Parent: 88e6abc5a091bbe8d826968eafe27936df0e260c
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Fri Aug 19 23:57:30 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Fri Aug 19 23:57:30 2016 +0100
lvcreate: Never treat raid0 as linear.
raid0 and raid0_meta require, or default to, at least 2 stripes.
---
tools/toollib.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/tools/toollib.c b/tools/toollib.c
index 4f4c315..ec6f2f7 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1281,7 +1281,7 @@ static int _validate_stripe_params(struct cmd_context *cmd, const struct segment
if (!stripe_size_required && *stripe_size) {
log_print_unless_silent("Ignoring stripesize argument for %s devices.", segtype->name);
*stripe_size = 0;
- } else if (*stripes == 1 && (segtype_is_striped(segtype) || segtype_is_mirror(segtype))) {
+ } else if (*stripes == 1 && (segtype_is_striped_target(segtype) || segtype_is_mirror(segtype))) {
stripe_size_required = 0;
if (*stripe_size) {
log_print_unless_silent("Ignoring stripesize argument with single stripe.");
7 years, 8 months
master - lvconvert: Don't allow --repair on raid0 LVs.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=88e6abc5a091bb...
Commit: 88e6abc5a091bbe8d826968eafe27936df0e260c
Parent: bf0eaafa6b81a271d40031b337c614bb9b56159a
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Fri Aug 19 23:42:01 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Fri Aug 19 23:42:01 2016 +0100
lvconvert: Don't allow --repair on raid0 LVs.
---
WHATS_NEW | 1 +
tools/lvconvert.c | 8 +++++++-
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 764cc73..5a258c1 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.165 -
===================================
+ Don't allow lvconvert --repair on raid0 devices.
No longer adjust incorrect number of raid stripes supplied to lvcreate.
Move lcm and gcd to lib/misc.
Suppress some unnecessary --stripesize parameter warnings.
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index ac019ec..fefec7c 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1963,7 +1963,13 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
return 0;
}
- if (!seg_is_striped(seg) && !lv_raid_percent(lv, &sync_percent)) {
+ if (seg_is_striped(seg)) {
+ log_error("Cannot repair LV %s of type raid0.",
+ display_lvname(lv));
+ return 0;
+ }
+
+ if (!lv_raid_percent(lv, &sync_percent)) {
log_error("Unable to determine sync status of %s.",
display_lvname(lv));
return 0;
7 years, 8 months
master - libdaemon: add errno to error message
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=bf0eaafa6b81a2...
Commit: bf0eaafa6b81a271d40031b337c614bb9b56159a
Parent: e192fde6878a0e32316125b2e4c9813f4a95bede
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Fri Aug 19 10:59:46 2016 -0500
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Fri Aug 19 10:59:46 2016 -0500
libdaemon: add errno to error message
---
libdaemon/server/daemon-server.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
index 4d65466..0e37dfb 100644
--- a/libdaemon/server/daemon-server.c
+++ b/libdaemon/server/daemon-server.c
@@ -491,7 +491,7 @@ static int handle_connect(daemon_state s)
client.socket_fd = accept(s.socket_fd, (struct sockaddr *) &sockaddr, &sl);
if (client.socket_fd < 0) {
- ERROR(&s, "Failed to accept connection.");
+ ERROR(&s, "Failed to accept connection errno %d.", errno);
return 0;
}
@@ -513,7 +513,7 @@ static int handle_connect(daemon_state s)
ts->client = client;
if (pthread_create(&ts->client.thread_id, NULL, _client_thread, ts)) {
- ERROR(&s, "Failed to create client thread.");
+ ERROR(&s, "Failed to create client thread errno %d.", errno);
return 0;
}
7 years, 8 months
master - lvcreate: Drop warning messages for number of raid stripes.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e192fde6878a0e...
Commit: e192fde6878a0e32316125b2e4c9813f4a95bede
Parent: ea0f604e704dc8418d962e20529fd1bcddf06bb7
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Fri Aug 19 14:53:33 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Fri Aug 19 14:53:33 2016 +0100
lvcreate: Drop warning messages for number of raid stripes.
It's now just setting a default, not adjusting the user's parameter.
---
tools/lvcreate.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index d3a64af..33664c5 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -470,8 +470,7 @@ static int _read_raid_params(struct cmd_context *cmd,
return 0;
}
- log_warn("Adjusting stripes to the minimum of 2 for %s.",
- lp->segtype->name);
+ log_verbose("Using 2 stripes for %s.", lp->segtype->name);
lp->stripes = 2;
}
@@ -497,7 +496,7 @@ static int _read_raid_params(struct cmd_context *cmd,
return 0;
}
- log_warn("Adjusting stripes to the minimum of 3 for %s.", lp->segtype->name);
+ log_verbose("Using 3 stripes for %s.", lp->segtype->name);
lp->stripes = 3;
} else if (lp->stripes < 2) {
if (lp->stripes_supplied) {
@@ -505,7 +504,7 @@ static int _read_raid_params(struct cmd_context *cmd,
return 0;
}
- log_warn("Adjusting stripes to the minimum of 2 for %s.", lp->segtype->name);
+ log_verbose("Using 2 stripes for %s.", lp->segtype->name);
lp->stripes = 2;
}
7 years, 8 months
master - lvcreate: No longer adjust --stripes for raid types.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ea0f604e704dc8...
Commit: ea0f604e704dc8418d962e20529fd1bcddf06bb7
Parent: c1a0a2c7121af78d469f3908d6a7763b51f377a5
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Fri Aug 19 14:19:51 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Fri Aug 19 14:19:51 2016 +0100
lvcreate: No longer adjust --stripes for raid types.
If the number of stripes requested is incompatible with the requested
type of raid, give an error instead of adjusting it.
If no stripes argument is supplied, continue to use an appropriate
default.
---
WHATS_NEW | 1 +
tools/lvcreate.c | 28 ++++++++++++++++++++++++----
2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index e2a9622..764cc73 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.165 -
===================================
+ No longer adjust incorrect number of raid stripes supplied to lvcreate.
Move lcm and gcd to lib/misc.
Suppress some unnecessary --stripesize parameter warnings.
Fix 'pvmove -n name ...' to prohibit collocation of RAID SubLVs
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index 6fd0fb9..d3a64af 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -464,6 +464,12 @@ static int _read_raid_params(struct cmd_context *cmd,
/*
* RAID10 needs at least 4 stripes
*/
+ if (lp->stripes_supplied) {
+ log_error("Minimum of 2 stripes required for %s.",
+ lp->segtype->name);
+ return 0;
+ }
+
log_warn("Adjusting stripes to the minimum of 2 for %s.",
lp->segtype->name);
lp->stripes = 2;
@@ -480,14 +486,28 @@ static int _read_raid_params(struct cmd_context *cmd,
/*
* RAID1 does not take a stripe arg
*/
- log_error("Stripe argument cannot be used with segment type, %s",
+ log_error("Stripes argument cannot be used with segment type, %s",
lp->segtype->name);
return 0;
}
- } else if (lp->stripes < 2)
- /* No stripes argument was given */
- lp->stripes = seg_is_any_raid6(lp) ? 3 : 2;
+ } else if (seg_is_any_raid6(lp) && lp->stripes < 3) {
+ if (lp->stripes_supplied) {
+ log_error("Minimum of 3 stripes required for %s.", lp->segtype->name);
+ return 0;
+ }
+
+ log_warn("Adjusting stripes to the minimum of 3 for %s.", lp->segtype->name);
+ lp->stripes = 3;
+ } else if (lp->stripes < 2) {
+ if (lp->stripes_supplied) {
+ log_error("Minimum of 2 stripes required for %s.", lp->segtype->name);
+ return 0;
+ }
+
+ log_warn("Adjusting stripes to the minimum of 2 for %s.", lp->segtype->name);
+ lp->stripes = 2;
+ }
if (seg_is_raid1(lp)) {
if (lp->stripe_size) {
7 years, 8 months
master - toollib: Record whether or not stripes/stripe_size args supplied.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c1a0a2c7121af7...
Commit: c1a0a2c7121af78d469f3908d6a7763b51f377a5
Parent: c27963c56630417b7a91d073c9a73f54f3fb5c99
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Fri Aug 19 13:51:43 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Fri Aug 19 13:51:43 2016 +0100
toollib: Record whether or not stripes/stripe_size args supplied.
---
lib/metadata/metadata-exported.h | 3 +++
tools/lvconvert.c | 9 ++++-----
tools/lvcreate.c | 2 +-
tools/toollib.c | 6 +++++-
tools/toollib.h | 3 ++-
5 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 97692dc..37db89c 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -945,6 +945,9 @@ struct lvcreate_params {
uint32_t chunk_size; /* snapshot */
uint32_t region_size; /* mirror */
+ unsigned stripes_supplied; /* striped */
+ unsigned stripe_size_supplied; /* striped */
+
uint32_t mirrors; /* mirror */
uint32_t min_recovery_rate; /* RAID */
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 23e3cd5..ac019ec 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -86,7 +86,8 @@ struct lvconvert_params {
sign_t mirrors_sign;
uint32_t stripes;
uint32_t stripe_size;
- uint32_t stripe_size_supplied;
+ unsigned stripes_supplied;
+ unsigned stripe_size_supplied;
uint32_t read_ahead;
cache_mode_t cache_mode; /* cache */
const char *policy_name; /* cache */
@@ -3183,7 +3184,7 @@ static int _lvconvert_pool(struct cmd_context *cmd,
return_0;
if (!get_stripe_params(cmd, get_segtype_from_string(cmd, SEG_TYPE_NAME_STRIPED),
- &lp->stripes, &lp->stripe_size))
+ &lp->stripes, &lp->stripe_size, &lp->stripes_supplied, &lp->stripe_size_supplied))
return_0;
if (!archive(vg))
@@ -4473,10 +4474,8 @@ static int _lvconvert(struct cmd_context *cmd, struct logical_volume *lv,
if (_mirror_or_raid_type_requested(cmd, lp->type_str) || _raid0_type_requested(lp->type_str) ||
_striped_type_requested(lp->type_str) || lp->repair || lp->mirrorlog || lp->corelog) {
/* FIXME Handle +/- adjustments too? */
- if (!get_stripe_params(cmd, lp->segtype, &lp->stripes, &lp->stripe_size))
+ if (!get_stripe_params(cmd, lp->segtype, &lp->stripes, &lp->stripe_size, &lp->stripes_supplied, &lp->stripe_size_supplied))
return_0;
- /* FIXME Move this into the get function */
- lp->stripe_size_supplied = arg_is_set(cmd, stripesize_ARG);
if (_raid0_type_requested(lp->type_str) || _striped_type_requested(lp->type_str))
/* FIXME Shouldn't need to override get_stripe_params which defaults to 1 stripe (i.e. linear)! */
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index a389d79..6fd0fb9 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -1061,7 +1061,7 @@ static int _lvcreate_params(struct cmd_context *cmd,
if (!_lvcreate_name_params(cmd, &argc, &argv, lp) ||
!_read_size_params(cmd, lp, lcp) ||
- !get_stripe_params(cmd, lp->segtype, &lp->stripes, &lp->stripe_size) ||
+ !get_stripe_params(cmd, lp->segtype, &lp->stripes, &lp->stripe_size, &lp->stripes_supplied, &lp->stripe_size_supplied) ||
(lp->create_pool &&
!get_pool_params(cmd, lp->segtype, &lp->passed_args,
&lp->pool_metadata_size, &lp->pool_metadata_spare,
diff --git a/tools/toollib.c b/tools/toollib.c
index 4f8cbb4..4f4c315 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1318,13 +1318,17 @@ static int _validate_stripe_params(struct cmd_context *cmd, const struct segment
* power of 2, we must divide UINT_MAX by four and add 1 (to round it
* up to the power of 2)
*/
-int get_stripe_params(struct cmd_context *cmd, const struct segment_type *segtype, uint32_t *stripes, uint32_t *stripe_size)
+int get_stripe_params(struct cmd_context *cmd, const struct segment_type *segtype,
+ uint32_t *stripes, uint32_t *stripe_size,
+ unsigned *stripes_supplied, unsigned *stripe_size_supplied)
{
/* stripes_long_ARG takes precedence (for lvconvert) */
/* FIXME Cope with relative +/- changes for lvconvert. */
*stripes = arg_uint_value(cmd, arg_is_set(cmd, stripes_long_ARG) ? stripes_long_ARG : stripes_ARG, 1);
+ *stripes_supplied = arg_is_set(cmd, stripes_long_ARG) ? : arg_is_set(cmd, stripes_ARG);
*stripe_size = arg_uint_value(cmd, stripesize_ARG, 0);
+ *stripe_size_supplied = arg_is_set(cmd, stripesize_ARG);
if (*stripe_size) {
if (arg_sign_value(cmd, stripesize_ARG, SIGN_NONE) == SIGN_MINUS) {
log_error("Negative stripesize is invalid.");
diff --git a/tools/toollib.h b/tools/toollib.h
index d5de733..531f690 100644
--- a/tools/toollib.h
+++ b/tools/toollib.h
@@ -197,7 +197,8 @@ int get_pool_params(struct cmd_context *cmd,
int *zero);
int get_stripe_params(struct cmd_context *cmd, const struct segment_type *segtype,
- uint32_t *stripes, uint32_t *stripe_size);
+ uint32_t *stripes, uint32_t *stripe_size,
+ unsigned *stripes_supplied, unsigned *stripe_size_supplied);
int get_cache_params(struct cmd_context *cmd,
cache_mode_t *cache_mode,
7 years, 8 months