main - pvck: ensure buffer is 0 terminated
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=308c6f31c3d79b370b1...
Commit: 308c6f31c3d79b370b163660f3ec38042a00289f
Parent: 01081b21006abe4d9a0102541982cb0fcaeb22dc
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jul 27 15:12:56 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Jul 28 00:49:22 2021 +0200
pvck: ensure buffer is 0 terminated
Since readed metadata buffer is passed to printf(),
ensure the buffer is '\0' terminated.
---
tools/pvck.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/pvck.c b/tools/pvck.c
index d81966966..b15158746 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -898,7 +898,7 @@ static int _dump_current_text(struct device *dev, struct devicefile *def,
int ri = rlocn_index; /* 0 or 1 */
int bad = 0;
- if (!(meta_buf = zalloc(meta_size))) {
+ if (!(meta_buf = zalloc(meta_size + 1))) {
log_print("CHECK: mda_header_%d.raw_locn[%d] no mem for metadata text size %llu", mn, ri,
(unsigned long long)meta_size);
return 0;
2 years, 9 months
main - cov: pvck fix memleak
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=01081b21006abe4d9a0...
Commit: 01081b21006abe4d9a0102541982cb0fcaeb22dc
Parent: 8ebcbe9ace6e5c88a35cf62cd04b853ca7551a2b
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jul 27 22:52:08 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Jul 28 00:49:22 2021 +0200
cov: pvck fix memleak
Fix memory leaks on error paths for allocated
path and backup_file name by converting allocation to
dm_pool_alloc and also change devicefile structure to contain
embeded path as last struct member - so we could allocate
only needed string size instead of PATH_MAX from pool.
TODO: still to be fixed 'mf' struct.
---
tools/pvck.c | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/tools/pvck.c b/tools/pvck.c
index 4e8814737..d81966966 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -343,14 +343,15 @@ static uint64_t mda2_size_from_offset(struct device *dev, uint64_t mda2_offset)
}
struct devicefile {
- char path[PATH_MAX];
int fd;
+ char path[0];
};
-static struct devicefile *get_devicefile(const char *path)
+static struct devicefile *get_devicefile(struct cmd_context *cmd, const char *path)
{
struct stat sb;
struct devicefile *def;
+ size_t len;
if (stat(path, &sb))
return_NULL;
@@ -358,18 +359,14 @@ static struct devicefile *get_devicefile(const char *path)
if ((sb.st_mode & S_IFMT) != S_IFREG)
return_NULL;
- if (!(def = malloc(sizeof(struct devicefile))))
+ len = strlen(path) + 1;
+ if (!(def = dm_pool_alloc(cmd->mem, sizeof(struct devicefile) + len)))
return_NULL;
- if (dm_snprintf(def->path, PATH_MAX, "%s", path) < 0) {
- free(def);
- return_NULL;
- }
+ memcpy(def->path, path, len);
- if ((def->fd = open(path, O_RDONLY)) < 0) {
- free(def);
+ if ((def->fd = open(path, O_RDONLY)) < 0)
return_NULL;
- }
return def;
}
@@ -1774,8 +1771,7 @@ static int _get_one_setting(struct cmd_context *cmd, struct settings *set, char
}
if (!strncmp(key, "backup_file", strlen("backup_file"))) {
- free(set->backup_file);
- if ((set->backup_file = strdup(val)))
+ if ((set->backup_file = dm_pool_strdup(cmd->mem, val)))
return 1;
return 0;
}
@@ -3063,7 +3059,7 @@ int pvck(struct cmd_context *cmd, int argc, char **argv)
return ECMD_FAILED;
}
if (S_ISREG(sb.st_mode))
- def = get_devicefile(pv_name);
+ def = get_devicefile(cmd, pv_name);
else if (S_ISBLK(sb.st_mode)) {
if (!setup_device(cmd, pv_name)) {
log_error("Failed to set up device %s.", pv_name);
@@ -3145,7 +3141,6 @@ int pvck(struct cmd_context *cmd, int argc, char **argv)
} else
log_error("Unknown dump value.");
- free(def);
if (!ret)
return ECMD_FAILED;
return ECMD_PROCESSED;
2 years, 9 months
main - tests: extend vgmerge testing
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=8ebcbe9ace6e5c88a35...
Commit: 8ebcbe9ace6e5c88a35cf62cd04b853ca7551a2b
Parent: 4b856476e96777842ea6c9b42654c369a6b22db4
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jul 23 16:34:50 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jul 23 16:36:31 2021 +0200
tests: extend vgmerge testing
---
test/shell/vgmerge-operation.sh | 42 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/test/shell/vgmerge-operation.sh b/test/shell/vgmerge-operation.sh
index 21889e95d..0bf517d38 100644
--- a/test/shell/vgmerge-operation.sh
+++ b/test/shell/vgmerge-operation.sh
@@ -80,3 +80,45 @@ grep "Duplicate logical volume name \"$lv1\" in \"$vg2\" and \"$vg1" err
check pvlv_counts $vg1 2 1 0
check pvlv_counts $vg2 2 1 0
vgremove -f $vg1 $vg2
+
+
+# 'vgmerge' handle pmspare for merged VG
+if aux have_thin 1 5 0; then
+
+# With disabled pmspare nothing is created
+vgcreate $vg1 "$dev1" "$dev2"
+vgcreate $vg2 "$dev3" "$dev4"
+lvcreate -T -L8M $vg1/pool1 --poolmetadatasize 8M --poolmetadataspare n
+lvcreate -T -L8M $vg2/pool2 --poolmetadatasize 4M --poolmetadataspare n
+vgchange -an $vg1 $vg2
+
+vgmerge --poolmetadataspare n $vg1 $vg2
+check lv_not_exists $vg/lvol0_pmspare
+vgremove -ff $vg1
+
+
+# With pmspare handling there are one created
+vgcreate $vg1 "$dev1" "$dev2"
+vgcreate $vg2 "$dev3" "$dev4"
+lvcreate -T -L8M $vg1/pool1 --poolmetadatasize 8M --poolmetadataspare n
+lvcreate -T -L8M $vg2/pool2 --poolmetadatasize 4M --poolmetadataspare n
+vgchange -an $vg1 $vg2
+
+vgmerge $vg1 $vg2
+check lv_field $vg1/lvol0_pmspare size "8.00m"
+vgremove -ff $vg1
+
+
+# When merged, bigger pmspare is preserved
+vgcreate $vg1 "$dev1" "$dev2"
+vgcreate $vg2 "$dev3" "$dev4"
+lvcreate -T -L8M $vg1/pool1 --poolmetadatasize 8M
+lvcreate -T -L8M $vg2/pool2 --poolmetadatasize 4M
+vgchange -an $vg1 $vg2
+
+vgmerge $vg1 $vg2
+
+check lv_field $vg1/lvol0_pmspare size "8.00m"
+vgremove -ff $vg1
+
+fi
2 years, 9 months
main - vgmerge: support option --poolmetadataspare
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4b856476e96777842ea...
Commit: 4b856476e96777842ea6c9b42654c369a6b22db4
Parent: 9cbc9e8296752df35626a9b50de1cb551ff5e99e
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jul 23 16:32:35 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jul 23 16:36:31 2021 +0200
vgmerge: support option --poolmetadataspare
---
WHATS_NEW | 2 +-
man/vgmerge.8_pregen | 9 +++++++++
tools/command-lines.in | 2 +-
tools/vgmerge.c | 6 ++++++
4 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 83d780029..4fcd9f3c5 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,6 @@
Version 2.03.13 -
===============================
- Support --poolmetadataspare with vgsplit.
+ Support --poolmetadataspare with vgsplit and vgmerge.
Fix detection of active components of external origin volume.
Add vdoimport tool to support conversion of VDO volumes.
Support configurable allocation/vdo_pool_header_size.
diff --git a/man/vgmerge.8_pregen b/man/vgmerge.8_pregen
index 1264bb565..e2292182a 100644
--- a/man/vgmerge.8_pregen
+++ b/man/vgmerge.8_pregen
@@ -27,6 +27,8 @@ of both VGs fit into the destination VG's limits.
.br
[ \fB-l\fP|\fB--list\fP ]
.br
+[ \fB--poolmetadataspare\fP \fBy\fP|\fBn\fP ]
+.br
[ COMMON_OPTIONS ]
.ad b
.RE
@@ -147,6 +149,13 @@ Display long help text.
Disable locking.
.
.HP
+\fB--poolmetadataspare\fP \fBy\fP|\fBn\fP
+.br
+Enable or disable the automatic creation and management of a
+spare pool metadata LV in the VG. A spare metadata LV is reserved
+space that can be used when repairing a pool.
+.
+.HP
\fB--profile\fP \fIString\fP
.br
An alias for --commandprofile or --metadataprofile, depending
diff --git a/tools/command-lines.in b/tools/command-lines.in
index a4785b38a..0bc5a4989 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -1847,7 +1847,7 @@ DESC: Add devices from all accessible VGs to the devices file.
---
vgmerge VG VG
-OO: --autobackup Bool, --list
+OO: --autobackup Bool, --list, --poolmetadataspare Bool
ID: vgmerge_general
---
diff --git a/tools/vgmerge.c b/tools/vgmerge.c
index 884ad4b8d..08615cd62 100644
--- a/tools/vgmerge.c
+++ b/tools/vgmerge.c
@@ -64,6 +64,8 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
struct lv_list *lvl1, *lvl2;
int r = ECMD_FAILED;
int lock_vg_from_first = 0;
+ struct logical_volume *lv;
+ int poolmetadataspare = arg_int_value(cmd, poolmetadataspare_ARG, DEFAULT_POOL_METADATA_SPARE);
if (!strcmp(vg_name_to, vg_name_from)) {
log_error("Duplicate volume group name \"%s\"", vg_name_from);
@@ -185,6 +187,10 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
/* Flag up that some PVs have moved from another VG */
vg_to->old_name = vg_from->name;
+ /* Check whether size of pmspare is big enough now for merged VG */
+ if (!handle_pool_metadata_spare(vg_to, 0, &vg_to->pvs, poolmetadataspare))
+ goto_bad;
+
/* store it on disks */
log_verbose("Writing out updated volume group");
if (!vg_write(vg_to) || !vg_commit(vg_to))
2 years, 9 months
main - vgmerge: remove one of merge pmspare LVs
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=9cbc9e8296752df3562...
Commit: 9cbc9e8296752df35626a9b50de1cb551ff5e99e
Parent: 06602942a31d82cb69e9d1874f3b63825c0f93ac
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jul 23 16:31:11 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jul 23 16:35:47 2021 +0200
vgmerge: remove one of merge pmspare LVs
When merging 2 VG, where both of them have pmspare volume,
select the bigger one and remove the other.
---
tools/vgmerge.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/tools/vgmerge.c b/tools/vgmerge.c
index 895018a6f..884ad4b8d 100644
--- a/tools/vgmerge.c
+++ b/tools/vgmerge.c
@@ -92,6 +92,20 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
}
}
+ if (vg_from->pool_metadata_spare_lv &&
+ vg_to->pool_metadata_spare_lv) {
+ if (vg_from->pool_metadata_spare_lv->le_count >
+ vg_to->pool_metadata_spare_lv->le_count)
+ /* Preserve bigger pmspare from VG_FROM */
+ lv = vg_to->pool_metadata_spare_lv;
+ else
+ lv = vg_from->pool_metadata_spare_lv;
+
+ log_debug_metadata("Removing pool metadata spare %s.", display_lvname(lv));
+ if (!lv_remove_single(cmd, lv, DONT_PROMPT, 0))
+ return_ECMD_FAILED;
+ }
+
if (!vgs_are_compatible(cmd, vg_from, vg_to))
goto_bad;
2 years, 9 months
main - writecache: use block size 512 for thin pool data
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=06602942a31d82cb69e...
Commit: 06602942a31d82cb69e9d1874f3b63825c0f93ac
Parent: d91c018732c07c5d8c6bfc05570dbc82644a957c
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Wed Jul 21 14:10:38 2021 -0500
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Wed Jul 21 14:24:27 2021 -0500
writecache: use block size 512 for thin pool data
Recent commit 84bd394cf9aaa581b4bf980f764544dda26a0305
"writecache: use block size 4096 when no fs is found"
failed to account for the case where writecache is attached
to thin pool data. Checking fs block size on the thin pool
data LV is wrong, and checking the fs block on each thin LV
would be impractical, so default to 512 which cannot break
any existing file systems, and require the user to specify
4k when appropriate.
---
tools/lvconvert.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index f699443fd..83dfe5c71 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -5966,6 +5966,23 @@ static int _set_writecache_block_size(struct cmd_context *cmd,
goto bad;
}
+ /*
+ * When attaching writecache to thin pool data, the fs block sizes
+ * would need to be checked on each thin LV which isn't practical, so
+ * default to 512, and require the user to specify 4k when appropriate.
+ */
+ if (lv_is_thin_pool(lv) || lv_is_thin_pool_data(lv)) {
+ if (block_size_setting)
+ block_size = block_size_setting;
+ else
+ block_size = 512;
+
+ log_print("Using writecache block size %u for thin pool data, logical block size %u, physical block size %u.",
+ block_size, lbs_4k ? 4096 : 512, pbs_4k ? 4096 : 512);
+
+ goto out;
+ }
+
if (dm_snprintf(pathname, sizeof(pathname), "%s/%s/%s", cmd->dev_dir,
lv->vg->name, lv->name) < 0) {
log_error("Path name too long to get LV block size %s", display_lvname(lv));
2 years, 9 months
main - writecache: fix missing sync_dev_names when attaching cache
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d91c018732c07c5d8c6...
Commit: d91c018732c07c5d8c6bfc05570dbc82644a957c
Parent: 640fe5cf42fd136e60778513c5fc28499e78f9c2
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Wed Jul 21 13:16:21 2021 -0500
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Wed Jul 21 13:16:21 2021 -0500
writecache: fix missing sync_dev_names when attaching cache
When activating an LV to check the fs block size, wait for
the LV dev to be accessible before running blkid on it.
---
tools/lvconvert.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 7fbe84952..f699443fd 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -6124,6 +6124,12 @@ int lvconvert_writecache_attach_single(struct cmd_context *cmd,
log_error("Failed to activate LV to check block size %s", display_lvname(lv));
goto bad;
}
+ if (!sync_local_dev_names(cmd)) {
+ log_error("Failed to sync local dev names.");
+ if (!deactivate_lv(cmd, lv))
+ stack;
+ goto bad;
+ }
}
if (!_set_writecache_block_size(cmd, lv, &block_size_sectors)) {
2 years, 9 months
main - spec: Add vdoimport man page
by Marian Csontos
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=640fe5cf42fd136e607...
Commit: 640fe5cf42fd136e60778513c5fc28499e78f9c2
Parent: b70c341c9e9526cc21f590af73ccce2369755736
Author: Marian Csontos <mcsontos(a)redhat.com>
AuthorDate: Wed Jul 21 16:40:27 2021 +0200
Committer: Marian Csontos <mcsontos(a)redhat.com>
CommitterDate: Wed Jul 21 16:40:27 2021 +0200
spec: Add vdoimport man page
---
spec/packages.inc | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/spec/packages.inc b/spec/packages.inc
index bf693a4ce..700e77506 100644
--- a/spec/packages.inc
+++ b/spec/packages.inc
@@ -61,6 +61,9 @@ fi
%{_sbindir}/pvresize
%{_sbindir}/pvs
%{_sbindir}/pvscan
+%if %{have_with vdo}
+%{_sbindir}/vdoimport
+%endif
%{_sbindir}/vgcfgbackup
%{_sbindir}/vgcfgrestore
%{_sbindir}/vgchange
@@ -70,7 +73,6 @@ fi
%{_sbindir}/vgdisplay
%{_sbindir}/vgexport
%{_sbindir}/vgextend
-%{_sbindir}/vdoimport
%{_sbindir}/vgimport
%{_sbindir}/vgimportclone
%{_sbindir}/vgimportdevices
@@ -123,6 +125,9 @@ fi
%{_mandir}/man8/pvresize.8.gz
%{_mandir}/man8/pvs.8.gz
%{_mandir}/man8/pvscan.8.gz
+%if %{have_with vdo}
+%{_mandir}/man8/vdoimport.8.gz
+%endif
%{_mandir}/man8/vgcfgbackup.8.gz
%{_mandir}/man8/vgcfgrestore.8.gz
%{_mandir}/man8/vgchange.8.gz
2 years, 9 months
main - test
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=b70c341c9e9526cc21f...
Commit: b70c341c9e9526cc21f590af73ccce2369755736
Parent: 2132fdc11f7bc285638765e001bef6a3e595b286
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jul 20 22:37:54 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Jul 21 15:56:33 2021 +0200
test
---
test/shell/vgsplit-cache.sh | 47 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/test/shell/vgsplit-cache.sh b/test/shell/vgsplit-cache.sh
index eba85befe..202e4b562 100644
--- a/test/shell/vgsplit-cache.sh
+++ b/test/shell/vgsplit-cache.sh
@@ -75,6 +75,53 @@ lvremove -y $vg
vgremove -ff $vg
vgremove -ff $vg1
+#
+# Check we handle pmspare for splitted VGs
+#
+aux prepare_vg 7
+
+# Create cache-pool and pmspare on single PV1
+lvcreate -L10 --type cache-pool $vg/cpool "$dev1"
+# Move spare to separate PV3
+pvmove -n $vg/lvol0_pmspare "$dev1" "$dev3"
+# Create origin on PV2
+lvcreate -L10 -n orig $vg "$dev2"
+lvconvert -H -y --cachepool $vg/cpool $vg/orig
+
+vgchange -an $vg
+
+# Check we do not create new _pmspare
+vgsplit --poolmetadataspare n $vg $vg1 "$dev2" "$dev1"
+
+check lv_exists $vg/lvol0_pmspare
+check lv_not_exists $vg1/lvol0_pmspare
+
+vgremove $vg
+vgremove -f $vg1
+
+
+aux prepare_vg 7
+
+# Again - now with handling _pmspare by vgsplit
+lvcreate -L10 --type cache-pool $vg/cpool "$dev1"
+# Move spare to separate PV3
+pvmove -n $vg/lvol0_pmspare "$dev1" "$dev3"
+# Create origin on PV2
+lvcreate -L10 -n orig $vg "$dev2"
+lvconvert -H -y --cachepool $vg/cpool $vg/orig
+
+vgchange -an $vg
+
+# Handle _pmspare (default)
+vgsplit --poolmetadataspare y $vg $vg1 "$dev2" "$dev1"
+
+check lv_not_exists $vg/lvol0_pmspare
+check lv_exists $vg1/lvol0_pmspare
+
+vgremove $vg
+vgremove -f $vg1
+
+
vgcreate $vg "$dev1" "$dev2" "$dev3" "$dev4"
lvcreate -L6 -n $lv1 -an $vg "$dev2"
2 years, 9 months
main - vgsplit: add support for option --poolmetadataspare
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2132fdc11f7bc285638...
Commit: 2132fdc11f7bc285638765e001bef6a3e595b286
Parent: 5042463c5083cc71546297344058bd0fa523aa5c
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jul 20 22:33:05 2021 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Jul 21 15:56:33 2021 +0200
vgsplit: add support for option --poolmetadataspare
When splitting VG with thin/cache pool volume, handle pmspare during
such split and allocate new pmspare in new VG or extend existing pmspare
there and eventually drop pmspare in original VG if is no longer needed
there.
---
WHATS_NEW | 1 +
lib/metadata/pool_manip.c | 11 +++++++++++
man/vgsplit.8_pregen | 9 +++++++++
tools/command-lines.in | 2 +-
tools/vgsplit.c | 8 ++++++++
5 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index b06071c42..83d780029 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.03.13 -
===============================
+ Support --poolmetadataspare with vgsplit.
Fix detection of active components of external origin volume.
Add vdoimport tool to support conversion of VDO volumes.
Support configurable allocation/vdo_pool_header_size.
diff --git a/lib/metadata/pool_manip.c b/lib/metadata/pool_manip.c
index 9ceec3a7e..e451e92ae 100644
--- a/lib/metadata/pool_manip.c
+++ b/lib/metadata/pool_manip.c
@@ -722,6 +722,17 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents,
return 1;
}
+ if (!extents) {
+ /* pmspare is not needed */
+ if (lv) {
+ log_debug_metadata("Dropping unused pool metadata spare LV %s.",
+ display_lvname(lv));
+ if (!lv_remove_single(vg->cmd, lv, DONT_PROMPT, 0))
+ return_0;
+ }
+ return 1;
+ }
+
if (extents > MAX_SIZE)
extents = MAX_SIZE;
diff --git a/man/vgsplit.8_pregen b/man/vgsplit.8_pregen
index 331c6e491..8a0ae597e 100644
--- a/man/vgsplit.8_pregen
+++ b/man/vgsplit.8_pregen
@@ -70,6 +70,8 @@ Common options for command:
.hy
]
.br
+[ \fB--poolmetadataspare\fP \fBy\fP|\fBn\fP ]
+.br
[ \fB--\fP[\fBvg\fP]\fBmetadatacopies\fP \fBall\fP|\fBunmanaged\fP|\fINumber\fP ]
.ad b
.RE
@@ -235,6 +237,13 @@ Move only PVs used by the named LV.
Disable locking.
.
.HP
+\fB--poolmetadataspare\fP \fBy\fP|\fBn\fP
+.br
+Enable or disable the automatic creation and management of a
+spare pool metadata LV in the VG. A spare metadata LV is reserved
+space that can be used when repairing a pool.
+.
+.HP
\fB--profile\fP \fIString\fP
.br
An alias for --commandprofile or --metadataprofile, depending
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 8607305cb..a4785b38a 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -1912,7 +1912,7 @@ ID: vgscan_general
---
-OO_VGSPLIT: --autobackup Bool
+OO_VGSPLIT: --autobackup Bool, --poolmetadataspare Bool
# used only when the destination VG is new
OO_VGSPLIT_NEW: --alloc Alloc,
diff --git a/tools/vgsplit.c b/tools/vgsplit.c
index 296248e7c..a085ac2ba 100644
--- a/tools/vgsplit.c
+++ b/tools/vgsplit.c
@@ -525,6 +525,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
int existing_vg = 0;
int r = ECMD_FAILED;
const char *lv_name;
+ int poolmetadataspare = arg_int_value(cmd, poolmetadataspare_ARG, DEFAULT_POOL_METADATA_SPARE);
if ((arg_is_set(cmd, name_ARG) + argc) < 3) {
log_error("Existing VG, new VG and either physical volumes "
@@ -699,6 +700,13 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
*/
vg_to->status |= EXPORTED_VG;
+
+ if (!handle_pool_metadata_spare(vg_to, 0, &vg_to->pvs, poolmetadataspare))
+ goto_bad;
+
+ if (!handle_pool_metadata_spare(vg_from, 0, &vg_from->pvs, poolmetadataspare))
+ goto_bad;
+
if (!archive(vg_to))
goto_bad;
2 years, 9 months