mrc0mmand / rpms / lvm2

Forked from rpms/lvm2 2 years ago
Clone

Blame SOURCES/lvm2-2_03_12-pool-limit-pmspare-to-16GiB.patch

cdbae0
 lib/metadata/pool_manip.c | 10 +++++++++-
cdbae0
 1 file changed, 9 insertions(+), 1 deletion(-)
cdbae0
cdbae0
diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c
cdbae0
index b67882e..1975cb4 100644
cdbae0
--- a/lib/metadata/pool_manip.c
cdbae0
+++ b/lib/metadata/pool_manip.c
cdbae0
@@ -697,6 +697,8 @@ static struct logical_volume *_alloc_pool_metadata_spare(struct volume_group *vg
cdbae0
 int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents,
cdbae0
 			       struct dm_list *pvh, int poolmetadataspare)
cdbae0
 {
cdbae0
+	/* Max usable size of any spare volume is currently 16GiB rouned to extent size */
cdbae0
+	const uint64_t MAX_SIZE = (UINT64_C(2 * 16) * 1024 * 1024 + vg->extent_size - 1) / vg->extent_size;
cdbae0
 	struct logical_volume *lv = vg->pool_metadata_spare_lv;
cdbae0
 	uint32_t seg_mirrors;
cdbae0
 	struct lv_segment *seg;
cdbae0
@@ -706,8 +708,11 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents,
cdbae0
 		/* Find maximal size of metadata LV */
cdbae0
 		dm_list_iterate_items(lvl, &vg->lvs)
cdbae0
 			if (lv_is_pool_metadata(lvl->lv) &&
cdbae0
-			    (lvl->lv->le_count > extents))
cdbae0
+			    (lvl->lv->le_count > extents)) {
cdbae0
 				extents = lvl->lv->le_count;
cdbae0
+				if (extents >= MAX_SIZE)
cdbae0
+					break;
cdbae0
+			}
cdbae0
 
cdbae0
 	if (!poolmetadataspare) {
cdbae0
 		/* TODO: Not showing when lvm.conf would define 'n' ? */
cdbae0
@@ -718,6 +723,9 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents,
cdbae0
 		return 1;
cdbae0
 	}
cdbae0
 
cdbae0
+	if (extents > MAX_SIZE)
cdbae0
+		extents = MAX_SIZE;
cdbae0
+
cdbae0
 	if (!lv) {
cdbae0
 		if (!_alloc_pool_metadata_spare(vg, extents, pvh))
cdbae0
 			return_0;