|
|
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;
|