Project not found: home:pyaggi:branches:openSUSE:Factory

File bug-999878_metadata-check-PV-dev-size-is-not-less-than-PV-size.patch of Package lvm2.7683

From 511fdb2569aec988a7013e0b25f05f05617aa781 Mon Sep 17 00:00:00 2001
From: Eric Ren <zren@suse.com>
Date: Tue, 25 Apr 2017 19:28:58 +0800
Subject: [PATCH 1/2] [PATCH 1/2] metadata: check PV dev size is not less than
 PV size

Upstream commit: c0912af3104cb72ea275d90b8b1d68a25a9ca48a
Backport-by: Eric Ren <zren@suse.com>
---
 WHATS_NEW               |  3 ++-
 lib/metadata/metadata.c | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/WHATS_NEW b/WHATS_NEW
index 9218794..eb0eabe 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,7 @@
-News within backported patches
+News for backported patches
 ==============================
   Fix lvm2-{activation,clvmd,cmirrord,monitor} service to exec before mounting.
+  Warn if device size is less than corresponding PV size in metadata.
 
 Version 2.02.120 - 15th May 2015
 ================================
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 9f098ca..c4e4491 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -650,6 +650,34 @@ int vg_check_pv_dev_block_sizes(const struct volume_group *vg)
 	return 1;
 }
 
+static int _check_pv_dev_sizes(struct volume_group *vg)
+{
+	struct pv_list *pvl;
+	uint64_t dev_size, size;
+	int r = 1;
+
+	if (is_orphan_vg(vg->name))
+		return 1;
+
+	dm_list_iterate_items(pvl, &vg->pvs) {
+		if (is_missing_pv(pvl->pv))
+			continue;
+
+		dev_size = pv_dev_size(pvl->pv);
+		size = pv_size(pvl->pv);
+
+		if (dev_size < size) {
+			log_warn("Device %s has size of %" PRIu64 " sectors which "
+				 "is smaller than corresponding PV size of %" PRIu64
+				  " sectors. Was device resized?",
+				  pv_dev_name(pvl->pv), dev_size, size);
+			r = 0;
+		}
+	}
+
+	return r;
+}
+
 /*
  * Extend a VG by a single PV / device path
  *
@@ -726,6 +754,8 @@ int vg_extend(struct volume_group *vg, int pv_count, const char *const *pv_names
 		dm_free(pv_name);
 	}
 
+	(void) _check_pv_dev_sizes(vg);
+
 /* FIXME Decide whether to initialise and add new mdahs to format instance */
 
 	return 1;
@@ -3739,6 +3769,10 @@ struct volume_group *vg_read_internal(struct cmd_context *cmd, const char *vgnam
 	if (!(vg = _vg_read(cmd, vgname, vgid, warn_flags, consistent, 0)))
 		goto_out;
 
+	if (!_check_pv_dev_sizes(vg))
+		log_warn("One or more devices used as PVs in VG %s "
+			 "have changed sizes.", vg->name);
+
 	if (!check_pv_segments(vg)) {
 		log_error(INTERNAL_ERROR "PV segments corrupted in %s.",
 			  vg->name);
-- 
2.10.2

openSUSE Build Service is sponsored by