master - cleanup: more use of lvseg_name
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1f5dde38a7ec18...
Commit: 1f5dde38a7ec18d86c38c0b7e1cb2a953ea5cf44
Parent: dc5bb12956d11f84352d45c69805570fc64ba66e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sun Dec 25 00:29:30 2016 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
cleanup: more use of lvseg_name
Use existing function lvseg_name().
---
lib/activate/activate.c | 2 +-
lib/activate/dev_manager.c | 2 +-
lib/format1/import-export.c | 2 +-
lib/metadata/cache_manip.c | 2 +-
lib/metadata/lv_manip.c | 2 +-
lib/metadata/raid_manip.c | 11 +----------
tools/lvchange.c | 2 +-
7 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 742d838..608611f 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1940,7 +1940,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
/* FIXME specify events */
if (!monitor_fn(seg, 0)) {
log_error("%s: %s segment monitoring function failed.",
- display_lvname(lv), seg->segtype->name);
+ display_lvname(lv), lvseg_name(seg));
return 0;
}
} else
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 685c055..6df254a 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -2493,7 +2493,7 @@ static int _add_target_to_dtree(struct dev_manager *dm,
if (!seg->segtype->ops->add_target_line) {
log_error(INTERNAL_ERROR "_emit_target cannot handle "
- "segment type %s.", seg->segtype->name);
+ "segment type %s.", lvseg_name(seg));
return 0;
}
diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c
index 146623e..c174031 100644
--- a/lib/format1/import-export.c
+++ b/lib/format1/import-export.c
@@ -398,7 +398,7 @@ int export_extents(struct disk_list *dl, uint32_t lv_num,
if (!(seg->segtype->flags & SEG_FORMAT1_SUPPORT)) {
log_error("Segment type %s in LV %s: "
"unsupported by format1",
- seg->segtype->name, lv->name);
+ lvseg_name(seg), lv->name);
return 0;
}
if (seg_type(seg, s) != AREA_PV) {
diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index cddaf82..aee3db8 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -326,7 +326,7 @@ int validate_lv_cache_create_origin(const struct logical_volume *origin_lv)
lv_is_cow(origin_lv) || lv_is_merging_cow(origin_lv) ||
lv_is_virtual(origin_lv)) {
log_error("Cache is not supported with %s segment type of the original logical volume %s.",
- first_seg(origin_lv)->segtype->name, display_lvname(origin_lv));
+ lvseg_name(first_seg(origin_lv)), display_lvname(origin_lv));
return 0;
}
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index e948512..9759cda 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4596,7 +4596,7 @@ static int _lvresize_adjust_policy(const struct logical_volume *lv,
if (!policy_amount) {
log_error("Can't extend %s with %s autoextend percent set to 0%%.",
- display_lvname(lv), first_seg(lv)->segtype->name);
+ display_lvname(lv), lvseg_name(first_seg(lv)));
return 0;
}
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 5ec86a3..bceff79 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -2724,15 +2724,6 @@ static const char *_get_segtype_alias(const struct segment_type *segtype)
return "";
}
-/* Return "linear" for striped segtype with 1 area instead of "striped" */
-static const char *_get_segtype_name(const struct segment_type *segtype, unsigned new_image_count)
-{
- if (!segtype || (segtype_is_striped(segtype) && new_image_count == 1))
- return "linear";
-
- return segtype->name;
-}
-
static int _log_possible_conversion_types(const struct logical_volume *lv, const struct segment_type *new_segtype)
{
unsigned possible_conversions = 0;
@@ -2753,7 +2744,7 @@ static int _log_possible_conversion_types(const struct logical_volume *lv, const
log_error("Converting %s from %s%s%s%s is "
"directly possible to the following layout%s:",
- display_lvname(lv), _get_segtype_name(seg->segtype, seg->area_count),
+ display_lvname(lv), lvseg_name(seg),
*alias ? " (same as " : "", alias, *alias ? ")" : "",
possible_conversions > 1 ? "s" : "");
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 250d720..9fec436 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -431,7 +431,7 @@ static int _lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
/* Separate mirror log or metadata devices so we can clear them */
if (!detach_metadata_devices(seg, &device_list)) {
log_error("Failed to clear %s %s for %s.",
- seg->segtype->name, seg_is_raid(seg) ?
+ lvseg_name(seg), seg_is_raid(seg) ?
"metadata area" : "mirror log", display_lvname(lv));
return 0;
}
7 years, 3 months
master - cleanup: use macros
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=dc5bb12956d11f...
Commit: dc5bb12956d11f84352d45c69805570fc64ba66e
Parent: ee784fd28f70eb35e23da91fe935c601e44648aa
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Dec 24 23:46:47 2016 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
cleanup: use macros
---
lib/metadata/lv_manip.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index e5808ec..e948512 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -3467,7 +3467,7 @@ int lv_add_segment(struct alloc_handle *ah,
region_size))
return_0;
- if ((segtype->flags & SEG_CAN_SPLIT) && !lv_merge_segments(lv)) {
+ if (segtype_can_split(segtype) && !lv_merge_segments(lv)) {
log_error("Couldn't merge segments after extending "
"logical volume.");
return 0;
@@ -7048,7 +7048,7 @@ static int _should_wipe_lv(struct lvcreate_params *lp,
struct logical_volume *lv, int warn)
{
/* Unzeroable segment */
- if (first_seg(lv)->segtype->flags & SEG_CANNOT_BE_ZEROED)
+ if (seg_cannot_be_zeroed(first_seg(lv)))
return 0;
/* Thin snapshot need not to be zeroed */
7 years, 3 months
master - cleanup: defines
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ee784fd28f70eb...
Commit: ee784fd28f70eb35e23da91fe935c601e44648aa
Parent: 377288fe0362dd41f2332a6634f8f1f7e6edccbb
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Dec 24 23:24:37 2016 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
cleanup: defines
---
lib/metadata/segtype.h | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/lib/metadata/segtype.h b/lib/metadata/segtype.h
index 292b8b6..c20149d 100644
--- a/lib/metadata/segtype.h
+++ b/lib/metadata/segtype.h
@@ -144,6 +144,12 @@ struct dev_manager;
#define segtype_is_virtual(segtype) ((segtype)->flags & SEG_VIRTUAL ? 1 : 0)
#define segtype_is_unknown(segtype) ((segtype)->flags & SEG_UNKNOWN ? 1 : 0)
+#define segtype_can_split(segtype) ((segtype)->flags & SEG_CAN_SPLIT ? 1 : 0)
+#define segtype_cannot_be_zeroed(segtype) ((segtype)->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
+#define segtype_monitored(segtype) ((segtype)->flags & SEG_MONITORED ? 1 : 0)
+#define segtype_only_exclusive(segtype) ((segtype)->flags & SEG_ONLY_EXCLUSIVE ? 1 : 0)
+#define segtype_can_error_when_full(segtype) ((segtype)->flags & SEG_CAN_ERROR_WHEN_FULL ? 1 : 0)
+
#define segtype_supports_stripe_size(segtype) \
((segtype_is_striped(segtype) || segtype_is_mirror(segtype) || \
segtype_is_cache(segtype) || segtype_is_cache_pool(segtype) || \
@@ -188,11 +194,11 @@ struct dev_manager;
#define seg_is_thin_volume(seg) segtype_is_thin_volume((seg)->segtype)
#define seg_is_virtual(seg) segtype_is_virtual((seg)->segtype)
#define seg_unknown(seg) segtype_is_unknown((seg)->segtype)
-#define seg_can_split(seg) ((seg)->segtype->flags & SEG_CAN_SPLIT ? 1 : 0)
-#define seg_cannot_be_zeroed(seg) ((seg)->segtype->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
-#define seg_monitored(seg) ((seg)->segtype->flags & SEG_MONITORED ? 1 : 0)
-#define seg_only_exclusive(seg) ((seg)->segtype->flags & SEG_ONLY_EXCLUSIVE ? 1 : 0)
-#define seg_can_error_when_full(seg) ((seg)->segtype->flags & SEG_CAN_ERROR_WHEN_FULL ? 1 : 0)
+#define seg_can_split(seg) segtype_can_split((seg)->segtype)
+#define seg_cannot_be_zeroed(seg) segtype_cannot_be_zeroed((seg)->segtype)
+#define seg_monitored(seg) segtype_monitored((seg)->segtype)
+#define seg_only_exclusive(seg) segtype_only_exclusive((seg)->segtype)
+#define seg_can_error_when_full(seg) segtype_can_error_when_full((seg)->segtype)
struct segment_type {
struct dm_list list; /* Internal */
7 years, 3 months
master - cleanup: reuse existing code
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=377288fe0362dd...
Commit: 377288fe0362dd41f2332a6634f8f1f7e6edccbb
Parent: 95d5877f7af781c53c7865868745dc683d2b0413
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Dec 24 23:10:06 2016 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
cleanup: reuse existing code
---
lib/metadata/metadata.c | 34 ++++++++++++++--------------------
1 files changed, 14 insertions(+), 20 deletions(-)
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index c636fe2..1289fec 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -5447,6 +5447,19 @@ int vg_flag_write_locked(struct volume_group *vg)
return 0;
}
+static int _access_vg_clustered(struct cmd_context *cmd, const struct volume_group *vg)
+{
+ if (vg_is_clustered(vg) && !locking_is_clustered()) {
+ if (!cmd->ignore_clustered_vgs)
+ log_error("Skipping clustered volume group %s", vg->name);
+ else
+ log_verbose("Skipping clustered volume group %s", vg->name);
+ return 0;
+ }
+
+ return 1;
+}
+
/*
* Performs a set of checks against a VG according to bits set in status
* and returns FAILED_* bits for those that aren't acceptable.
@@ -5458,15 +5471,9 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
{
uint32_t failure = 0;
- if ((status & CLUSTERED) &&
- (vg_is_clustered(vg)) && !locking_is_clustered()) {
- if (!vg->cmd->ignore_clustered_vgs)
- log_error("Skipping clustered volume group %s", vg->name);
- else
- log_verbose("Skipping clustered volume group %s", vg->name);
+ if ((status & CLUSTERED) && !_access_vg_clustered(vg->cmd, vg))
/* Return because other flags are considered undefined. */
return FAILED_CLUSTERED;
- }
if ((status & EXPORTED_VG) &&
vg_is_exported(vg)) {
@@ -5555,19 +5562,6 @@ static int _allow_extra_system_id(struct cmd_context *cmd, const char *system_id
return 0;
}
-static int _access_vg_clustered(struct cmd_context *cmd, struct volume_group *vg)
-{
- if (vg_is_clustered(vg) && !locking_is_clustered()) {
- if (!cmd->ignore_clustered_vgs)
- log_error("Skipping clustered volume group %s", vg->name);
- else
- log_verbose("Skipping clustered volume group %s", vg->name);
- return 0;
- }
-
- return 1;
-}
-
static int _access_vg_lock_type(struct cmd_context *cmd, struct volume_group *vg,
uint32_t lockd_state, uint32_t *failure)
{
7 years, 3 months
master - cache: add missing udev wait
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=95d5877f7af781...
Commit: 95d5877f7af781c53c7865868745dc683d2b0413
Parent: 4fd41cf67f0b9ea44a103b059dbbb2d74d8289eb
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jan 3 14:47:46 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
cache: add missing udev wait
When we need to clear dirty cache content of cached LV, there
is table reload which usually is shortly followed by next metadata
change. However udev can't (as of now) process udev event
while device is 'suspended'.
So whenever sequence of 'suspend/resume/suspend' is needed,
we need to wait first for finishing of 'resume' processing before
starting next 'suspend'. Otherwise there is 'race' danger of triggering
unwantend umount by systemd as such event will trigger
SYSTEMD_READY=0 state for a moment for such changed device.
Such race is pretty ugly to trace so we may need to review more
sequencies for missing 'sync'.
(Other option is to enhnace 'udev' rules processing to avoid
such dramatic actions to be happening for suspended devices).
---
WHATS_NEW | 1 +
lib/metadata/cache_manip.c | 14 +++++++++++++-
2 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 9e16b27..5fb5904 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Add missing udev sync when flushing dirty cache content.
vgchange -p accepts only uint32 numbers.
Report thin LV date for merged LV when the merge is in progress.
Detect if snapshot merge really started before polling for progress.
diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index 404b1af..cddaf82 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -424,9 +424,15 @@ int lv_cache_wait_for_clean(struct logical_volume *cache_lv, int *is_clean)
/* Switch to cleaner policy to flush the cache */
cache_seg->cleaner_policy = 1;
- /* Reaload kernel with "cleaner" policy */
+ /* Reload cache volume with "cleaner" policy */
if (!lv_update_and_reload_origin(cache_lv))
return_0;
+
+ if (!sync_local_dev_names(cache_lv->vg->cmd)) {
+ log_error("Failed to sync local devices when clearing cache volume %s.",
+ display_lvname(cache_lv));
+ return 0;
+ }
}
/*
@@ -436,6 +442,12 @@ int lv_cache_wait_for_clean(struct logical_volume *cache_lv, int *is_clean)
if (1) {
if (!lv_refresh_suspend_resume(lock_lv))
return_0;
+
+ if (!sync_local_dev_names(cache_lv->vg->cmd)) {
+ log_error("Failed to sync local devices after final clearing of cache %s.",
+ display_lvname(cache_lv));
+ return 0;
+ }
}
cache_seg->cleaner_policy = 0;
7 years, 3 months
master - vgchange: max_pv limited to uint32
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=4fd41cf67f0b9e...
Commit: 4fd41cf67f0b9ea44a103b059dbbb2d74d8289eb
Parent: 9f65a3f0c54fc349da279f9a9e8f1b214945489e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jan 3 13:04:51 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
vgchange: max_pv limited to uint32
Solves: https://bugzilla.redhat.com/1280496
The only reasonable behaviour here is to error on
any number out of accepted range (i.e. now numbers
wrapping around with some hidden logic).
As this is plain bug there is no support for
backward compatibility since noone should
set numbers >UINT32_MAX and expect 0 or error
depending on how big number was used....
TODO: more fields might need to be converted.
---
WHATS_NEW | 1 +
test/shell/vgchange-usage.sh | 7 +++++++
tools/args.h | 2 +-
3 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index e5bbfe0..9e16b27 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ vgchange -p accepts only uint32 numbers.
Report thin LV date for merged LV when the merge is in progress.
Detect if snapshot merge really started before polling for progress.
Checking LV for merging origin requires also it has merged snapshot.
diff --git a/test/shell/vgchange-usage.sh b/test/shell/vgchange-usage.sh
index 9163741..08d8114 100644
--- a/test/shell/vgchange-usage.sh
+++ b/test/shell/vgchange-usage.sh
@@ -53,6 +53,13 @@ not vgchange -p 2 $vg 2>err
grep "MaxPhysicalVolumes is less than the current number $pv_count of PVs for" err
check vg_field $vg max_pv 128
+# try some numbers around MAX limit (uint32)
+vgchange -p 4294967295 $vg
+invalid vgchange -p 4294967296 $vg
+invalid vgchange -p 18446744073709551615 $vg
+invalid vgchange -p 18446744073709551616 $vg
+check vg_field $vg max_pv 4294967295
+
# vgchange -l MaxLogicalVolumes
check vg_field $vg max_lv 0
invalid vgchange -l -128 $vg
diff --git a/tools/args.h b/tools/args.h
index a04d81d..d5f1186 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -198,7 +198,7 @@ arg(novolumegroup_ARG, 'n', "novolumegroup", NULL, 0, 0)
arg(oldpath_ARG, 'n', "oldpath", NULL, 0, 0)
arg(options_ARG, 'o', "options", string_arg, ARG_GROUPABLE, 0)
arg(sort_ARG, 'O', "sort", string_arg, ARG_GROUPABLE, 0)
-arg(maxphysicalvolumes_ARG, 'p', "maxphysicalvolumes", int_arg, 0, 0)
+arg(maxphysicalvolumes_ARG, 'p', "maxphysicalvolumes", uint32_arg, 0, 0)
arg(permission_ARG, 'p', "permission", permission_arg, 0, 0)
arg(partial_ARG, 'P', "partial", NULL, 0, 0)
arg(physicalvolume_ARG, 'P', "physicalvolume", NULL, 0, 0)
7 years, 3 months
master - lvmcmdline: support uint32
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=9f65a3f0c54fc3...
Commit: 9f65a3f0c54fc349da279f9a9e8f1b214945489e
Parent: e75f0b7c771ac6b3a2925af92a9f3098fa8381a7
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jan 3 13:02:52 2017 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jan 3 14:55:16 2017 +0100
lvmcmdline: support uint32
Add simple function to wrap usage for only uint32 numbers.
Unlike 'int_arg' which accepts full range of 64bit number
this function will error on numbers out of this range:
<0, UINT32_MAX>
---
tools/lvmcmdline.c | 8 ++++++++
tools/tools.h | 1 +
2 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 9a4deb7..ae26957 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -554,6 +554,14 @@ int int_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *
return 1;
}
+int uint32_arg(struct cmd_context *cmd, struct arg_values *av)
+{
+ if (!int_arg(cmd, av) || (av->ui64_value > UINT32_MAX))
+ return 0;
+
+ return 1;
+}
+
int int_arg_with_sign(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av)
{
char *ptr;
diff --git a/tools/tools.h b/tools/tools.h
index f6d224f..1419af9 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -144,6 +144,7 @@ int size_kb_arg(struct cmd_context *cmd, struct arg_values *av);
int size_mb_arg(struct cmd_context *cmd, struct arg_values *av);
int size_mb_arg_with_percent(struct cmd_context *cmd, struct arg_values *av);
int int_arg(struct cmd_context *cmd, struct arg_values *av);
+int uint32_arg(struct cmd_context *cmd, struct arg_values *av);
int int_arg_with_sign(struct cmd_context *cmd, struct arg_values *av);
int int_arg_with_sign_and_percent(struct cmd_context *cmd, struct arg_values *av);
int major_arg(struct cmd_context *cmd, struct arg_values *av);
7 years, 3 months