Gitweb:
http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e09842e1745662...
Commit: e09842e17456628a378db8e22660d487095dbf00
Parent: 530efe587f0a0cbb9def7bda7f4b312b07ffde92
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Mon Mar 16 17:58:33 2015 +0100
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Fri Aug 21 11:15:53 2015 +0200
lvmcache/lvmetad: cache PV extension version
Store PV extension version in lvmcache/lvmetad for use throughout the code.
---
lib/cache/lvmcache.c | 9 +++++++++
lib/cache/lvmcache.h | 2 ++
lib/cache/lvmetad.c | 3 +++
lib/format_text/format-text.c | 1 +
lib/format_text/layout.h | 7 ++++++-
lib/format_text/text_label.c | 3 +++
6 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index b7261cf..1842e8e 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -42,6 +42,7 @@ struct lvmcache_info {
const struct format_type *fmt;
struct device *dev;
uint64_t device_size; /* Bytes */
+ uint32_t ext_version; /* Extension version */
uint32_t ext_flags; /* Extension flags */
uint32_t status;
};
@@ -2278,6 +2279,14 @@ void lvmcache_set_device_size(struct lvmcache_info *info, uint64_t
size) {
struct device *lvmcache_device(struct lvmcache_info *info) {
return info->dev;
}
+void lvmcache_set_ext_version(struct lvmcache_info *info, uint32_t version)
+{
+ info->ext_version = version;
+}
+
+uint32_t lvmcache_ext_version(struct lvmcache_info *info) {
+ return info->ext_version;
+}
void lvmcache_set_ext_flags(struct lvmcache_info *info, uint32_t flags) {
info->ext_flags = flags;
diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h
index 471530c..063a8d1 100644
--- a/lib/cache/lvmcache.h
+++ b/lib/cache/lvmcache.h
@@ -149,6 +149,8 @@ int lvmcache_add_mda(struct lvmcache_info *info, struct device *dev,
int lvmcache_add_da(struct lvmcache_info *info, uint64_t start, uint64_t size);
int lvmcache_add_ba(struct lvmcache_info *info, uint64_t start, uint64_t size);
+void lvmcache_set_ext_version(struct lvmcache_info *info, uint32_t version);
+uint32_t lvmcache_ext_version(struct lvmcache_info *info);
void lvmcache_set_ext_flags(struct lvmcache_info *info, uint32_t flags);
uint32_t lvmcache_ext_flags(struct lvmcache_info *info);
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index b07ba50..97120b0 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -296,6 +296,7 @@ static int _pv_populate_lvmcache(struct cmd_context *cmd,
uint64_t devsize = dm_config_find_int64(cn->child, "dev_size", 0),
label_sector = dm_config_find_int64(cn->child, "label_sector", 0);
uint32_t ext_flags = (uint32_t) dm_config_find_int64(cn->child,
"ext_flags", 0);
+ uint32_t ext_version = (uint32_t) dm_config_find_int64(cn->child,
"ext_version", 0);
if (!fmt && fmt_name)
fmt = get_format_by_name(cmd, fmt_name);
@@ -403,6 +404,7 @@ static int _pv_populate_lvmcache(struct cmd_context *cmd,
lvmcache_set_preferred_duplicates((const char *)&vgid);
lvmcache_set_ext_flags(info, ext_flags);
+ lvmcache_set_ext_version(info, ext_version);
return 1;
}
@@ -915,6 +917,7 @@ int lvmetad_pv_found(const struct id *pvid, struct device *dev, const
struct for
"format = %s", fmt->name,
"label_sector = %"PRId64, (int64_t) label_sector,
"id = %s", uuid,
+ "ext_version = %"PRId64, (int64_t) lvmcache_ext_version(info),
"ext_flags = %"PRId64, (int64_t) lvmcache_ext_flags(info),
NULL))
{
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 3d8329f..311f86c 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -1328,6 +1328,7 @@ static void _set_ext_flags(struct physical_volume *pv, struct
lvmcache_info *inf
else
ext_flags |= PV_EXT_USED;
+ lvmcache_set_ext_version(info, PV_HEADER_EXTENSION_VSN);
lvmcache_set_ext_flags(info, ext_flags);
}
diff --git a/lib/format_text/layout.h b/lib/format_text/layout.h
index 64fc0e1..3f17be3 100644
--- a/lib/format_text/layout.h
+++ b/lib/format_text/layout.h
@@ -23,7 +23,12 @@
/* disk_locn and data_area_list are defined in format-text.h */
-#define PV_HEADER_EXTENSION_VSN 1
+/*
+ * PV header extension versions:
+ * - version 1: bootloader area support
+ * - version 2: PV_EXT_USED flag support
+ */
+#define PV_HEADER_EXTENSION_VSN 2
struct pv_header_extension {
uint32_t version;
diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c
index 1bdff02..022384e 100644
--- a/lib/format_text/text_label.c
+++ b/lib/format_text/text_label.c
@@ -421,6 +421,9 @@ static int _text_read(struct labeller *l, struct device *dev, void
*buf,
log_debug_metadata("%s: PV header extension version %" PRIu32 "
found",
dev_name(dev), ext_version);
+ /* Extension version */
+ lvmcache_set_ext_version(info, xlate32(pvhdr_ext->version));
+
/* Extension flags */
lvmcache_set_ext_flags(info, xlate32(pvhdr_ext->flags));