master - man: mention GPT id for LVM in pvcreate man page
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7f6a1e6bbac41b...
Commit: 7f6a1e6bbac41bb5d0e18876c23a7442c8c0d263
Parent: 2a4ef78c4a7212b5f1416a0532fa83bbbe74561a
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 15:28:44 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 15:28:44 2016 +0100
man: mention GPT id for LVM in pvcreate man page
---
man/pvcreate.8.in | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/man/pvcreate.8.in b/man/pvcreate.8.in
index 9011585..a50aaa7 100644
--- a/man/pvcreate.8.in
+++ b/man/pvcreate.8.in
@@ -48,7 +48,8 @@ can be a disk partition, whole disk, meta device, or loopback file.
For DOS disk partitions, the partition id should be set to 0x8e using
.BR fdisk (8),
.BR cfdisk (8),
-or a equivalent. For
+or a equivalent. For GUID Partition Table (GPT), the id is
+E6D6D379-F507-44C2-A23C-238F2A3DF928. For
.B whole disk devices only
the partition table must be erased, which will effectively destroy all
data on that disk. This can be done by zeroing the first sector with:
8 years, 2 months
master - report: fix off-by-one error when reporting LV segment's metadata device extent count
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2a4ef78c4a7212...
Commit: 2a4ef78c4a7212b5f1416a0532fa83bbbe74561a
Parent: acf1e84e8c067de246fd83b05e723049c9f91407
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 14:42:51 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 14:44:06 2016 +0100
report: fix off-by-one error when reporting LV segment's metadata device extent count
Commit a3f484f812bfb89063fbc25e378f34cacd50bf7d used "-1" two times by
mistake for the extent count when reporting seg_metadata_le_ranges.
---
lib/metadata/lv.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index b5c9852..4f25a59 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -55,7 +55,7 @@ static struct dm_list *_format_pvsegs(struct dm_pool *mem, const struct lv_segme
switch (metadata_areas_only ? seg_metatype(seg, s) : seg_type(seg, s)) {
case AREA_LV:
lv = metadata_areas_only ? seg_metalv(seg, s) : seg_lv(seg, s);
- seg_len = metadata_areas_only ? seg_metalv(seg, s)->le_count - 1 : seg_lv(seg, s)->le_count;
+ seg_len = metadata_areas_only ? seg_metalv(seg, s)->le_count : seg_lv(seg, s)->le_count;
visible = lv_is_visible(lv);
name = lv->name;
extent = metadata_areas_only ? seg_le(seg, s) : 0;
8 years, 2 months
master - report: add note about seg_pe_ranges and seg_le_ranges in -o help
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=acf1e84e8c067d...
Commit: acf1e84e8c067de246fd83b05e723049c9f91407
Parent: 1341f835547ce89240754054614ec5acea60a58a
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 13:53:30 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 14:30:21 2016 +0100
report: add note about seg_pe_ranges and seg_le_ranges in -o help
---
lib/report/columns.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/report/columns.h b/lib/report/columns.h
index bbea697..adc2d62 100644
--- a/lib/report/columns.h
+++ b/lib/report/columns.h
@@ -192,7 +192,7 @@ FIELD(SEGS, seg, NUM, "Start", list, 5, segstartpe, seg_start_pe, "Offset within
FIELD(SEGS, seg, SIZ, "SSize", list, 5, segsize, seg_size, "Size of segment in current units.", 0)
FIELD(SEGS, seg, SIZ, "SSize", list, 5, segsizepe, seg_size_pe, "Size of segment in physical extents.", 0)
FIELD(SEGS, seg, STR_LIST, "Seg Tags", tags, 8, tags, seg_tags, "Tags, if any.", 0)
-FIELD(SEGS, seg, STR_LIST, "PE Ranges", list, 9, peranges, seg_pe_ranges, "Ranges of Physical Extents of underlying devices in command line format.", 0)
+FIELD(SEGS, seg, STR_LIST, "PE Ranges", list, 9, peranges, seg_pe_ranges, "Ranges of Physical Extents of underlying devices in command line format (deprecated, use seg_le_ranges for common format).", 0)
FIELD(SEGS, seg, STR_LIST, "LE Ranges", list, 9, leranges, seg_le_ranges, "Ranges of Logical Extents of underlying devices in command line format.", 0)
FIELD(SEGS, seg, STR_LIST, "Metadata LE Ranges", list, 18, metadataleranges, seg_metadata_le_ranges, "Ranges of Logical Extents of underlying metadata devices in command line format.", 0)
FIELD(SEGS, seg, STR_LIST, "Devices", list, 7, devices, devices, "Underlying devices used with starting extent numbers.", 0)
8 years, 2 months
master - report: add seg_le_ranges report field
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1341f835547ce8...
Commit: 1341f835547ce89240754054614ec5acea60a58a
Parent: fccb1bb276d37825d5147936c80e761e1334032b
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 13:51:11 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 14:30:21 2016 +0100
report: add seg_le_ranges report field
---
WHATS_NEW | 1 +
lib/metadata/lv.c | 15 +++++++++++++++
lib/metadata/lv.h | 2 ++
lib/report/columns.h | 1 +
lib/report/properties.c | 2 ++
lib/report/report.c | 13 +++++++++++++
6 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 6f3e5ea..c5db715 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.141 -
====================================
+ Add seg_le_ranges report field for common format when displaying seg devices.
Honour report/list_item_separator for seg_metadata_le_ranges report field.
Don't mark hidden devs in -o devices,metadata_devices,seg_pe_ranges (2.02.140).
Change LV sizes in seg_pe_ranges report field to match underlying devices.
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 8178530..b5c9852 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -173,6 +173,21 @@ char *lvseg_seg_pe_ranges_str(struct dm_pool *mem, const struct lv_segment *seg)
return str_list_to_str(mem, list, " ");
}
+struct dm_list *lvseg_seg_le_ranges(struct dm_pool *mem, const struct lv_segment *seg)
+{
+ return _format_pvsegs(mem, seg, 1, 0, seg->lv->vg->cmd->report_mark_hidden_devices);
+}
+
+char *lvseg_seg_le_ranges_str(struct dm_pool *mem, const struct lv_segment *seg)
+{
+ struct dm_list *list;
+
+ if (!(list = lvseg_seg_pe_ranges(mem, seg)))
+ return_NULL;
+
+ return str_list_to_str(mem, list, seg->lv->vg->cmd->report_list_item_separator);
+}
+
struct dm_list *lvseg_seg_metadata_le_ranges(struct dm_pool *mem, const struct lv_segment *seg)
{
return _format_pvsegs(mem, seg, 1, 1, seg->lv->vg->cmd->report_mark_hidden_devices);
diff --git a/lib/metadata/lv.h b/lib/metadata/lv.h
index 6b5115f..b23b3b0 100644
--- a/lib/metadata/lv.h
+++ b/lib/metadata/lv.h
@@ -92,6 +92,8 @@ struct dm_list *lvseg_metadata_devices(struct dm_pool *mem, const struct lv_segm
char *lvseg_metadata_devices_str(struct dm_pool *mem, const struct lv_segment *seg);
struct dm_list *lvseg_seg_pe_ranges(struct dm_pool *mem, const struct lv_segment *seg);
char *lvseg_seg_pe_ranges_str(struct dm_pool *mem, const struct lv_segment *seg);
+struct dm_list *lvseg_seg_le_ranges(struct dm_pool *mem, const struct lv_segment *seg);
+char *lvseg_seg_le_ranges_str(struct dm_pool *mem, const struct lv_segment *seg);
struct dm_list *lvseg_seg_metadata_le_ranges(struct dm_pool *mem, const struct lv_segment *seg);
char *lvseg_seg_metadata_le_ranges_str(struct dm_pool *mem, const struct lv_segment *seg);
diff --git a/lib/report/columns.h b/lib/report/columns.h
index 04b9aa1..bbea697 100644
--- a/lib/report/columns.h
+++ b/lib/report/columns.h
@@ -193,6 +193,7 @@ FIELD(SEGS, seg, SIZ, "SSize", list, 5, segsize, seg_size, "Size of segment in c
FIELD(SEGS, seg, SIZ, "SSize", list, 5, segsizepe, seg_size_pe, "Size of segment in physical extents.", 0)
FIELD(SEGS, seg, STR_LIST, "Seg Tags", tags, 8, tags, seg_tags, "Tags, if any.", 0)
FIELD(SEGS, seg, STR_LIST, "PE Ranges", list, 9, peranges, seg_pe_ranges, "Ranges of Physical Extents of underlying devices in command line format.", 0)
+FIELD(SEGS, seg, STR_LIST, "LE Ranges", list, 9, leranges, seg_le_ranges, "Ranges of Logical Extents of underlying devices in command line format.", 0)
FIELD(SEGS, seg, STR_LIST, "Metadata LE Ranges", list, 18, metadataleranges, seg_metadata_le_ranges, "Ranges of Logical Extents of underlying metadata devices in command line format.", 0)
FIELD(SEGS, seg, STR_LIST, "Devices", list, 7, devices, devices, "Underlying devices used with starting extent numbers.", 0)
FIELD(SEGS, seg, STR_LIST, "Metadata Devs", list, 13, metadatadevices, metadata_devices, "Underlying metadata devices used with starting extent numbers.", 0)
diff --git a/lib/report/properties.c b/lib/report/properties.c
index bd5f081..5cac7c7 100644
--- a/lib/report/properties.c
+++ b/lib/report/properties.c
@@ -466,6 +466,8 @@ GET_LVSEG_STR_PROPERTY_FN(seg_tags, lvseg_tags_dup(lvseg))
#define _seg_tags_set prop_not_implemented_set
GET_LVSEG_STR_PROPERTY_FN(seg_pe_ranges, lvseg_seg_pe_ranges_str(lvseg->lv->vg->vgmem, lvseg))
#define _seg_pe_ranges_set prop_not_implemented_set
+GET_LVSEG_STR_PROPERTY_FN(seg_le_ranges, lvseg_seg_le_ranges_str(lvseg->lv->vg->vgmem, lvseg))
+#define _seg_le_ranges_set prop_not_implemented_set
GET_LVSEG_STR_PROPERTY_FN(seg_metadata_le_ranges, lvseg_seg_metadata_le_ranges_str(lvseg->lv->vg->vgmem, lvseg))
#define _seg_metadata_le_ranges_set prop_not_implemented_set
GET_LVSEG_STR_PROPERTY_FN(devices, lvseg_devices_str(lvseg->lv->vg->vgmem, lvseg))
diff --git a/lib/report/report.c b/lib/report/report.c
index 788d806..17195c7 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -1332,6 +1332,19 @@ static int _peranges_disp(struct dm_report *rh, struct dm_pool *mem,
return _field_set_string_list(rh, field, list, private, 0, " ");
}
+static int _leranges_disp(struct dm_report *rh, struct dm_pool *mem,
+ struct dm_report_field *field,
+ const void *data, void *private)
+{
+ const struct lv_segment *seg = (const struct lv_segment *) data;
+ struct dm_list *list;
+
+ if (!(list = lvseg_seg_le_ranges(mem, seg)))
+ return_0;
+
+ return _field_set_string_list(rh, field, list, private, 0, NULL);
+}
+
static int _metadataleranges_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
const void *data, void *private)
8 years, 2 months
master - report: make devices, metadata_devices, seg_pe_ranges and seg_metadata_le_ranges fields consistent
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=fccb1bb276d378...
Commit: fccb1bb276d37825d5147936c80e761e1334032b
Parent: b160b73800e867a791f196af7b1114243cfd1a65
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 12:26:01 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 14:30:20 2016 +0100
report: make devices, metadata_devices, seg_pe_ranges and seg_metadata_le_ranges fields consistent
There are two basic groups of fields for LV segment device reporting:
- related to LV segment's devices: devices and seg_pe_ranges
- related to LV segment's metadata devices: metadata_devices and seg_metadata_le_ranges
The devices and metadata_devices report devices in this format:
"device_name(extent_start)"
The seg_pe_ranges and seg_metadata_le_ranges report devices in
this format:
"device_name:extent_start-extent_end"
This patch reverts partly what commit 7f74a995029caa41ee3cf9aec0bd024a34bfd89a
(v 2.02.140) introduced in this area - it added [] for
hidden devices to mark them for all four fields mentioned above.
We won't be marking hidden devices in devices and metadata_devices
fields.
The seg_metadata_le_ranges field will have hidden devices marked -
it's new enough that we don't need to care about compatibility much
yet.
The seg_pe_ranges is old enough that we shouldn't be changing this
one - so we're reverting to not marking hidden devices here.
Instead, there's going to be a new field "seg_le_ranges" which
is going to replace the seg_pe_ranges and it will mark hidden devices -
this is going to be introduced in a patch later.
So in the end we'll end up with:
(LV segment's devices)
devices field with "device_name(extent_start)" format, not marking hidden devices
seg_pe_ranges field with "device_name:extent_start-extent_end" format, not marking hidden devices (deprecated, new seg_le_ranges should be used instead for standardized format)
seg_le_ranges field with "device_name:extent_start-extent_end" format, marking hidden devices
(LV segment's metadata devices)
metadata_devices field with "device_name:extent_start-extent_end" format, not marking hidden devices
seg_metadata_le_ranges field with "device_name:extent_start-extent_end" format, marking hidden devices
Also, both seg_le_ranges and seg_metadata_le_ranges will honour the
report/list_item_separator setting which can be used to configure
the delimiter used for list items.
So, to sum it up, we will recommend using the new seg_le_ranges and
seg_metadata_le_ranges fields because they display devices with
standard extent range format, they can mark hidden devices and they
honour the report/list_item_separator setting.
We'll be keeping devices,seg_pe_ranges and metadata_devices fields
for compatibility.
---
WHATS_NEW | 2 ++
lib/metadata/lv.c | 8 ++++----
lib/report/report.c | 2 +-
test/shell/report-hidden.sh | 6 ------
4 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5a16d16..6f3e5ea 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
Version 2.02.141 -
====================================
+ Honour report/list_item_separator for seg_metadata_le_ranges report field.
+ Don't mark hidden devs in -o devices,metadata_devices,seg_pe_ranges (2.02.140).
Change LV sizes in seg_pe_ranges report field to match underlying devices.
Add kernel_cache_settings report field for cache LV settings used in kernel.
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 70a22b3..8178530 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -130,7 +130,7 @@ bad:
struct dm_list *lvseg_devices(struct dm_pool *mem, const struct lv_segment *seg)
{
- return _format_pvsegs(mem, seg, 0, 0, seg->lv->vg->cmd->report_mark_hidden_devices);
+ return _format_pvsegs(mem, seg, 0, 0, 0);
}
char *lvseg_devices_str(struct dm_pool *mem, const struct lv_segment *seg)
@@ -145,7 +145,7 @@ char *lvseg_devices_str(struct dm_pool *mem, const struct lv_segment *seg)
struct dm_list *lvseg_metadata_devices(struct dm_pool *mem, const struct lv_segment *seg)
{
- return _format_pvsegs(mem, seg, 0, 1, seg->lv->vg->cmd->report_mark_hidden_devices);
+ return _format_pvsegs(mem, seg, 0, 1, 0);
}
char *lvseg_metadata_devices_str(struct dm_pool *mem, const struct lv_segment *seg)
@@ -160,7 +160,7 @@ char *lvseg_metadata_devices_str(struct dm_pool *mem, const struct lv_segment *s
struct dm_list *lvseg_seg_pe_ranges(struct dm_pool *mem, const struct lv_segment *seg)
{
- return _format_pvsegs(mem, seg, 1, 0, seg->lv->vg->cmd->report_mark_hidden_devices);
+ return _format_pvsegs(mem, seg, 1, 0, 0);
}
char *lvseg_seg_pe_ranges_str(struct dm_pool *mem, const struct lv_segment *seg)
@@ -185,7 +185,7 @@ char *lvseg_seg_metadata_le_ranges_str(struct dm_pool *mem, const struct lv_segm
if (!(list = lvseg_seg_metadata_le_ranges(mem, seg)))
return_NULL;
- return str_list_to_str(mem, list, " ");
+ return str_list_to_str(mem, list, seg->lv->vg->cmd->report_list_item_separator);
}
char *lvseg_tags_dup(const struct lv_segment *seg)
diff --git a/lib/report/report.c b/lib/report/report.c
index 02d8b22..788d806 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -1342,7 +1342,7 @@ static int _metadataleranges_disp(struct dm_report *rh, struct dm_pool *mem,
if (!(list = lvseg_seg_metadata_le_ranges(mem, seg)))
return_0;
- return _field_set_string_list(rh, field, list, private, 0, " ");
+ return _field_set_string_list(rh, field, list, private, 0, NULL);
}
static int _tags_disp(struct dm_report *rh, struct dm_pool *mem,
diff --git a/test/shell/report-hidden.sh b/test/shell/report-hidden.sh
index ff33df5..7f77282 100644
--- a/test/shell/report-hidden.sh
+++ b/test/shell/report-hidden.sh
@@ -24,16 +24,10 @@ aux lvmconf "report/mark_hidden_devices = 0"
lvs --noheadings -a -o name $vg > out
grep "^${lv1}_mimage_0" out
not grep "^\[${lv1}_mimage_0\]" out
-lvs --noheadings -a -o devices $vg/$lv1 > out
-grep "^${lv1}_mimage_0" out
-not grep "^\[${lv1}_mimage_0\]" out
aux lvmconf "report/mark_hidden_devices = 1"
lvs --noheadings -a -o name $vg > out
grep "^\[${lv1}_mimage_0\]" out
not grep "^${lv1}_mimage_0" out
-lvs --noheadings -a -o devices $vg/$lv1 > out
-grep "^\[${lv1}_mimage_0\]" out
-not grep "^${lv1}_mimage_0" out
vgremove -ff $vg
8 years, 2 months
master - report: change _format_pvsegs to return list instead of plain string, change associated report fields from STR to STR_LIST
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b160b73800e867...
Commit: b160b73800e867a791f196af7b1114243cfd1a65
Parent: 2ed324648e4dad4bd504f0bea9d94efa2a99fe4c
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 12:24:02 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 14:17:41 2016 +0100
report: change _format_pvsegs to return list instead of plain string, change associated report fields from STR to STR_LIST
The associated devices,metadata_devices,seg_pe_ranges and
seg_metadata_le_ranges are reported as genuine string lists now.
This allows for using the items separately in -S|--select
(so searching for subsets etc.) and also it allows for
configuring the separator using report/list_item_separator
which may be useful in scripts (however, we'll enable this
only for seg_le_metadata_ranges and not for devices,seg_pe_ranges
and seg_metadata_devices for compatibility reasons - see following
patch).
---
lib/metadata/lv.c | 147 +++++++++++++++++++++++++++++------------------
lib/metadata/lv.h | 12 +++-
lib/report/columns.h | 8 +-
lib/report/properties.c | 10 +--
lib/report/report.c | 44 ++++++++------
5 files changed, 132 insertions(+), 89 deletions(-)
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 6d52577..70a22b3 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -28,11 +28,10 @@
static struct utsname _utsname;
static int _utsinit = 0;
-static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
- int range_format, int metadata_areas_only,
- int mark_hidden)
+static struct dm_list *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
+ int range_format, int metadata_areas_only,
+ int mark_hidden)
{
- static const char pool_grow_object_failed_msg[] = "dm_pool_grow_object failed";
unsigned int s;
const char *name = NULL;
uint32_t extent = 0;
@@ -40,10 +39,13 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
char extent_str[32];
struct logical_volume *lv;
int visible = 1;
+ char *list_item;
+ size_t list_item_len;
+ struct dm_list *result = NULL;
- if (!dm_pool_begin_object(mem, 256)) {
- log_error("dm_pool_begin_object failed");
- return NULL;
+ if (!(result = str_list_create(mem))) {
+ log_error("_format_pvsegs: str_list_create failed");
+ goto bad;
}
if (metadata_areas_only && (!seg_is_raid(seg) || lv_is_raid_metadata(seg->lv) || lv_is_raid_image(seg->lv)))
@@ -73,84 +75,119 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
break;
default:
log_error(INTERNAL_ERROR "Unknown area segtype.");
- return NULL;
- }
-
- if (!visible && mark_hidden && !dm_pool_grow_object(mem, "[", 1)) {
- log_error(pool_grow_object_failed_msg);
- return NULL;
- }
-
- if (!dm_pool_grow_object(mem, name, strlen(name))) {
- log_error(pool_grow_object_failed_msg);
- return NULL;
- }
-
- if (!visible && mark_hidden && !dm_pool_grow_object(mem, "]", 1)) {
- log_error(pool_grow_object_failed_msg);
- return NULL;
+ goto bad;
}
- if (dm_snprintf(extent_str, sizeof(extent_str),
- "%s%" PRIu32 "%s",
- range_format ? ":" : "(", extent,
- range_format ? "-" : ")") < 0) {
- log_error("Extent number dm_snprintf failed");
- return NULL;
- }
- if (!dm_pool_grow_object(mem, extent_str, strlen(extent_str))) {
- log_error(pool_grow_object_failed_msg);
- return NULL;
- }
+ list_item_len = strlen(name);
+ if (!visible && mark_hidden)
+ /* +2 for [ ] */
+ list_item_len += 2;
if (range_format) {
if (dm_snprintf(extent_str, sizeof(extent_str),
- FMTu32, extent + seg_len - 1) < 0) {
- log_error("Extent number dm_snprintf failed");
- return NULL;
+ ":%" PRIu32 "-%" PRIu32,
+ extent, extent + seg_len - 1) < 0) {
+ log_error("_format_pvseggs: extent range dm_snprintf failed");
+ goto bad;
}
- if (!dm_pool_grow_object(mem, extent_str, strlen(extent_str))) {
- log_error(pool_grow_object_failed_msg);
- return NULL;
+ } else {
+ if (dm_snprintf(extent_str, sizeof(extent_str),
+ "(%" PRIu32 ")", extent) < 0) {
+ log_error("_format_pvsegs: extent number dm_snprintf failed");
+ goto bad;
}
}
+ list_item_len += strlen(extent_str);
+ /* trialing 0 */
+ list_item_len += 1;
- if ((s != seg->area_count - 1) &&
- !dm_pool_grow_object(mem, range_format ? " " : ",", 1)) {
- log_error(pool_grow_object_failed_msg);
- return NULL;
+ if (!(list_item = dm_pool_zalloc(mem, list_item_len))) {
+ log_error("_format_pvsegs: list item dm_pool_zalloc failed");
+ goto bad;
}
- }
-out:
- if (!dm_pool_grow_object(mem, "\0", 1)) {
- log_error("dm_pool_grow_object failed");
- return NULL;
- }
+ if (dm_snprintf(list_item, list_item_len,
+ "%s%s%s%s",
+ (!visible && mark_hidden) ? "[" : "",
+ name,
+ (!visible && mark_hidden) ? "]" : "",
+ extent_str) < 0) {
+ log_error("_format_pvsegs: list item dmsnprintf failed");
+ goto bad;
+ }
- return dm_pool_end_object(mem);
+ if (!str_list_add_no_dup_check(mem, result, list_item)) {
+ log_error("_format_pvsegs: failed to add item to list");
+ goto bad;
+ }
+ }
+out:
+ return result;
+bad:
+ dm_pool_free(mem, result);
+ return NULL;
}
-char *lvseg_devices(struct dm_pool *mem, const struct lv_segment *seg)
+struct dm_list *lvseg_devices(struct dm_pool *mem, const struct lv_segment *seg)
{
return _format_pvsegs(mem, seg, 0, 0, seg->lv->vg->cmd->report_mark_hidden_devices);
}
-char *lvseg_metadata_devices(struct dm_pool *mem, const struct lv_segment *seg)
+char *lvseg_devices_str(struct dm_pool *mem, const struct lv_segment *seg)
+{
+ struct dm_list *list;
+
+ if (!(list = lvseg_devices(mem, seg)))
+ return_NULL;
+
+ return str_list_to_str(mem, list, ",");
+}
+
+struct dm_list *lvseg_metadata_devices(struct dm_pool *mem, const struct lv_segment *seg)
{
return _format_pvsegs(mem, seg, 0, 1, seg->lv->vg->cmd->report_mark_hidden_devices);
}
-char *lvseg_seg_pe_ranges(struct dm_pool *mem, const struct lv_segment *seg)
+char *lvseg_metadata_devices_str(struct dm_pool *mem, const struct lv_segment *seg)
+{
+ struct dm_list *list;
+
+ if (!(list = lvseg_devices(mem, seg)))
+ return_NULL;
+
+ return str_list_to_str(mem, list, ",");
+}
+
+struct dm_list *lvseg_seg_pe_ranges(struct dm_pool *mem, const struct lv_segment *seg)
{
return _format_pvsegs(mem, seg, 1, 0, seg->lv->vg->cmd->report_mark_hidden_devices);
}
-char *lvseg_seg_metadata_le_ranges(struct dm_pool *mem, const struct lv_segment *seg)
+char *lvseg_seg_pe_ranges_str(struct dm_pool *mem, const struct lv_segment *seg)
+{
+ struct dm_list *list;
+
+ if (!(list = lvseg_seg_pe_ranges(mem, seg)))
+ return_NULL;
+
+ return str_list_to_str(mem, list, " ");
+}
+
+struct dm_list *lvseg_seg_metadata_le_ranges(struct dm_pool *mem, const struct lv_segment *seg)
{
return _format_pvsegs(mem, seg, 1, 1, seg->lv->vg->cmd->report_mark_hidden_devices);
}
+char *lvseg_seg_metadata_le_ranges_str(struct dm_pool *mem, const struct lv_segment *seg)
+{
+ struct dm_list *list;
+
+ if (!(list = lvseg_seg_metadata_le_ranges(mem, seg)))
+ return_NULL;
+
+ return str_list_to_str(mem, list, " ");
+}
+
char *lvseg_tags_dup(const struct lv_segment *seg)
{
return tags_format_and_copy(seg->lv->vg->vgmem, &seg->tags);
diff --git a/lib/metadata/lv.h b/lib/metadata/lv.h
index 18c662b..6b5115f 100644
--- a/lib/metadata/lv.h
+++ b/lib/metadata/lv.h
@@ -86,10 +86,14 @@ int lv_raid_image_in_sync(const struct logical_volume *lv);
int lv_raid_healthy(const struct logical_volume *lv);
const char *lvseg_name(const struct lv_segment *seg);
uint64_t lvseg_start(const struct lv_segment *seg);
-char *lvseg_devices(struct dm_pool *mem, const struct lv_segment *seg);
-char *lvseg_metadata_devices(struct dm_pool *mem, const struct lv_segment *seg);
-char *lvseg_seg_pe_ranges(struct dm_pool *mem, const struct lv_segment *seg);
-char *lvseg_seg_metadata_le_ranges(struct dm_pool *mem, const struct lv_segment *seg);
+struct dm_list *lvseg_devices(struct dm_pool *mem, const struct lv_segment *seg);
+char *lvseg_devices_str(struct dm_pool *mem, const struct lv_segment *seg);
+struct dm_list *lvseg_metadata_devices(struct dm_pool *mem, const struct lv_segment *seg);
+char *lvseg_metadata_devices_str(struct dm_pool *mem, const struct lv_segment *seg);
+struct dm_list *lvseg_seg_pe_ranges(struct dm_pool *mem, const struct lv_segment *seg);
+char *lvseg_seg_pe_ranges_str(struct dm_pool *mem, const struct lv_segment *seg);
+struct dm_list *lvseg_seg_metadata_le_ranges(struct dm_pool *mem, const struct lv_segment *seg);
+char *lvseg_seg_metadata_le_ranges_str(struct dm_pool *mem, const struct lv_segment *seg);
/* LV kernel properties */
int lv_kernel_major(const struct logical_volume *lv);
diff --git a/lib/report/columns.h b/lib/report/columns.h
index 9bd9fd4..04b9aa1 100644
--- a/lib/report/columns.h
+++ b/lib/report/columns.h
@@ -192,10 +192,10 @@ FIELD(SEGS, seg, NUM, "Start", list, 5, segstartpe, seg_start_pe, "Offset within
FIELD(SEGS, seg, SIZ, "SSize", list, 5, segsize, seg_size, "Size of segment in current units.", 0)
FIELD(SEGS, seg, SIZ, "SSize", list, 5, segsizepe, seg_size_pe, "Size of segment in physical extents.", 0)
FIELD(SEGS, seg, STR_LIST, "Seg Tags", tags, 8, tags, seg_tags, "Tags, if any.", 0)
-FIELD(SEGS, seg, STR, "PE Ranges", list, 9, peranges, seg_pe_ranges, "Ranges of Physical Extents of underlying devices in command line format.", 0)
-FIELD(SEGS, seg, STR, "Metadata LE Ranges", list, 18, metadataleranges, seg_metadata_le_ranges, "Ranges of Logical Extents of underlying metadata devices in command line format.", 0)
-FIELD(SEGS, seg, STR, "Devices", list, 7, devices, devices, "Underlying devices used with starting extent numbers.", 0)
-FIELD(SEGS, seg, STR, "Metadata Devs", list, 13, metadatadevices, metadata_devices, "Underlying metadata devices used with starting extent numbers.", 0)
+FIELD(SEGS, seg, STR_LIST, "PE Ranges", list, 9, peranges, seg_pe_ranges, "Ranges of Physical Extents of underlying devices in command line format.", 0)
+FIELD(SEGS, seg, STR_LIST, "Metadata LE Ranges", list, 18, metadataleranges, seg_metadata_le_ranges, "Ranges of Logical Extents of underlying metadata devices in command line format.", 0)
+FIELD(SEGS, seg, STR_LIST, "Devices", list, 7, devices, devices, "Underlying devices used with starting extent numbers.", 0)
+FIELD(SEGS, seg, STR_LIST, "Metadata Devs", list, 13, metadatadevices, metadata_devices, "Underlying metadata devices used with starting extent numbers.", 0)
FIELD(SEGS, seg, STR, "Monitor", list, 7, segmonitor, seg_monitor, "Dmeventd monitoring status of the segment.", 0)
FIELD(SEGS, seg, STR, "Cache Policy", list, 12, cache_policy, cache_policy, "The cache policy (cached segments only).", 0)
FIELD(SEGS, seg, STR_LIST, "Cache Settings", list, 14, cache_settings, cache_settings, "Cache settings/parameters (cached segments only).", 0)
diff --git a/lib/report/properties.c b/lib/report/properties.c
index 6218835..bd5f081 100644
--- a/lib/report/properties.c
+++ b/lib/report/properties.c
@@ -464,15 +464,13 @@ GET_LVSEG_NUM_PROPERTY_FN(seg_size_pe, lvseg->len)
#define _seg_size_pe_set prop_not_implemented_set
GET_LVSEG_STR_PROPERTY_FN(seg_tags, lvseg_tags_dup(lvseg))
#define _seg_tags_set prop_not_implemented_set
-GET_LVSEG_STR_PROPERTY_FN(seg_pe_ranges,
- lvseg_seg_pe_ranges(lvseg->lv->vg->vgmem, lvseg))
+GET_LVSEG_STR_PROPERTY_FN(seg_pe_ranges, lvseg_seg_pe_ranges_str(lvseg->lv->vg->vgmem, lvseg))
#define _seg_pe_ranges_set prop_not_implemented_set
-GET_LVSEG_STR_PROPERTY_FN(seg_metadata_le_ranges,
- lvseg_seg_metadata_le_ranges(lvseg->lv->vg->vgmem, lvseg))
+GET_LVSEG_STR_PROPERTY_FN(seg_metadata_le_ranges, lvseg_seg_metadata_le_ranges_str(lvseg->lv->vg->vgmem, lvseg))
#define _seg_metadata_le_ranges_set prop_not_implemented_set
-GET_LVSEG_STR_PROPERTY_FN(devices, lvseg_devices(lvseg->lv->vg->vgmem, lvseg))
+GET_LVSEG_STR_PROPERTY_FN(devices, lvseg_devices_str(lvseg->lv->vg->vgmem, lvseg))
#define _devices_set prop_not_implemented_set
-GET_LVSEG_STR_PROPERTY_FN(metadata_devices, lvseg_metadata_devices(lvseg->lv->vg->vgmem, lvseg))
+GET_LVSEG_STR_PROPERTY_FN(metadata_devices, lvseg_metadata_devices_str(lvseg->lv->vg->vgmem, lvseg))
#define _metadata_devices_set prop_not_implemented_set
GET_LVSEG_STR_PROPERTY_FN(seg_monitor, lvseg_monitor_dup(lvseg->lv->vg->vgmem, lvseg))
#define _seg_monitor_set prop_not_implemented_set
diff --git a/lib/report/report.c b/lib/report/report.c
index 4b00a76..02d8b22 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -1293,52 +1293,56 @@ static int _dev_name_disp(struct dm_report *rh, struct dm_pool *mem,
return _string_disp(rh, mem, field, &name, private);
}
-static int _devices_disp(struct dm_report *rh __attribute__((unused)), struct dm_pool *mem,
+static int _devices_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
- const void *data, void *private __attribute__((unused)))
+ const void *data, void *private)
{
- char *str;
+ const struct lv_segment *seg = (const struct lv_segment *) data;
+ struct dm_list *list;
- if (!(str = lvseg_devices(mem, (const struct lv_segment *) data)))
+ if (!(list = lvseg_devices(mem, seg)))
return_0;
- return _field_set_value(field, str, NULL);
+ return _field_set_string_list(rh, field, list, private, 0, ",");
}
-static int _metadatadevices_disp(struct dm_report *rh __attribute__((unused)), struct dm_pool *mem,
+static int _metadatadevices_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
- const void *data, void *private __attribute__((unused)))
+ const void *data, void *private)
{
- char *str;
+ const struct lv_segment *seg = (const struct lv_segment *) data;
+ struct dm_list *list;
- if (!(str = lvseg_metadata_devices(mem, (const struct lv_segment *) data)))
+ if (!(list = lvseg_metadata_devices(mem, seg)))
return_0;
- return _field_set_value(field, str, NULL);
+ return _field_set_string_list(rh, field, list, private, 0, ",");
}
-static int _peranges_disp(struct dm_report *rh __attribute__((unused)), struct dm_pool *mem,
+static int _peranges_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
- const void *data, void *private __attribute__((unused)))
+ const void *data, void *private)
{
- char *str;
+ const struct lv_segment *seg = (const struct lv_segment *) data;
+ struct dm_list *list;
- if (!(str = lvseg_seg_pe_ranges(mem, (const struct lv_segment *) data)))
+ if (!(list = lvseg_seg_pe_ranges(mem, seg)))
return_0;
- return _field_set_value(field, str, NULL);
+ return _field_set_string_list(rh, field, list, private, 0, " ");
}
-static int _metadataleranges_disp(struct dm_report *rh __attribute__((unused)), struct dm_pool *mem,
+static int _metadataleranges_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
- const void *data, void *private __attribute__((unused)))
+ const void *data, void *private)
{
- char *str;
+ const struct lv_segment *seg = (const struct lv_segment *) data;
+ struct dm_list *list;
- if (!(str = lvseg_seg_metadata_le_ranges(mem, (const struct lv_segment *) data)))
+ if (!(list = lvseg_seg_metadata_le_ranges(mem, seg)))
return_0;
- return _field_set_value(field, str, NULL);
+ return _field_set_string_list(rh, field, list, private, 0, " ");
}
static int _tags_disp(struct dm_report *rh, struct dm_pool *mem,
8 years, 2 months
master - refactor: add 'delimiter' variable for non-default delimiter when reporting string list
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2ed324648e4dad...
Commit: 2ed324648e4dad4bd504f0bea9d94efa2a99fe4c
Parent: 48f270970fc526f9f0ac7d074639e8ed90346586
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jan 19 11:50:41 2016 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jan 19 11:50:52 2016 +0100
refactor: add 'delimiter' variable for non-default delimiter when reporting string list
---
lib/report/report.c | 29 +++++++++++++++--------------
1 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/lib/report/report.c b/lib/report/report.c
index c03469a..4b00a76 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -1217,11 +1217,12 @@ static int _field_set_value(struct dm_report_field *field, const void *data, con
}
static int _field_set_string_list(struct dm_report *rh, struct dm_report_field *field,
- const struct dm_list *list, void *private, int sorted)
+ const struct dm_list *list, void *private, int sorted,
+ const char *delimiter)
{
struct cmd_context *cmd = (struct cmd_context *) private;
- return sorted ? dm_report_field_string_list(rh, field, list, cmd->report_list_item_separator)
- : dm_report_field_string_list_unsorted(rh, field, list, cmd->report_list_item_separator);
+ return sorted ? dm_report_field_string_list(rh, field, list, delimiter ? : cmd->report_list_item_separator)
+ : dm_report_field_string_list_unsorted(rh, field, list, delimiter ? : cmd->report_list_item_separator);
}
/*
@@ -1346,7 +1347,7 @@ static int _tags_disp(struct dm_report *rh, struct dm_pool *mem,
{
const struct dm_list *tagsl = (const struct dm_list *) data;
- return _field_set_string_list(rh, field, tagsl, private, 1);
+ return _field_set_string_list(rh, field, tagsl, private, 1, NULL);
}
struct _str_list_append_baton {
@@ -1382,7 +1383,7 @@ static int _cache_settings_disp(struct dm_report *rh, struct dm_pool *mem,
seg = first_seg(seg->pool_lv);
else if (!seg_is_cache_pool(seg)) {
dm_list_init(&dummy_list);
- return _field_set_string_list(rh, field, &dummy_list, private, 0);
+ return _field_set_string_list(rh, field, &dummy_list, private, 0, NULL);
/* TODO: once we have support for STR_LIST reserved values, replace with:
* return _field_set_value(field, GET_FIRST_RESERVED_NAME(cache_settings_undef), GET_FIELD_RESERVED_VALUE(cache_settings_undef));
*/
@@ -1392,7 +1393,7 @@ static int _cache_settings_disp(struct dm_report *rh, struct dm_pool *mem,
settings = seg->policy_settings->child;
else {
dm_list_init(&dummy_list);
- return _field_set_string_list(rh, field, &dummy_list, private, 0);
+ return _field_set_string_list(rh, field, &dummy_list, private, 0, NULL);
/* TODO: once we have support for STR_LIST reserved values, replace with:
* return _field_set_value(field, GET_FIRST_RESERVED_NAME(cache_settings_undef), GET_FIELD_RESERVED_VALUE(cache_settings_undef));
*/
@@ -1409,7 +1410,7 @@ static int _cache_settings_disp(struct dm_report *rh, struct dm_pool *mem,
settings = settings->sib;
};
- return _field_set_string_list(rh, field, result, private, 0);
+ return _field_set_string_list(rh, field, result, private, 0, NULL);
}
static int _do_get_kernel_cache_settings_list(struct dm_pool *mem,
@@ -1465,7 +1466,7 @@ static int _kernel_cache_settings_disp(struct dm_report *rh, struct dm_pool *mem
if (lvdm->seg_status.type != SEG_STATUS_CACHE) {
dm_list_init(&dummy_list);
- return _field_set_string_list(rh, field, &dummy_list, private, 0);
+ return _field_set_string_list(rh, field, &dummy_list, private, 0, NULL);
}
if (!(mem = dm_pool_create("reporter_pool", 1024)))
@@ -1474,7 +1475,7 @@ static int _kernel_cache_settings_disp(struct dm_report *rh, struct dm_pool *mem
if (!_get_kernel_cache_settings_list(mem, lvdm->seg_status.cache, &result))
goto_out;
- r = _field_set_string_list(rh, field, result, private, 0);
+ r = _field_set_string_list(rh, field, result, private, 0, NULL);
out:
dm_pool_destroy(mem);
return r;
@@ -1515,7 +1516,7 @@ static int _modules_disp(struct dm_report *rh, struct dm_pool *mem,
if (!(list_lv_modules(mem, lv, modules)))
return_0;
- return _field_set_string_list(rh, field, modules, private, 1);
+ return _field_set_string_list(rh, field, modules, private, 1, NULL);
}
static int _lvprofile_disp(struct dm_report *rh, struct dm_pool *mem,
@@ -1925,7 +1926,7 @@ static int _lvancestors_disp(struct dm_report *rh, struct dm_pool *mem,
return_0;
}
- return _field_set_string_list(rh, field, ancestors.result, private, 0);
+ return _field_set_string_list(rh, field, ancestors.result, private, 0, NULL);
}
static int _find_descendants(struct _str_list_append_baton *descendants,
@@ -1980,7 +1981,7 @@ static int _lvdescendants_disp(struct dm_report *rh, struct dm_pool *mem,
return_0;
}
- return _field_set_string_list(rh, field, descendants.result, private, 0);
+ return _field_set_string_list(rh, field, descendants.result, private, 0, NULL);
}
static int _do_movepv_disp(struct dm_report *rh, struct dm_pool *mem,
@@ -2910,7 +2911,7 @@ static int _lvlayout_disp(struct dm_report *rh, struct dm_pool *mem,
return 0;
}
- return _field_set_string_list(rh, field, lv_layout, private, 0);
+ return _field_set_string_list(rh, field, lv_layout, private, 0, NULL);
}
static int _lvrole_disp(struct dm_report *rh, struct dm_pool *mem,
@@ -2926,7 +2927,7 @@ static int _lvrole_disp(struct dm_report *rh, struct dm_pool *mem,
return 0;
}
- return _field_set_string_list(rh, field, lv_role, private, 0);
+ return _field_set_string_list(rh, field, lv_role, private, 0, NULL);
}
static int _lvinitialimagesync_disp(struct dm_report *rh, struct dm_pool *mem,
8 years, 2 months
master - lvconvert: disallow test mode in shared VG
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=48f270970fc526...
Commit: 48f270970fc526f9f0ac7d074639e8ed90346586
Parent: 6b3e402298080a4b3e352ecee3a33cd916d18b6b
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Mon Jan 18 16:53:14 2016 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Jan 18 16:53:14 2016 -0600
lvconvert: disallow test mode in shared VG
until test mode can be checked in all the necessary
locations related to lvmlockd to prevent making
actual changes.
---
tools/lvconvert.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index d480f6a..13fe6e8 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -3434,6 +3434,13 @@ static int lvconvert_single(struct cmd_context *cmd, struct lvconvert_params *lp
goto_out;
}
+ if (test_mode() && is_lockd_type(vg->lock_type)) {
+ log_error("Test mode is not yet supported with lock type %s",
+ vg->lock_type);
+ unlock_and_release_vg(cmd, vg, lp->vg_name);
+ goto_out;
+ }
+
if (!(lv = find_lv(vg, lp->lv_name))) {
log_error("Can't find LV %s in VG %s", lp->lv_name, lp->vg_name);
unlock_and_release_vg(cmd, vg, lp->vg_name);
8 years, 2 months
master - toollib: add comment about missing device
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6b3e402298080a...
Commit: 6b3e402298080a4b3e352ecee3a33cd916d18b6b
Parent: a3f484f812bfb89063fbc25e378f34cacd50bf7d
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Mon Jan 18 15:40:42 2016 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Jan 18 16:09:22 2016 -0600
toollib: add comment about missing device
Add a comment in _process_pvs_in_vg() to document the
place where there have been problems with processing
PVs twice.
For a while we had a hacky workaround here where we'd
skip processing a PV if its device wasn't found in
all_devices (and !is_missing_pv since we want to
process PVs with missing devices.). That workaround
was removed in commit 5cd4d46f because it was no
longer needed.
The workaround had originally been needed to prevent
a device from being processed twice when the PV had
no MDAs -- it would be processed once in its real VG
and then the workaround would prevent it from being
processed a second time in the orphan VG.
Wrongly appearing as an orphan likely happened because
lvmcache would consider the no-MDA PV an orphan unless
the real VG holding that PV was also in lvmcache.
This issue is also mentioned in pvchange where holding
the global lock allows VGs to remain in lvmcache so
PVs with 0 mdas are not considered orphans.
The workaround in _process_pvs_in_vg() was originally
intended for reporting commands, not for pvchange.
But, it was accidentally helping pvchange also because
the method described by the pvchange global lock
comment had been subverted by commit 80f4b4b8.
Commit 80f4b4b8 was found to be unnecessary, and was
reverted in commit e710bac0. This restored the
intended global lock lvmcache effect to pvchange, and
it no longer relied on the workaround in toollib.
---
tools/toollib.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/tools/toollib.c b/tools/toollib.c
index 97cc1bf..dec9106 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -3088,6 +3088,16 @@ static int _process_pvs_in_vg(struct cmd_context *cmd,
_device_list_remove(all_devices, pv->dev);
+ /*
+ * pv->dev should be found in all_devices unless it's a
+ * case of a "missing device". Previously there have
+ * been cases where we needed to skip processing the PV
+ * if pv->dev was not found in all_devices to avoid
+ * processing a PV twice, i.e. when the PV had no MDAs
+ * it would be seen once in its real VG and again
+ * wrongly in the orphan VG. This no longer happens.
+ */
+
if (!skip) {
ret = process_single_pv(cmd, vg, pv, handle);
if (ret != ECMD_PROCESSED)
8 years, 2 months
master - report: Fix seg_pe_ranges LV sizes.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a3f484f812bfb8...
Commit: a3f484f812bfb89063fbc25e378f34cacd50bf7d
Parent: 6d7dc87cb356162f912b13c8a0cd198037c0226b
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Mon Jan 18 22:04:43 2016 +0000
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Mon Jan 18 22:04:43 2016 +0000
report: Fix seg_pe_ranges LV sizes.
When reporting on LVs, take the end of the range from the size of the
underlying (hidden) LV rather than the logical size of the current
segment (that PVs use).
---
WHATS_NEW | 1 +
lib/metadata/lv.c | 6 +++++-
2 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 0499469..5a16d16 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.141 -
====================================
+ Change LV sizes in seg_pe_ranges report field to match underlying devices.
Add kernel_cache_settings report field for cache LV settings used in kernel.
Version 2.02.140 - 16th January 2016
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 49c195f..6d52577 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -36,6 +36,7 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
unsigned int s;
const char *name = NULL;
uint32_t extent = 0;
+ uint32_t seg_len = 0;
char extent_str[32];
struct logical_volume *lv;
int visible = 1;
@@ -52,6 +53,7 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
switch (metadata_areas_only ? seg_metatype(seg, s) : seg_type(seg, s)) {
case AREA_LV:
lv = metadata_areas_only ? seg_metalv(seg, s) : seg_lv(seg, s);
+ seg_len = metadata_areas_only ? seg_metalv(seg, s)->le_count - 1 : seg_lv(seg, s)->le_count;
visible = lv_is_visible(lv);
name = lv->name;
extent = metadata_areas_only ? seg_le(seg, s) : 0;
@@ -62,10 +64,12 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
continue;
name = dev_name(seg_dev(seg, s));
extent = seg_pe(seg, s);
+ seg_len = seg->area_len;
break;
case AREA_UNASSIGNED:
name = "unassigned";
extent = 0;
+ seg_len = 0;
break;
default:
log_error(INTERNAL_ERROR "Unknown area segtype.");
@@ -101,7 +105,7 @@ static char *_format_pvsegs(struct dm_pool *mem, const struct lv_segment *seg,
if (range_format) {
if (dm_snprintf(extent_str, sizeof(extent_str),
- FMTu32, metadata_areas_only ? extent + seg_metalv(seg, s)->le_count - 1 : extent + seg->area_len - 1) < 0) {
+ FMTu32, extent + seg_len - 1) < 0) {
log_error("Extent number dm_snprintf failed");
return NULL;
}
8 years, 2 months