master - generate man pages
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=698abdde165a3e...
Commit: 698abdde165a3e747b81f18cf3405f2d4abb5bae
Parent: 13a6368522894e9d32544d8fb3d6360bbe9018d1
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Fri Feb 10 16:20:19 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 10:31:23 2017 -0600
generate man pages
---
configure.in | 2 +
doc/license.txt | 14 +
man/Makefile.in | 39 +-
man/clvmd.8.in | 26 +
man/lvchange.8.des | 2 +
man/lvchange.8.end | 6 +
man/lvchange.8.in | 491 -------------------
man/lvconvert.8.des | 32 ++
man/lvconvert.8.end | 95 ++++
man/lvconvert.8.in | 1199 ----------------------------------------------
man/lvcreate.8.des | 28 ++
man/lvcreate.8.end | 98 ++++
man/lvcreate.8.in | 914 -----------------------------------
man/lvdisplay.8.des | 5 +
man/lvdisplay.8.in | 134 -----
man/lvextend.8.des | 5 +
man/lvextend.8.end | 16 +
man/lvextend.8.in | 134 -----
man/lvm-config.8.des | 5 +
man/lvm-config.8.in | 1 -
man/lvm-dumpconfig.8.des | 5 +
man/lvm-dumpconfig.8.in | 1 -
man/lvm-fullreport.8.des | 6 +
man/lvm-fullreport.8.in | 145 ------
man/lvm-lvpoll.8.des | 4 +
man/lvm-lvpoll.8.end | 33 ++
man/lvm-lvpoll.8.in | 89 ----
man/lvmchange.8.in | 10 -
man/lvmconfig.8.des | 3 +
man/lvmconfig.8.in | 225 ---------
man/lvmdiskscan.8.des | 7 +
man/lvmdiskscan.8.in | 27 -
man/lvmlockd.8.in | 42 +-
man/lvmsadc.8.des | 3 +
man/lvmsadc.8.in | 16 -
man/lvmsar.8.des | 3 +
man/lvmsar.8.in | 16 -
man/lvreduce.8.des | 14 +
man/lvreduce.8.end | 5 +
man/lvreduce.8.in | 110 -----
man/lvremove.8.des | 22 +
man/lvremove.8.end | 11 +
man/lvremove.8.in | 80 ---
man/lvrename.8.des | 2 +
man/lvrename.8.end | 10 +
man/lvrename.8.in | 51 --
man/lvresize.8.des | 2 +
man/lvresize.8.end | 6 +
man/lvresize.8.in | 124 -----
man/lvs.8.des | 1 +
man/lvs.8.end | 75 +++
man/lvs.8.in | 290 -----------
man/lvscan.8.des | 5 +
man/lvscan.8.in | 52 --
man/pvchange.8.des | 1 +
man/pvchange.8.end | 6 +
man/pvchange.8.in | 59 ---
man/pvck.8.des | 1 +
man/pvck.8.end | 8 +
man/pvck.8.in | 37 --
man/pvcreate.8.des | 18 +
man/pvcreate.8.end | 13 +
man/pvcreate.8.in | 210 --------
man/pvdisplay.8.des | 5 +
man/pvdisplay.8.in | 109 -----
man/pvmove.8.des | 61 +++
man/pvmove.8.end | 46 ++
man/pvmove.8.in | 187 -------
man/pvremove.8.des | 2 +
man/pvremove.8.in | 37 --
man/pvresize.8.des | 2 +
man/pvresize.8.end | 16 +
man/pvresize.8.in | 56 ---
man/pvs.8.des | 1 +
man/pvs.8.end | 11 +
man/pvs.8.in | 153 ------
man/pvscan.8.des | 105 ++++
man/pvscan.8.in | 178 -------
man/see_also.end | 67 +++
man/vgcfgbackup.8.des | 16 +
man/vgcfgbackup.8.in | 36 --
man/vgcfgrestore.8.des | 8 +
man/vgcfgrestore.8.end | 9 +
man/vgcfgrestore.8.in | 58 ---
man/vgchange.8.des | 2 +
man/vgchange.8.end | 16 +
man/vgchange.8.in | 346 -------------
man/vgck.8.des | 1 +
man/vgck.8.in | 22 -
man/vgconvert.8.des | 7 +
man/vgconvert.8.in | 48 --
man/vgcreate.8.des | 4 +
man/vgcreate.8.end | 6 +
man/vgcreate.8.in | 187 -------
man/vgdisplay.8.des | 4 +
man/vgdisplay.8.in | 123 -----
man/vgexport.8.des | 8 +
man/vgexport.8.in | 37 --
man/vgextend.8.des | 11 +
man/vgextend.8.end | 6 +
man/vgextend.8.in | 71 ---
man/vgimport.8.des | 5 +
man/vgimport.8.in | 38 --
man/vgimportclone.8.des | 6 +
man/vgimportclone.8.end | 9 +
man/vgimportclone.8.in | 46 --
man/vgmerge.8.des | 3 +
man/vgmerge.8.end | 7 +
man/vgmerge.8.in | 41 --
man/vgmknodes.8.des | 5 +
man/vgmknodes.8.in | 30 --
man/vgreduce.8.des | 1 +
man/vgreduce.8.in | 49 --
man/vgremove.8.des | 6 +
man/vgremove.8.in | 46 --
man/vgrename.8.des | 9 +
man/vgrename.8.end | 10 +
man/vgrename.8.in | 58 ---
man/vgs.8.des | 1 +
man/vgs.8.end | 17 +
man/vgs.8.in | 161 -------
man/vgscan.8.des | 1 +
man/vgscan.8.in | 43 --
man/vgsplit.8.des | 13 +
man/vgsplit.8.in | 80 ---
tools/Makefile.in | 1 -
126 files changed, 1159 insertions(+), 6683 deletions(-)
diff --git a/configure.in b/configure.in
index 8ec65c8..55bc0be 100644
--- a/configure.in
+++ b/configure.in
@@ -86,6 +86,8 @@ AC_PROG_RANLIB
AC_PATH_TOOL(CFLOW_CMD, cflow)
AC_PATH_TOOL(CSCOPE_CMD, cscope)
AC_PATH_TOOL(CHMOD, chmod)
+AC_PATH_TOOL(WC, wc)
+AC_PATH_TOOL(SORT, sort)
################################################################################
dnl -- Check for header files.
diff --git a/doc/license.txt b/doc/license.txt
new file mode 100644
index 0000000..5ba3e66
--- /dev/null
+++ b/doc/license.txt
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
+ * Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License v.2.1.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
diff --git a/man/Makefile.in b/man/Makefile.in
index 471cac3..ca2249c 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -31,18 +31,20 @@ LVMRAIDMAN = lvmraid.7
MAN5=lvm.conf.5
MAN7=lvmsystemid.7 lvmreport.7
-MAN8=lvm-config.8 lvm-dumpconfig.8 lvm-fullreport.8 lvm-lvpoll.8 \
- lvchange.8 lvmconfig.8 lvconvert.8 lvcreate.8 lvdisplay.8 lvextend.8 \
- lvm.8 lvmchange.8 lvmconf.8 lvmdiskscan.8 lvmdump.8 lvmsadc.8 lvmsar.8 \
+MAN8=lvm.8 lvmconf.8 lvmdump.8
+MAN8DM=dmsetup.8 dmstats.8
+MAN8CLUSTER=
+MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8
+
+MAN8GEN=lvm-config.8 lvm-dumpconfig.8 lvm-fullreport.8 lvm-lvpoll.8 \
+ lvcreate.8 lvchange.8 lvmconfig.8 lvconvert.8 lvdisplay.8 lvextend.8 \
lvreduce.8 lvremove.8 lvrename.8 lvresize.8 lvs.8 \
lvscan.8 pvchange.8 pvck.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \
pvresize.8 pvs.8 pvscan.8 vgcfgbackup.8 vgcfgrestore.8 vgchange.8 \
vgck.8 vgcreate.8 vgconvert.8 vgdisplay.8 vgexport.8 vgextend.8 \
vgimport.8 vgimportclone.8 vgmerge.8 vgmknodes.8 vgreduce.8 vgremove.8 \
- vgrename.8 vgs.8 vgscan.8 vgsplit.8
-MAN8DM=dmsetup.8 dmstats.8
-MAN8CLUSTER=
-MAN8SYSTEMD_GENERATORS=lvm2-activation-generator.8
+ vgrename.8 vgs.8 vgscan.8 vgsplit.8 \
+ lvmsar.8 lvmsadc.8 lvmdiskscan.8 lvmchange.8
ifeq ($(MAKECMDGOALS),all_man)
MAN_ALL="yes"
@@ -113,8 +115,8 @@ MAN8DIR=$(mandir)/man8
include $(top_builddir)/make.tmpl
-CLEAN_TARGETS+=$(MAN5) $(MAN7) $(MAN8) $(MAN8CLUSTER) \
- $(MAN8SYSTEMD_GENERATORS) $(MAN8DM)
+CLEAN_TARGETS+=$(MAN5) $(MAN7) $(MAN8) $(MAN8GEN) $(MAN8CLUSTER) \
+ $(MAN8SYSTEMD_GENERATORS) $(MAN8DM) *.gen man-generator
DISTCLEAN_TARGETS+=$(FSADMMAN) $(BLKDEACTIVATEMAN) $(DMEVENTDMAN) \
$(LVMETADMAN) $(LVMPOLLDMAN) $(LVMLOCKDMAN) $(CLVMDMAN) $(CMIRRORDMAN) \
$(LVMCACHEMAN) $(LVMTHINMAN) $(LVMDBUSDMAN) $(LVMRAIDMAN)
@@ -125,11 +127,11 @@ all: man device-mapper
device-mapper: $(MAN8DM)
-man: $(MAN5) $(MAN7) $(MAN8) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS)
+man: $(MAN5) $(MAN7) $(MAN8) $(MAN8GEN) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS)
all_man: man
-$(MAN5) $(MAN7) $(MAN8) $(MAN8DM) $(MAN8CLUSTER): Makefile
+$(MAN5) $(MAN7) $(MAN8) $(MAN8GEN) $(MAN8DM) $(MAN8CLUSTER): Makefile
Makefile: Makefile.in
@:
@@ -140,6 +142,18 @@ Makefile: Makefile.in
*) echo "Creating $@" ; $(SED) -e "s+#VERSION#+$(LVM_VERSION)+;s+#DEFAULT_SYS_DIR#+$(DEFAULT_SYS_DIR)+;s+#DEFAULT_ARCHIVE_DIR#+$(DEFAULT_ARCHIVE_DIR)+;s+#DEFAULT_BACKUP_DIR#+$(DEFAULT_BACKUP_DIR)+;s+#DEFAULT_PROFILE_DIR#+$(DEFAULT_PROFILE_DIR)+;s+#DEFAULT_CACHE_DIR#+$(DEFAULT_CACHE_DIR)+;s+#DEFAULT_LOCK_DIR#+$(DEFAULT_LOCK_DIR)+;s+#CLVMD_PATH#+@CLVMD_PATH@+;s+#LVM_PATH#+@LVM_PATH@+;s+#DEFAULT_RUN_DIR#+@DEFAULT_RUN_DIR@+;s+#DEFAULT_PID_DIR#+@DEFAULT_PID_DIR@+;s+#SYSTEMD_GENERATOR_DIR#+$(SYSTEMD_GENERATOR_DIR)+;s+#DEFAULT_MANGLING#+$(DEFAULT_MANGLING)+;" $< > $@ ;; \
esac
+man-generator:
+ $(CC) -DMAN_PAGE_GENERATOR -I$(top_builddir)/tools $(CFLAGS) $(top_srcdir)/tools/command.c -o $@
+ - ./man-generator lvmconfig > test.gen
+ if [ ! -s test.gen ] ; then cp genfiles/*.gen $(top_builddir)/man; fi;
+
+$(MAN8GEN): man-generator
+ echo "Generating $@" ;
+ if [ ! -e $@.gen ]; then ./man-generator $(basename $@) $(top_srcdir)/man/$@.des > $@.gen; fi
+ if [ -f $(top_srcdir)/man/$@.end ]; then cat $(top_srcdir)/man/$@.end >> $@.gen; fi;
+ cat $(top_srcdir)/man/see_also.end >> $@.gen
+ $(SED) -e "s+#VERSION#+$(LVM_VERSION)+;s+#DEFAULT_SYS_DIR#+$(DEFAULT_SYS_DIR)+;s+#DEFAULT_ARCHIVE_DIR#+$(DEFAULT_ARCHIVE_DIR)+;s+#DEFAULT_BACKUP_DIR#+$(DEFAULT_BACKUP_DIR)+;s+#DEFAULT_PROFILE_DIR#+$(DEFAULT_PROFILE_DIR)+;s+#DEFAULT_CACHE_DIR#+$(DEFAULT_CACHE_DIR)+;s+#DEFAULT_LOCK_DIR#+$(DEFAULT_LOCK_DIR)+;s+#CLVMD_PATH#+@CLVMD_PATH@+;s+#LVM_PATH#+@LVM_PATH@+;s+#DEFAULT_RUN_DIR#+@DEFAULT_RUN_DIR@+;s+#DEFAULT_PID_DIR#+@DEFAULT_PID_DIR@+;s+#SYSTEMD_GENERATOR_DIR#+$(SYSTEMD_GENERATOR_DIR)+;s+#DEFAULT_MANGLING#+$(DEFAULT_MANGLING)+;" $@.gen > $@
+
install_man5: $(MAN5)
$(INSTALL) -d $(MAN5DIR)
$(INSTALL_DATA) $(MAN5) $(MAN5DIR)/
@@ -148,9 +162,10 @@ install_man7: $(MAN7)
$(INSTALL) -d $(MAN7DIR)
$(INSTALL_DATA) $(MAN7) $(MAN7DIR)/
-install_man8: $(MAN8)
+install_man8: $(MAN8) $(MAN8GEN)
$(INSTALL) -d $(MAN8DIR)
$(INSTALL_DATA) $(MAN8) $(MAN8DIR)/
+ $(INSTALL_DATA) $(MAN8GEN) $(MAN8DIR)/
install_lvm2: install_man5 install_man7 install_man8
diff --git a/man/clvmd.8.in b/man/clvmd.8.in
index 9b9310d..21f8c7d 100644
--- a/man/clvmd.8.in
+++ b/man/clvmd.8.in
@@ -154,6 +154,32 @@ This timeout will be ignored if you start \fBclvmd\fP with the \fB\-d\fP.
.br
Display the version of the cluster LVM daemon.
.
+.SH NOTES
+.
+.SS Activation
+.
+In a clustered VG, clvmd is used for activation, and the following values are
+possible with \fBlvchange/vgchange -a\fP:
+.IP \fBy\fP|\fBsy\fP
+clvmd activates the LV in shared mode (with a shared lock),
+allowing multiple nodes to activate the LV concurrently.
+If the LV type prohibits shared access, such as an LV with a snapshot,
+an exclusive lock is automatically used instead.
+clvmd attempts to activate the LV concurrently on all nodes.
+.IP \fBey\fP
+clvmd activates the LV in exclusive mode (with an exclusive lock),
+allowing a single node to activate the LV.
+clvmd attempts to activate the LV concurrently on all nodes, but only
+one will succeed.
+.IP \fBly\fP
+clvmd attempts to activate the LV only on the local node.
+If the LV type allows concurrent access, then shared mode is used,
+otherwise exclusive.
+.IP \fBn\fP
+clvmd deactivates the LV on all nodes.
+.IP \fBln\fP
+clvmd deactivates the LV on the local node.
+.
.SH ENVIRONMENT VARIABLES
.TP
.B LVM_CLVMD_BINARY
diff --git a/man/lvchange.8.des b/man/lvchange.8.des
new file mode 100644
index 0000000..7aa8ce7
--- /dev/null
+++ b/man/lvchange.8.des
@@ -0,0 +1,2 @@
+lvchange changes LV attributes in the VG, changes LV activation in the
+kernel, and includes other utilities for LV maintenance.
diff --git a/man/lvchange.8.end b/man/lvchange.8.end
new file mode 100644
index 0000000..7134e46
--- /dev/null
+++ b/man/lvchange.8.end
@@ -0,0 +1,6 @@
+.SH EXAMPLES
+
+Change LV permission to read-only:
+.sp
+.B lvchange \-pr vg00/lvol1
+
diff --git a/man/lvchange.8.in b/man/lvchange.8.in
deleted file mode 100644
index 8da9f2d..0000000
--- a/man/lvchange.8.in
+++ /dev/null
@@ -1,491 +0,0 @@
-.TH LVCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-
-.de UNITS
-..
-
-.
-.SH NAME
-.
-lvchange \(em change attributes of a logical volume
-.
-.SH SYNOPSIS
-.
-.ad l
-.B lvchange
-.RB [ \-a | \-\-activate
-.RB [ a ][ e | s | l ]{ y | n }]
-.RB [ \-\-activationmode
-.RB { complete | degraded | partial }]
-.RB [ \-\-addtag
-.IR Tag ]
-.RB [ \-K | \-\-ignoreactivationskip ]
-.RB [ \-k | \-\-setactivationskip
-.RB { y | n }]
-.RB [ \-\-alloc
-.IR AllocationPolicy ]
-.RB [ \-A | \-\-autobackup
-.RB { y | n }]
-.RB [ \-\-rebuild
-.IR PhysicalVolume ]
-.RB [ \-\-cachemode
-.RB { passthrough | writeback | writethrough }]
-.RB [ \-\-cachepolicy
-.IR Policy ]
-.RB [ \-\-cachesettings
-.IR Key \fB= Value ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-C | \-\-contiguous
-.RB { y | n }]
-.RB [ \-d | \-\-debug ]
-.RB [ \-\-deltag
-.IR Tag ]
-.RB [ \-\-detachprofile ]
-.RB [ \-\-discards
-.RB { ignore | nopassdown | passdown }]
-.RB [ \-\-errorwhenfull
-.RB { y | n }]
-.RB [ \-h | \-? | \-\-help ]
-.RB \%[ \-\-ignorelockingfailure ]
-.RB \%[ \-\-ignoremonitoring ]
-.RB \%[ \-\-ignoreskippedcluster ]
-.RB \%[ \-\-metadataprofile
-.IR ProfileName ]
-.RB [ \-\-monitor
-.RB { y | n }]
-.RB [ \-\-noudevsync ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-p | \-\-permission
-.RB { r | rw }]
-.RB [ \-M | \-\-persistent
-.RB { y | n }
-.RB [ \-\-major
-.IR Major ]
-.RB [ \-\-minor
-.IR Minor ]]
-.RB [ \-\-poll
-.RB { y | n }]
-.RB [ \-\- [ raid ] maxrecoveryrate
-.IR Rate ]
-.RB [ \-\- [ raid ] minrecoveryrate
-.IR Rate ]
-.RB [ \-\- [ raid ] syncaction
-.RB { check | repair }]
-.RB [ \-\- [ raid ] writebehind
-.IR IOCount ]
-.RB [ \-\- [ raid ] writemostly
-.BR \fIPhysicalVolume [ : { y | n | t }]]
-.RB [ \-r | \-\-readahead
-.RB { \fIReadAheadSectors | auto | none }]
-.RB [ \-\-refresh ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-resync ]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-\-sysinit ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-Z | \-\-zero
-.RB { y | n }]
-.RI [ LogicalVolumePath ...]
-.ad b
-.
-.SH DESCRIPTION
-.
-lvchange allows you to change the attributes of a logical volume
-including making them known to the kernel ready for use.
-.
-.SH OPTIONS
-.
-See \fBlvm\fP(8) for common options.
-.
-.HP
-.BR \-a | \-\-activate
-.RB [ a ][ e | s | l ]{ y | n }
-.br
-Controls the availability of the logical volumes for use.
-Communicates with the kernel device-mapper driver via
-libdevmapper to activate (\fB\-ay\fP) or deactivate (\fB\-an\fP) the
-logical volumes.
-.br
-Activation of a logical volume creates a symbolic link
-\fI/dev/VolumeGroupName/LogicalVolumeName\fP pointing to the device node.
-This link is removed on deactivation.
-All software and scripts should access the device through
-this symbolic link and present this as the name of the device.
-The location and name of the underlying device node may depend on
-the distribution and configuration (e.g. udev) and might change
-from release to release.
-.br
-If autoactivation option is used (\fB\-aay\fP),
-the logical volume is activated only if it matches an item in
-the \fBactivation/auto_activation_volume_list\fP
-set in \fBlvm.conf\fP(5).
-If this list is not set, then all volumes are considered for
-activation. The \fB\-aay\fP option should be also used during system
-boot so it's possible to select which volumes to activate using
-the \fBactivation/auto_activation_volume_list\fP setting.
-.br
-In a clustered VG, clvmd is used for activation, and the
-following options are possible:
-
-With \fB\-aey\fP, clvmd activates the LV in exclusive mode
-(with an exclusive lock), allowing a single node to activate the LV.
-
-With \fB\-asy\fP, clvmd activates the LV in shared mode
-(with a shared lock), allowing multiple nodes to activate the LV concurrently.
-If the LV type prohibits shared access, such as an LV with a snapshot,
-the '\fBs\fP' option is ignored and an exclusive lock is used.
-
-With \fB\-ay\fP (no mode specified), clvmd activates the LV in shared mode
-if the LV type allows concurrent access, such as a linear LV.
-Otherwise, clvmd activates the LV in exclusive mode.
-
-With \fB\-aey\fP, \fB\-asy\fP, and \fB\-ay\fP, clvmd attempts to activate the LV
-on all nodes. If exclusive mode is used, then only one of the
-nodes will be successful.
-
-With \fB\-an\fP, clvmd attempts to deactivate the LV on all nodes.
-
-With \fB\-aly\fP, clvmd activates the LV only on the local node, and \fB\-aln\fP
-deactivates only on the local node. If the LV type allows concurrent
-access, then shared mode is used, otherwise exclusive.
-
-LVs with snapshots are always activated exclusively because they can only
-be used on one node at once.
-
-For local VGs \fB\-ay\fP, \fB\-aey\fP, and \fB\-asy\fP are all equivalent.
-.
-.HP
-.BR \-\-activationmode
-.RB { complete | degraded | partial }
-.br
-The activation mode determines whether logical volumes are allowed to
-activate when there are physical volumes missing (e.g. due to a device
-failure). \fBcomplete\fP is the most restrictive; allowing only those
-logical volumes to be activated that are not affected by the missing
-PVs. \fBdegraded\fP allows RAID logical volumes to be activated even if
-they have PVs missing. (Note that the "\fImirror\fP" segment type is not
-considered a RAID logical volume. The "\fIraid1\fP" segment type should
-be used instead.) Finally, \fBpartial\fP allows any logical volume to
-be activated even if portions are missing due to a missing or failed
-PV. This last option should only be used when performing recovery or
-repair operations. \fBdegraded\fP is the default mode. To change it,
-modify \fBactivation_mode\fP in \fBlvm.conf\fP(5).
-.
-.HP
-.BR \-K | \-\-ignoreactivationskip
-.br
-Ignore the flag to skip Logical Volumes during activation.
-.
-.HP
-.BR \-k | \-\-setactivationskip
-.RB { y | n }
-.br
-Controls whether Logical Volumes are persistently flagged to be
-skipped during activation. By default, thin snapshot volumes are
-flagged for activation skip. To activate such volumes,
-an extra \fB\-\-ignoreactivationskip\fP option must be used.
-The flag is not applied during deactivation. To see whether
-the flag is attached, use \fBlvs\fP(8) command where the state
-of the flag is reported within \fBlv_attr\fP bits.
-.
-.HP
-.BR \-\-cachemode
-.RB { passthrough | writeback | writethrough }
-.br
-Specifying a cache mode determines when the writes to a cache LV
-are considered complete. When \fBwriteback\fP is specified, a write is
-considered complete as soon as it is stored in the cache pool LV.
-If \fBwritethough\fP is specified, a write is considered complete only
-when it has been stored in the cache pool LV and on the origin LV.
-While \fBwritethrough\fP may be slower for writes, it is more
-resilient if something should happen to a device associated with the
-cache pool LV. With \fBpassthrough\fP mode, all reads are served
-from origin LV (all reads miss the cache) and all writes are
-forwarded to the origin LV; additionally, write hits cause cache
-block invalidates. See \fBlvmcache(7)\fP for more details.
-.
-.HP
-.BR \-\-cachepolicy
-.IR Policy ,
-.BR \-\-cachesettings
-.IR Key \fB= Value
-.br
-Only applicable to cached LVs; see also \fBlvmcache(7)\fP. Sets
-the cache policy and its associated tunable settings. In most use-cases,
-default values should be adequate.
-.
-.HP
-.BR \-C | \-\-contiguous
-.RB { y | n }
-.br
-Tries to set or reset the contiguous allocation policy for
-logical volumes. It's only possible to change a non-contiguous
-logical volume's allocation policy to contiguous, if all of the
-allocated physical extents are already contiguous.
-.
-.HP
-.BR \-\-detachprofile
-.br
-Detach any metadata configuration profiles attached to given
-Logical Volumes. See \fBlvm.conf\fP(5) for more information
-about metadata profiles.
-.
-.HP
-.BR \-\-discards
-.RB { ignore | nopassdown | passdown }
-.br
-Set this to \fBignore\fP to ignore any discards received by a
-thin pool Logical Volume. Set to \fBnopassdown\fP to process such
-discards within the thin pool itself and allow the no-longer-needed
-extents to be overwritten by new data. Set to \fBpassdown\fP (the
-default) to process them both within the thin pool itself and to
-pass them down the underlying device.
-.
-.HP
-.BR \-\-errorwhenfull
-.RB { y | n }
-.br
-Sets thin pool behavior when data space is exhaused. See
-.BR lvcreate (8)
-for information.
-.
-.HP
-.BR \-\-ignoremonitoring
-.br
-Make no attempt to interact with dmeventd unless \fB\-\-monitor\fP
-is specified.
-Do not use this if dmeventd is already monitoring a device.
-.
-.HP
-.BR \-\-major
-.IR Major
-.br
-Sets the major number. This option is supported only on older systems
-(kernel version 2.4) and is ignored on modern Linux systems where major
-numbers are dynamically assigned.
-.
-.HP
-.BR \-\-minor
-.IR Minor
-.br
-Set the minor number.
-.
-.HP
-.BR \-\-metadataprofile
-.IR ProfileName
-.br
-Uses and attaches \fIProfileName\fP configuration profile to the logical
-volume metadata. Whenever the logical volume is processed next time,
-the profile is automatically applied. If the volume group has another
-profile attached, the logical volume profile is preferred.
-See \fBlvm.conf\fP(5) for more information about metadata profiles.
-.
-.HP
-.BR \-\-monitor
-.RB { y | n }
-.br
-Start or stop monitoring a mirrored or snapshot logical volume with
-dmeventd, if it is installed.
-If a device used by a monitored mirror reports an I/O error,
-the failure is handled according to
-\%\fBmirror_image_fault_policy\fP and \fBmirror_log_fault_policy\fP
-set in \fBlvm.conf\fP(5).
-.
-.HP
-.BR \-\-noudevsync
-.br
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.
-.HP
-.BR \-p | \-\-permission
-.RB { r | rw }
-.br
-Change access permission to read-only or read/write.
-.
-.HP
-.BR \-M | \-\-persistent
-.RB { y | n }
-.br
-Set to \fBy\fP to make the minor number specified persistent.
-Change of persistent numbers is not supported for pool volumes.
-.
-.HP
-.BR \-\-poll
-.RB { y | n }
-.br
-Without polling a logical volume's backgrounded transformation process
-will never complete. If there is an incomplete pvmove or lvconvert (for
-example, on rebooting after a crash), use \fB\-\-poll y\fP to restart the
-process from its last checkpoint. However, it may not be appropriate to
-immediately poll a logical volume when it is activated, use
-\fB\-\-poll n\fP to defer and then \fB\-\-poll y\fP to restart the process.
-.
-.HP
-.BR \-\- [ raid ] rebuild
-.BR \fIPhysicalVolume
-.br
-Option can be repeated multiple times.
-Selects PhysicalVolume(s) to be rebuild in a RaidLV.
-Use this option instead of
-.BR \-\-resync
-or
-.BR \-\- [ raid ] syncaction
-\fBrepair\fP in case the PVs with corrupted data are known and their data
-should be reconstructed rather than reconstructing default (rotating) data.
-.br
-E.g. in a raid1 mirror, the master leg on /dev/sda may hold corrupt data due
-to a known transient disk error, thus
-.br
-\fBlvchange --rebuild /dev/sda LV\fP
-.br
-will request the master leg to be rebuild rather than rebuilding
-all other legs from the master.
-On a raid5 with rotating data and parity
-.br
-\fBlvchange --rebuild /dev/sda LV\fP
-.br
-will rebuild all data and parity blocks in the stripe on /dev/sda.
-.HP
-.BR \-\- [ raid ] maxrecoveryrate
-.BR \fIRate [ b | B | s | S | k | K | m | M | g | G ]
-.br
-Sets the maximum recovery rate for a RAID logical volume. \fIRate\fP
-is specified as an amount per second for each device in the array.
-If no suffix is given, then KiB/sec/device is assumed. Setting the
-recovery rate to \fB0\fP means it will be unbounded.
-.
-.HP
-.BR \-\- [ raid ] minrecoveryrate
-.BR \fIRate [ b | B | s | S | k | K | m | M | g | G ]
-.br
-Sets the minimum recovery rate for a RAID logical volume. \fIRate\fP
-is specified as an amount per second for each device in the array.
-If no suffix is given, then KiB/sec/device is assumed. Setting the
-recovery rate to \fB0\fP means it will be unbounded.
-.
-.HP
-.BR \-\- [ raid ] syncaction
-.RB { check | repair }
-.br
-This argument is used to initiate various RAID synchronization operations.
-The \fBcheck\fP and \fBrepair\fP options provide a way to check the
-integrity of a RAID logical volume (often referred to as "scrubbing").
-These options cause the RAID logical volume to
-read all of the data and parity blocks in the array and check for any
-discrepancies (e.g. mismatches between mirrors or incorrect parity values).
-If \fBcheck\fP is used, the discrepancies will be counted but not repaired.
-If \fBrepair\fP is used, the discrepancies will be corrected as they are
-encountered. The \fBlvs\fP(8) command can be used to show the number of
-discrepancies found or repaired.
-.
-.HP
-.BR \-\- [ raid ] writebehind
-.IR IOCount
-.br
-Specify the maximum number of outstanding writes that are allowed to
-devices in a RAID1 logical volume that are marked as write-mostly.
-Once this value is exceeded, writes become synchronous (i.e. all writes
-to the constituent devices must complete before the array signals the
-write has completed). Setting the value to zero clears the preference
-and allows the system to choose the value arbitrarily.
-.
-.HP
-.BR \-\- [ raid ] writemostly
-.BR \fIPhysicalVolume [ : { y | n | t }]
-.br
-Mark a device in a RAID1 logical volume as write-mostly. All reads
-to these drives will be avoided unless absolutely necessary. This keeps
-the number of I/Os to the drive to a minimum. The default behavior is to
-set the write-mostly attribute for the specified physical volume in the
-logical volume. It is possible to also remove the write-mostly flag by
-appending a "\fB:n\fP" to the physical volume or to toggle the value by specifying
-"\fB:t\fP". The \fB\-\-writemostly\fP argument can be specified more than one time
-in a single command; making it possible to toggle the write-mostly attributes
-for all the physical volumes in a logical volume at once.
-.
-.HP
-.BR \-r | \-\-readahead
-.RB { \fIReadAheadSectors | auto | none }
-.br
-Set read ahead sector count of this logical volume.
-For volume groups with metadata in lvm1 format, this must
-be a value between 2 and 120 sectors.
-The default value is "\fBauto\fP" which allows the kernel to choose
-a suitable value automatically.
-"\fBnone\fP" is equivalent to specifying zero.
-.
-.HP
-.BR \-\-refresh
-.br
-If the logical volume is active, reload its metadata.
-This is not necessary in normal operation, but may be useful
-if something has gone wrong or if you're doing clustering
-manually without a clustered lock manager.
-.
-.HP
-.BR \-\-resync
-.br
-Forces the complete resynchronization of a mirror. In normal
-circumstances you should not need this option because synchronization
-happens automatically. Data is read from the primary mirror device
-and copied to the others, so this can take a considerable amount of
-time - and during this time you are without a complete redundant copy
-of your data.
-.
-.HP
-.BR \-\-sysinit
-.br
-Indicates that \fBlvchange\fP(8) is being invoked from early system
-initialisation scripts (e.g. rc.sysinit or an initrd),
-before writeable filesystems are available. As such,
-some functionality needs to be disabled and this option
-acts as a shortcut which selects an appropriate set of options. Currently
-this is equivalent to using \fB\-\-ignorelockingfailure\fP,
-\fB\-\-ignoremonitoring\fP, \fB\-\-poll n\fP and setting
-\fBLVM_SUPPRESS_LOCKING_FAILURE_MESSAGES\fP
-environment variable.
-
-If \fB\-\-sysinit\fP is used in conjunction with
-\fBlvmetad\fP(8) enabled and running,
-autoactivation is preferred over manual activation via direct lvchange call.
-Logical volumes are autoactivated according to
-\fBauto_activation_volume_list\fP set in \fBlvm.conf\fP(5).
-.
-.HP
-.BR \-Z | \-\-zero
-.RB { y | n }
-.br
-Set zeroing mode for thin pool. Note: already provisioned blocks from pool
-in non-zero mode are not cleared in unwritten parts when setting zero to
-\fBy\fP.
-.
-.SH ENVIRONMENT VARIABLES
-.
-.TP
-.B LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES
-Suppress locking failure messages.
-.
-.SH Examples
-.
-Changes the permission on volume lvol1 in volume group vg00 to be read-only:
-.sp
-.B lvchange \-pr vg00/lvol1
-.
-.SH SEE ALSO
-.
-.nh
-.BR lvm (8),
-.BR lvmetad (8),
-.BR lvs (8),
-.BR lvcreate (8),
-.BR vgchange (8),
-.BR lvmcache (7),
-.BR lvmthin (7),
-.BR lvm.conf (5)
diff --git a/man/lvconvert.8.des b/man/lvconvert.8.des
new file mode 100644
index 0000000..2aa95a1
--- /dev/null
+++ b/man/lvconvert.8.des
@@ -0,0 +1,32 @@
+lvconvert changes the LV type and includes utilities for LV data
+maintenance. The LV type controls data layout and redundancy.
+The LV type is also called the segment type or segtype.
+
+To display the current LV type, run the command:
+
+.B lvs \-o name,segtype
+.I LV
+
+The
+.B linear
+type is equivalent to the
+.B striped
+type when one stripe exists.
+In that case, the types can sometimes be used interchangably.
+
+In most cases, the
+.B mirror
+type is deprecated and the
+.B raid1
+type should be used. They are both implementations of mirroring.
+
+In some cases, an LV is a single device mapper (dm) layer above physical
+devices. In other cases, hidden LVs (dm devices) are layered between the
+visible LV and physical devices. LVs in the middle layers are called sub LVs.
+A command run on a visible LV sometimes operates on a sub LV rather than
+the specified LV. In other cases, a sub LV must be specified directly on
+the command line.
+
+Sub LVs can be displayed with the command
+.B lvs -a
+
diff --git a/man/lvconvert.8.end b/man/lvconvert.8.end
new file mode 100644
index 0000000..fa8cc1d
--- /dev/null
+++ b/man/lvconvert.8.end
@@ -0,0 +1,95 @@
+.SH EXAMPLES
+
+Convert a linear LV to a two-way mirror LV.
+.br
+.B lvconvert \-\-type mirror \-\-mirrors 1 vg/lvol1
+
+Convert a linear LV to a two-way RAID1 LV.
+.br
+.B lvconvert \-\-type raid1 \-\-mirrors 1 vg/lvol1
+
+Convert a mirror LV to use an in\-memory log.
+.br
+.B lvconvert \-\-mirrorlog core vg/lvol1
+
+Convert a mirror LV to use a disk log.
+.br
+.B lvconvert \-\-mirrorlog disk vg/lvol1
+
+Convert a mirror or raid1 LV to a linear LV.
+.br
+.B lvconvert --type linear vg/lvol1
+
+Convert a mirror LV to a raid1 LV with the same number of images.
+.br
+.B lvconvert \-\-type raid1 vg/lvol1
+
+Convert a linear LV to a two-way mirror LV, allocating new extents from specific
+PV ranges.
+.br
+.B lvconvert \-\-mirrors 1 vg/lvol1 /dev/sda:0\-15 /dev/sdb:0\-15
+
+Convert a mirror LV to a linear LV, freeing physical extents from a specific PV.
+.br
+.B lvconvert \-\-type linear vg/lvol1 /dev/sda
+
+Split one image from a mirror or raid1 LV, making it a new LV.
+.br
+.B lvconvert \-\-splitmirrors 1 \-\-name lv_split vg/lvol1
+
+Split one image from a raid1 LV, and track changes made to the raid1 LV
+while the split image remains detached.
+.br
+.B lvconvert \-\-splitmirrors 1 \-\-trackchanges vg/lvol1
+
+Merge an image (that was previously created with \-\-splitmirrors and
+\-\-trackchanges) back into the original raid1 LV.
+.br
+.B lvconvert \-\-mergemirrors vg/lvol1_rimage_1
+
+Replace PV /dev/sdb1 with PV /dev/sdf1 in a raid1/4/5/6/10 LV.
+.br
+.B lvconvert \-\-replace /dev/sdb1 vg/lvol1 /dev/sdf1
+
+Replace 3 PVs /dev/sd[b-d]1 with PVs /dev/sd[f-h]1 in a raid1 LV.
+.br
+.B lvconvert \-\-replace /dev/sdb1 \-\-replace /dev/sdc1 \-\-replace /dev/sdd1
+.RS
+.B vg/lvol1 /dev/sd[fgh]1
+.RE
+
+Replace the maximum of 2 PVs /dev/sd[bc]1 with PVs /dev/sd[gh]1 in a raid6 LV.
+.br
+.B lvconvert \-\-replace /dev/sdb1 \-\-replace /dev/sdc1 vg/lvol1 /dev/sd[gh]1
+
+Convert an LV into a thin LV in the specified thin pool. The existing LV
+is used as an external read\-only origin for the new thin LV.
+.br
+.B lvconvert \-\-type thin \-\-thinpool vg/tpool1 vg/lvol1
+
+Convert an LV into a thin LV in the specified thin pool. The existing LV
+is used as an external read\-only origin for the new thin LV, and is
+renamed "external".
+.br
+.B lvconvert \-\-type thin \-\-thinpool vg/tpool1
+.RS
+.B \-\-originname external vg/lvol1
+.RE
+
+Convert an LV to a cache pool LV using another specified LV for cache pool
+metadata.
+.br
+.B lvconvert \-\-type cache-pool \-\-poolmetadata vg/poolmeta1 vg/lvol1
+
+Convert an LV to a cache LV using the specified cache pool and chunk size.
+.br
+.B lvconvert \-\-type cache \-\-cachepool vg/cpool1 \-c 128 vg/lvol1
+
+Detach and keep the cache pool from a cache LV.
+.br
+.B lvconvert \-\-splitcache vg/lvol1
+
+Detach and remove the cache pool from a cache LV.
+.br
+.B lvconvert \-\-uncache vg/lvol1
+
diff --git a/man/lvconvert.8.in b/man/lvconvert.8.in
deleted file mode 100644
index 0becc8a..0000000
--- a/man/lvconvert.8.in
+++ /dev/null
@@ -1,1199 +0,0 @@
-.TH LVCONVERT 8 "LVM TOOLS #VERSION#" "Red Hat, Inc" \" -*- nroff -*-
-.SH NAME
-lvconvert \(em change LV type and other utilities
-.
-.SH SYNOPSIS
-
-.B lvconvert
-.RI [ OPTION ]...
-.IR VolumeGroup / LogicalVolume
-
-OPTIONS:
-.br
-.BR \-b ,
-.BR \-\-background
-.br
-.BR \-\-cachepolicy
-.IR Policy
-.br
-.BR \-\-cachepool
-.IR CachePoolLogicalVolume { Name | Path }
-.br
-.BR \-\-cachesettings
-.IB Key = Value
-.br
-.BR \-c ,
-.BR \-\-chunksize
-.BR \fIChunkSize [ b | B | s | S | k | K | m | M | g | G ]
-.br
-.BR \-\-corelog
-.br
-.BR \-\-discards
-.RB { ignore | nopassdown | passdown }
-.br
-.BR \-i ,
-.BR \-\-interval
-.IR Seconds
-.br
-.BR \-\-merge
-.br
-.BR \-\-mirrorlog
-.RB { disk | core | mirrored }
-.br
-.BR \-m ,
-.BR \-\-mirrors
-.IR Number
-.br
-.BR \-n ,
-.BR \-\-name
-.IR Name
-.br
-.BR \-\-noudevsync
-.br
-.BR \-\-originname
-.IR NewExternalOriginVolumeName
-.br
-.BR \-\-poolmetadata
-.IR PoolMetadataLogicalVolume { Name | Path }
-.br
-.BR \-\-poolmetadatasize
-.BR \fIPoolMetadataSize [ b | B | s | S | k | K | m | M | g | G ]
-.br
-.BR \-\-poolmetadataspare
-.RB { y | n }
-.br
-.BR \-r ,
-.BR \-\-readahead
-.RB { \fIReadAheadSectors | auto | none }
-.br
-.BR \-R ,
-.BR \-\-regionsize
-.IR MirrorLogRegionSize
-.br
-.BR \-\-repair
-.br
-.BR \-\-replace
-.IR PhysicalVolume
-.br
-.BR \-\-splitcache
-.br
-.BR \-\-splitmirrors
-.IR Number
-.br
-.BR \-\-splitsnapshot
-.br
-.BR \-\-stripes
-.IR Number
-.br
-.BR \-I ,
-.BR \-\-stripesize
-.IR StripeSize
-.br
-.B \-\-type striped
-.br
-.B \-\-type snapshot
-|
-.B \-\-snapshot
-|
-.B \-s
-.br
-.B \-\-type mirror
-.br
-.B \-\-type raid*
-.br
-.B \-\-type thin
-|
-.B \-\-thin
-|
-.B \-T
-.br
-.B \-\-type cache
-|
-.B \-\-cache
-|
-.B \-H
-.br
-.B \-\-type thin\-pool
-.br
-.B \-\-type cache\-pool
-.br
-.BR \-\-thinpool
-.IR ThinPoolLogicalVolume { Name | Path }
-.br
-.BR \-\-trackchanges
-.br
-.BR \-\-uncache
-.br
-.BR \-Z ,
-.BR \-\-zero
-.RB { y | n }
-.br
-
-Common options:
-.br
-.BR \-A ,
-.BR \-\-alloc
-.IR AllocationPolicy
-.br
-.BR \-f ,
-.BR \-\-force
-.br
-.BR \-\-commandprofile
-.IR ProfileName
-.br
-.BR \-h ,
-.BR \-? ,
-.BR \-\-help
-.br
-.BR \-v ,
-.BR \-\-verbose
-.br
-.BR \-y ,
-.BR \-\-yes
-.br
-.BR \-\-version
-
-
-
-
-.SH DESCRIPTION
-
-lvconvert changes the LV type and includes various LV utilities.
-
-To display the current LV type, run the command:
-
-.B lvs \-o name,segtype
-.IR VG / LV
-
-To change the LV type, run the command:
-
-.B lvconvert \-\-type
-.I NewType
-.IR VG / LV
-
-.SS LV types
-
-The LV type is also called the "segment type" or "segtype".
-
-LVs with the following types can be modified by lvconvert:
-.B striped,
-.B snapshot,
-.B mirror,
-.B raid*,
-.B thin,
-.B cache,
-.B thin\-pool,
-.B cache\-pool.
-
-The specific operations available on each LV type are listed below.
-
-The
-.B linear
-type is equivalent to the
-.B striped
-type when one stripe exists.
-In that case, the types can sometimes be used interchangably.
-
-In most cases, the
-.B mirror
-type is deprecated and the
-.B raid1
-type should be used. They are both implementations of mirroring.
-
-The
-.B raid*
-type refers to one of many raid levels, e.g.
-.B raid1,
-.B raid5.
-
-.SS LV layers
-
-In some cases, an LV is a single device mapper (dm) layer above physical
-devices. In other cases, hidden LVs (dm devices) are layered between the
-visible LV and physical devices. LVs in the middle layers are sometimes
-called sub LVs.
-
-Changing the LV type will often change the composition of sub LVs.
-
-Sub LVs can be displayed with the command
-.B lvs -a.
-
-A command run on a visible LV sometimes operates on a sub LV rather than
-the specified LV. These cases are noted below.
-
-Sometimes a sub LV must be specified directly on the command line, but
-this is a non-standard form. These cases may change in the future to
-avoid the direct use of hidden LVs.
-
-.SH COMMANDS
-
-.SS Operations on a StripedLV with type striped or linear:
-
-\&
-
-.B lvconvert \-\-merge
-VG/StripedLV
-./" FIXME: use --merge-mirror
-.br
-\[bu]
-Merge StripedLV into an LV when it is a previously split mirror.
-.br
-\[bu]
-Options \-\-background, \-\-interval.
-.br
-\[bu]
-See corresponding operation --splitmirrors.
-
-.B lvconvert \-\-type snapshot
-VG/StripedLV VG/SnapshotLV
-.br
-\[bu]
-Recombine StripedLV with SnapshotLV which was previously split.
-.br
-\[bu]
-Options \-\-chunksize, \-\-zero.
-.br
-\[bu]
-See corresponding operation --splitsnapshot.
-
-.B lvconvert \-\-type thin
-VG/StripedLV
-.br
-\[bu]
-Convert StripedLV to type thin with an external origin.
-.br
-\[bu]
-StripedLV becomes a read\-only external origin LV with a new name.
-.br
-\[bu]
-Requires \-\-thinpool to specify the thin pool to use.
-.br
-\[bu]
-Options \-\-originname.
-
-.B lvconvert \-\-type cache
-VG/StripedLV
-.br
-\[bu]
-Convert StripedLV to type cache.
-.br
-\[bu]
-Requires \-\-cachepool to specify the cache pool to use.
-.br
-\[bu]
-Options \-\-cachepolicy, \-\-cachesettings.
-
-.B lvconvert \-\-type thin\-pool
-VG/StripedLV
-.br
-\[bu]
-Convert StripedLV to type thin\-pool.
-.br
-\[bu]
-The StripedLV is used for thin pool data.
-.br
-\[bu]
-Options \-\-chunksize, \-\-discards, \-\-poolmetadata{size,spare},
-.br
- \-\-readahead, \-\-zero.
-
-.B lvconvert \-\-type cache\-pool
-VG/StripedLV
-.br
-\[bu]
-Convert StripedLV to type cache\-pool.
-.br
-\[bu]
-Options \-\-chunksize, \-\-poolmetadata{size,spare}.
-
-.B lvconvert \-\-type mirror
-VG/StripedLV
-.br
-\[bu]
-Convert StripedLV to type mirror.
-.br
-\[bu]
-Requires \-\-mirrors to specify the number of mirrors to use.
-.br
-\[bu]
-Options \-\-mirrorlog, \-\-regionsize.
-
-.B lvconvert \-\-type raid*
-VG/StripedLV
-.br
-\[bu]
-Convert StripedLV to type raid*.
-.br
-\[bu]
-Required options depend on the raid level.
-
-.SS Operations on RaidLV with type raid*:
-
-\&
-
-.B lvconvert \-\-mirrors
-Number
-VG/RaidLV
-.br
-\[bu]
-Change the number of images in raid1 RaidLV.
-
-.B lvconvert \-\-splitmirrors
-Number
-VG/RaidLV
-.br
-\[bu]
-Split images from raid1 RaidLV and use them to create a new LV.
-.br
-\[bu]
-Requires \-\-name for the new LV, or the use of \-\-trackchanges.
-
-.B lvconvert \-\-merge
-VG/RaidLV
-./" FIXME: use --merge-mirror
-.br
-\[bu]
-Merge RaidLV into an LV when it is a previously split mirror.
-.br
-\[bu]
-Options \-\-background, \-\-interval.
-.br
-\[bu]
-See corresponding operation --splitmirrors.
-
-.B lvconvert \-\-repair
-VG/RaidLV
-.br
-\[bu]
-Options \-\-background, \-\-interval.
-.br
-\[bu]
-Replace failed PVs in RaidLV.
-
-.B lvconvert \-\-replace
-PV
-VG/RaidLV
-.br
-\[bu]
-Replace specific PV(s) in a raid* LV with another PV.
-.br
-\[bu]
-The new PV(s) to use can be optionally specified after the LV.
-.br
-\[bu]
-Repeat to replace multiple: \-\-replace PV1 \-\-replace PV2 ...
-
-.B lvconvert \-\-type snapshot
-VG/RaidLV
-VG/SnapshotLV
-.br
-\[bu]
-Combine RaidLV with SnapshotLV that was previously split.
-.br
-\[bu]
-Options \-\-chunksize, \-\-zero.
-.br
-\[bu]
-See corresponding operation \-\-splitsnapshot.
-
-.B lvconvert \-\-type thin
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type thin with an external origin.
-.br
-\[bu]
-RaidLV becomes a read\-only external origin LV with a new name.
-.br
-\[bu]
-Requires \-\-thinpool to specify the thin pool to use.
-.br
-\[bu]
-Options \-\-originname.
-
-.B lvconvert \-\-type cache
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type cache.
-.br
-\[bu]
-Requires \-\-cachepool to specify the cache pool to use.
-.br
-\[bu]
-Options \-\-cachepolicy, \-\-cachesettings.
-
-.B lvconvert \-\-type thin\-pool
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type thin\-pool.
-.br
-\[bu]
-The RaidLV is used for thin pool data.
-.br
-\[bu]
-Options \-\-chunksize, \-\-discards, \-\-poolmetadata{size,spare},
-.br
- \-\-readahead, \-\-zero.
-
-.B lvconvert \-\-type cache\-pool
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type cache\-pool.
-.br
-\[bu]
-Options \-\-chunksize, \-\-poolmetadata{size,spare}.
-
-.B lvconvert \-\-type raid*
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to use a different raid level.
-.br
-\[bu]
-Required options depend on the raid level.
-
-.B lvconvert \-\-type mirror
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type mirror.
-
-.B lvconvert \-\-type striped
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type striped.
-
-.B lvconvert \-\-type linear
-VG/RaidLV
-.br
-\[bu]
-Convert RaidLV to type linear.
-
-.SS Operations on MirrorLV with type mirror:
-
-\&
-
-.B lvconvert \-\-mirrors
-Number
-VG/MirrorLV
-.br
-\[bu]
-Change the number of images in MirrorLV.
-
-.B lvconvert \-\-splitmirrors
-Number
-VG/MirrorLV
-.br
-\[bu]
-Split images from MirrorLV and use them to create a new LV.
-.br
-\[bu]
-Requires \-\-name for the new LV.
-
-.B lvconvert \-\-mirrorlog
-LogType
-VG/MirrorLV
-.br
-\[bu]
-Change the type of log used by MirrorLV.
-
-.B lvconvert \-\-repair
-VG/MirrorLV
-.br
-\[bu]
-Options \-\-background, \-\-interval.
-.br
-\[bu]
-Replace failed PVs in MirrorLV.
-
-.B lvconvert \-\-type linear
-VG/MirrorLV
-.br
-\[bu]
-Convert MirrorLV to type linear.
-
-.B lvconvert \-\-type raid*
-VG/MirrorLV
-.br
-\[bu]
-Convert MirrorLV to type raid*.
-.br
-\[bu]
-Required options depend on the raid level.
-
-.SS Operations on CachePoolLV with type cache\-pool:
-
-\&
-
-.B lvconvert \-\-splitcache
-VG/CachePoolLV
-.br
-\[bu]
-Split the cache LV from CachePoolLV.
-.br
-\[bu]
-Equivalent to --splitcache on CacheLV.
-
-.SS Operations on CacheLV with type cache:
-
-\&
-
-.B lvconvert \-\-splitcache
-VG/CacheLV
-.br
-\[bu]
-Split and keep the cache pool from CacheLV.
-
-.B lvconvert \-\-uncache
-VG/CacheLV
-.br
-\[bu]
-Split and remove the cache pool from CacheLV.
-
-.B lvconvert \-\-splitmirrors
-Number
-VG/CacheLV
-.br
-\[bu]
-Split images from the mirrored origin of CacheLV to create a new LV.
-.br
-\[bu]
-Operates on mirror or raid1 sub LV.
-.br
-\[bu]
-Requires \-\-name for the new LV, or the use of \-\-trackchanges.
-
-.B lvconvert \-\-type thin\-pool
-VG/CacheLV
-.br
-\[bu]
-Convert CacheLV to type thin-pool.
-.br
-\[bu]
-The CacheLV is used for thin pool data.
-.br
-\[bu]
-Options \-\-chunksize, \-\-discards, \-\-poolmetadata{size,spare},
-.br
- \-\-readahead, \-\-zero.
-
-
-.SS Operations on ThinPoolLV with type thin\-pool:
-
-\&
-
-.B lvconvert \-\-splitcache
-VG/ThinPoolLV
-.br
-\[bu]
-Split and keep the cache pool from the data portion of ThinPoolLV.
-.br
-\[bu]
-Operates on the data sub LV of the thin pool LV.
-.br
-\[bu]
-The data sub LV of the thin pool must be a cache LV.
-
-.B lvconvert \-\-uncache
-VG/ThinPoolLV
-.br
-\[bu]
-Split and remove the cache pool from the data portion of ThinPoolLV.
-.br
-\[bu]
-Operates on the data sub LV of the thin pool LV.
-.br
-\[bu]
-The data sub LV of the thin pool must be a cache LV.
-
-.B lvconvert \-\-type cache
-VG/ThinPoolLV
-.br
-\[bu]
-Convert the data portion of ThinPoolLV to type cache.
-.br
-\[bu]
-Requires \-\-cachepool to specify the cache pool to use.
-.br
-\[bu]
-Operates on the data sub LV of the thin pool LV.
-.br
-\[bu]
-Options \-\-cachepolicy, \-\-cachesettings.
-
-.B lvconvert \-\-repair
-VG/ThinPoolLV
-.br
-\[bu]
-Repair ThinPoolLV.
-
-.SS Operations on ThinLV with type thin:
-
-\&
-
-.B lvconvert \-\-merge
-VG/ThinLV
-./" FIXME: use --merge-snapshot
-.br
-\[bu]
-Merge ThinLV into its origin LV.
-.br
-\[bu]
-ThinLV must have been created as a snapshot of another thin LV.
-.br
-\[bu]
-Options \-\-background, \-\-interval.
-
-.SS Operations on SnapshotLV with type snapshot:
-
-\&
-
-.B lvconvert \-\-splitsnapshot
-VG/SnapshotLV
-.br
-\[bu]
-Separate COW snapshot SnapshotLV from its origin LV.
-
-.B lvconvert \-\-merge
-VG/SnapshotLV
-./" FIXME: use --merge-snapshot
-.br
-\[bu]
-Merge COW snapshot SnapshotLV into its origin.
-.br
-\[bu]
-Options \-\-background, \-\-interval.
-
-.SH OPTIONS
-.
-See \fBlvm\fP(8) for common options.
-.br
-.
-.HP
-.BR \-b ,
-.BR \-\-background
-.br
-If the operation requires polling, this option causes the command to
-return before the operation is complete, and polling is done in the
-background.
-.
-.HP
-.BR \-\-cachepolicy
-.IR Policy
-.br
-Specifies the cache policy for a cache LV. Also see
-.BR lvmcache (7).
-.
-.HP
-.BR \-\-cachepool
-.IR CachePoolLogicalVolume { Name | Path }
-.br
-Specifies the cache pool to use when converting an LV to a cache LV. If
-CachePoolLogicalVolume is not yet a cache pool, the command will attempt
-to convert it into a cache pool prior to the cache LV conversion.
-Also see
-.BR lvmcache (7).
-.
-.HP
-.BR \-\-cachesettings
-.IB Key = Value
-.br
-Specifies tunable values for a cache LV. (The default values should
-usually be adequate.) The special string value \fBdefault\fP switches
-settings back to their default kernel values and removes them from the
-list of settings stored in LVM metadata.
-Also see
-.BR lvmcache (7).
-.
-.HP
-.BR \-c ,
-.BR \-\-chunksize
-.BR \fIChunkSize [ b | B | s | S | k | K | m | M | g | G ]
-.br
-Sets the chunk size for a snapshot, cache pool or thin pool.
-The default unit is in kilobytes.
-.sp
-For snapshots, the value must be a power of 2 between 4KiB and 512KiB
-and the default value is 4.
-.sp
-For a cache pool the value must be between 32KiB and 1GiB and
-the default value is 64.
-.sp
-For a thin pool the value must be between 64KiB and
-1GiB and the default value starts with 64 and scales
-up to fit the pool metadata size within 128MiB,
-if the pool metadata size is not specified.
-The value must be a multiple of 64KiB.
-(Early kernel support until thin target version 1.4 required the value
-to be a power of 2. Discards were not supported for non-power of 2 values
-until thin target version 1.5.)
-.
-.HP
-.BR \-\-corelog
-.br
-Specifies or changes the log type for a mirror LV.
-It is an alias for \fB\-\-mirrorlog core\fP.
-(This option does not apply to the \fBraid1\fP LV type.)
-.
-.HP
-.BR \-\-discards
-.RB { ignore | nopassdown | passdown }
-.br
-Specifies if discards will be processed by the thin layer in the
-kernel and passed down to the Physical Volume. This applies only
-to thin pools. The default is \fBpassdown\fP.
-Also see
-.BR lvmthin (7).
-.
-.HP
-.BR \-H ,
-.BR \-\-cache
-.br
-Alias for
-.B \-\-type cache.
-See COMMANDS description for
-.br
-.B lvconvert \-\-type cache.
-.
-.HP
-.BR \-i ,
-.BR \-\-interval
-.IR Seconds
-.br
-Report progress as a percentage at regular intervals.
-.
-.HP
-.BR \-\-merge
-.br
-Merges a snapshot that was split from an origin LV using
-\fB\-\-splitsnapshot\fP, back into the origin LV.
-
-Merges a raid1 image that was split from a raid1 LV using
-\fB\-\-splitsnapshot\fP and \fB\-\-trackchanges\fP, back into
-the original raid1 LV.
-
-To check if the kernel supports the snapshot merge feature, look for
-"snapshot\-merge" in the output of \fBdmsetup targets\fP.
-
-When merging a snapshot, if both the origin and snapshot LVs are not open,
-the merge will start immediately. Otherwise, the merge will start the
-first time either the origin or snapshot LV are activated and both are
-closed. Merging a snapshot into an origin that cannot be closed, for
-example a root filesystem, is deferred until the next time the origin
-volume is activated. When merging starts, the resulting LV will have the
-origin's name, minor number and UUID. While the merge is in progress,
-reads or writes to the origin appear as being directed to the snapshot
-being merged. When the merge finishes, the merged snapshot is removed.
-Multiple snapshots may be specified on the command line or a @tag may be
-used to specify multiple snapshots be merged to their respective origin.
-.
-.HP
-.BR \-\-mirrorlog
-.RB { disk | core | mirrored }
-.br
-Specifies or changes the log type for a mirror LV.
-The default is \fBdisk\fP, which is persistent and requires
-a small amount of storage space, usually on a separate device
-from the data being mirrored.
-\fBCore\fP may be useful for short-lived mirrors. It means the mirror is
-regenerated by copying the data from the first device again every
-time the device is activated - e.g. possibly after every reboot.
-Using \fBmirrored\fP will create a persistent log that is itself mirrored.
-(This option does not apply to the \fBraid1\fP LV type.)
-.
-.HP
-.BR \-m ,
-.BR \-\-mirrors
-.IR Number
-.br
-Specifies the number mirror images in addition to the original LV image,
-e.g. \fB\-\-mirrors 1\fP means two copies of the data, the original and
-one mirror image.
-
-The current maximum is 9 providing 10 raid1 images.
-
-This option is required when converting an LV to a \fBraid1\fP or
-\fBmirror\fP LV.
-
-This option can be used alone to change the number of mirror images in an
-existing \fBraid1\fP or \fBmirror\fP LV.
-
-The special case \fB\-\-mirrors 0\fP has been used historically to
-indicate a linear LV with no mirror images.
-.
-.HP
-.BR \-n ,
-.BR \-\-name
-.IR Name
-.br
-Specifies the name to use when the command is creating a new LV, e.g.
-.B \-\-splitmirrors.
-.
-.HP
-.BR \-\-noudevsync
-.br
-Disables udev synchronisation. The process will not wait for notification
-from udev. It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running or has
-rules that ignore the devices LVM creates.
-.
-.HP
-.BR \-\-originname
-.IR NewExternalOriginVolumeName
-.br
-Specifies the name to use for the external origin LV when converting an LV
-to a thin LV. The LV being converted becomes a read\-only external origin
-with this name.
-.br
-Without this option, the default name of "lvol<n>" will be generated where
-<n> is the LVM internal number of the LV.
-.br
-.
-.\" .HP
-.\" .BR \-\-pooldatasize
-.\" .IR PoolDataVolumeSize [ \fBbBsSkKmMgGtTpPeE ]
-.\" .br
-.\" Sets the size of pool's data logical volume.
-.\" The option \fB\-\-size\fP could be still used with thin pools.
-.
-.HP
-.BR \-\-poolmetadata
-.IR PoolMetadataLogicalVolume { Name | Path }
-.br
-Specifies the LV to use for thin pool metadata when converting an LV to a
-thin pool LV.
-.br
-Specifies the LV to use for cache pool metadata when converting an LV to a
-cache pool LV.
-.br
-The size should be between 2MiB and 16GiB.
-.br
-(This option can also be used when a thin pool or cache pool are created
-as an auxiliary operation within a different command.)
-Also see
-.BR lvmthin (7),
-and
-.BR lvmcache (7).
-.
-.HP
-.BR \-\-poolmetadatasize
-.BR \fIPoolMetadataSize [ b | B | s | S | k | K | m | M | g | G ]
-.br
-Specifies the size of a cache pool metadata LV or a thin pool metadata LV.
-This is used if a command creates a pool metadata LV automatically as part
-of the operation. This option is not used when an existing LV is
-specified as the pool metadata LV, i.e. \fB\-\-poolmetadata\fP.
-The default unit is megabytes.
-Also see
-.BR lvmthin (7),
-and
-.BR lvmcache (7).
-.
-.HP
-.BR \-\-poolmetadataspare
-.RB { y | n }
-.br
-Specifies if a spare pool metadata LV should be created.
-A spare pool metadata LV will be used for pool repair.
-Only one spare pool metadata LV is maintained within a VG, with the size
-of the largest existing pool metadata LV.
-The default is \fBy\fPes.
-.
-.HP
-.BR \-r ,
-.BR \-\-readahead
-.RB { \fIReadAheadSectors | auto | none }
-.br
-Specifies the read ahead sector count of a thin pool metadata LV.
-The default value is \fBauto\fP which allows the kernel to choose
-a suitable value automatically.
-\fBNone\fP is equivalent to specifying zero.
-.
-.HP
-.BR \-R ,
-.BR \-\-regionsize
-.IR MirrorLogRegionSize
-.br
-A mirror LV is divided into regions of this size (in MB), and the mirror
-log uses this granularity to track which regions are in sync.
-(This option does not apply to the \fBraid1\fP LV type.)
-.
-.HP
-.BR \-\-repair
-.br
-Replaces failed PVs in a raid1 or mirror LV with other PVs available in
-the VG. By default, the original number of mirror images will be restored
-if possible. Specify \fB\-y\fP on the command line to skip the prompts.
-Use \fB\-f\fP if you do not want any replacement. You may use
-\fB\-\-use\-policies\fP to use the device replacement policy specified in
-\fBlvm.conf\fP(5), see \fBactivation/mirror_log_fault_policy\fP or
-\fBactivation/mirror_device_fault_policy\fP.
-
-When used with a thin pool LV, this option automates the use of the
-\fBthin_repair\fP(8) tool on the thin pool. This repairs a very limitted
-number of problems. Only inactive thin pools can be repaired. There is
-no validation of metadata between kernel and LVM. This requires further
-manual work. After successfull repair the old unmodified metadata are
-still available in "<pool>_meta<n>" LV.
-Also see
-.BR lvmthin (7).
-.
-.HP
-.BR \-\-replace
-.IR PhysicalVolume
-.br
-Remove the specified device \fIPhysicalVolume\fP and replace it with one
-that is available in the VG, or from a specific list of PVs specified on
-the command line following the LV name. This option may be repeated multiple
-times depending on the RaidLV type.
-.
-.HP
-.BR \-s ,
-.BR \-\-snapshot
-.br
-Alias for
-.B \-\-type snapshot.
-See COMMANDS description for
-.br
-.B lvconvert \-\-type snapshot.
-.HP
-.BR \-\-split
-.br
-Separates \fISplitableLogicalVolume\fP.
-This option tries to detect the necessary split operation from its arguments.
-Avoid using this option and use one of the following instead:
-.B \-\-splitcache, \-\-splitmirrors, \-\-splitsnapshot.
-.
-.HP
-.BR \-\-splitcache
-.br
-Separates a cache pool from a cache LV, and keeps the unused cache pool
-LV. Before the separation, the cache is flushed. See similar option
-.B \-\-uncache.
-Also see
-.BR lvmcache (7).
-.
-.HP
-.BR \-\-splitmirrors
-.IR Number
-.br
-Splits the specified number of images from a \fBraid1\fP or \fBmirror\fP
-LV and uses them to create a new LV.
-
-If \fB\-\-trackchanges\fP is also specified, changes to the raid1 LV are
-tracked while the split LV remains detached.
-.B lvconvert \-\-merge
-can be used to recombine the split images with the original raid1 LV.
-
-A name can be specified for the new LV with \fB\-\-name\fP (a name is
-required without \fB\-\-trackchanges\fP).
-.
-.HP
-.BR \-\-splitsnapshot
-.br
-Separates a COW snapshot from its origin LV. The LV that is split off
-contains the chunks that differ from the origin LV along with metadata
-describing them. This LV can be wiped and then destroyed with lvremove.
-See corresponding operation
-.B lvconvert \-\-type snapshot.
-.
-.HP
-.BR \-\-stripes
-.IR Number
-.br
-Specifies the number of stripes in a striped LV. This is the number of
-physical volumes (devices) that a striped LV is spread across. Data that
-appears sequential in the LV is spread across multiple devices in units of
-the stripe size (see \fB\-\-stripesize\fP). This does not apply to
-existing allocated space, only newly allocated space can be striped.
-.
-.HP
-.BR \-I ,
-.BR \-\-stripesize
-.IR StripeSize
-.br
-Specifies the stripe size in kilobytes for a striped LV. The stripe size
-is the number of kilobytes written to each stripe, i.e. to one device,
-before writing to the next stripe/device. StripeSize must be a power of 2
-and cannot exceed the VG physical extent (PE) size.
-.
-.HP
-.BR \-\-type
-.IR SegmentType
-.br
-Converts an LV from one segment type to another.
-See COMMANDS section for a description of converting between each type.
-.
-.HP
-.BR \-\-thinpool
-.IR ThinPoolLogicalVolume { Name | Path }
-.br
-Specifies the thin pool to use when converting an LV to a thin LV. If
-ThinPoolLogicalVolume is not yet a thin pool, the command will attempt to
-convert it to a thin pool prior to the thin LV conversion.
-Also see
-.BR lvmthin (7).
-.
-.HP
-.BR \-\-trackchanges
-.br
-Can be used with \fB\-\-splitmirrors\fP on a raid1 LV. This causes
-changes to the original raid1 LV to be tracked while the split images
-remain detached. This allows the read\-only detached image(s) to be
-merged efficiently back into the raid1 LV later. Only the regions with
-changed data are resynchronized during merge. (This option only applies
-to the \fBraid1\fP LV type.)
-.
-.HP
-.BR \-T ,
-.BR \-\-thin
-.br
-Alias for
-.B \-\-type thin.
-See COMMANDS description for
-.br
-.B lvconvert \-\-type thin.
-.
-.HP
-.BR \-\-uncache
-.br
-Separates a cache pool from a cache LV, and removes the unused cache pool
-LV. Before the separation, the cache is flushed. See similar option
-.B \-\-splitcache.
-Also see
-.BR lvmcache (7).
-.
-.HP
-.BR \-Z ,
-.BR \-\-zero
-.RB { y | n }
-.br
-For snapshots, this controls zeroing of the first 4KiB of data in the
-snapshot. If the LV is read\-only, the snapshot will not be zeroed.
-
-For thin pools, this controls zeroing of provisioned blocks.
-Provisioning of large zeroed chunks negatively impacts performance.
-Also see
-.BR lvmthin (7).
-.
-
-.SH Examples
-.
-Convert a linear LV to a two-way mirror LV:
-.br
-.B lvconvert \-\-type mirror \-\-mirrors 1 vg/lvol1
-
-Convert a linear LV to a two-way RAID1 LV:
-.br
-.B lvconvert \-\-type raid1 \-\-mirrors 1 vg/lvol1
-
-Convert a mirror LV to use an in\-memory log:
-.br
-.B lvconvert \-\-mirrorlog core vg/lvol1
-
-Convert a mirror LV to use a disk log:
-.br
-.B lvconvert \-\-mirrorlog disk vg/lvol1
-
-Convert a mirror or raid1 LV to a linear LV:
-.br
-.B lvconvert --type linear vg/lvol1
-
-Convert a mirror LV to a raid1 LV with the same number of images:
-.br
-.B lvconvert \-\-type raid1 vg/lvol1
-
-./" Split and merge a COW snapshot:
-./" TODO
-Convert a linear LV to a two-way mirror LV, allocating new extents from specific
-PV ranges:
-.br
-.B lvconvert \-\-mirrors 1 vg/lvol1 /dev/sda:0\-15 /dev/sdb:0\-15
-
-Convert a mirror LV to a linear LV, freeing physical extents from a specific PV:
-.br
-.B lvconvert \-\-type linear vg/lvol1 /dev/sda
-
-Split one image from a mirror or raid1 LV, making it a new LV:
-.br
-.B lvconvert \-\-splitmirrors 1 \-\-name lv_split vg/lvol1
-
-Split one image from a raid1 LV, and track changes made to the raid1 LV
-while the split image remains detached:
-.br
-.B lvconvert \-\-splitmirrors 1 \-\-trackchanges vg/lvol1
-
-Merge an image (that was previously created with \-\-splitmirrors and
-\-\-trackchanges) back into the original raid1 LV:
-.br
-.B lvconvert \-\-merge vg/lvol1_rimage_1
-./" FIXME: use merge-mirror
-
-Replace PV /dev/sdb1 with PV /dev/sdf1 in a raid1/4/5/6/10 LV:
-.br
-.B lvconvert \-\-replace /dev/sdb1 vg/lvol1 /dev/sdf1
-
-Replace 3 PVs /dev/sd[b-d]1 with PVs /dev/sd[f-h]1 in a raid1 LV:
-.br
-.B lvconvert \-\-replace /dev/sdb1 \-\-replace /dev/sdc1 \-\-replace /dev/sdd1
-.RS
-.B vg/lvol1 /dev/sd[fgh]1
-.RE
-
-Replace the maximum of 2 PVs /dev/sd[bc]1 with PVs /dev/sd[gh]1 in a raid6 LV:
-.br
-.B lvconvert \-\-replace /dev/sdb1 \-\-replace /dev/sdc1 vg/lvol1 /dev/sd[gh]1
-
-Convert an LV into a thin LV in the specified thin pool. The existing LV
-is used as an external read\-only origin for the new thin LV.
-.br
-.B lvconvert \-\-type thin \-\-thinpool vg/tpool1 vg/lvol1
-
-Convert an LV into a thin LV in the specified thin pool. The existing LV
-is used as an external read\-only origin for the new thin LV, and is
-renamed "external":
-.br
-.B lvconvert \-\-type thin \-\-thinpool vg/tpool1
-.RS
-.B \-\-originname external vg/lvol1
-.RE
-
-Convert an LV to a cache pool LV using another specified LV for cache pool
-metadata:
-.br
-.B lvconvert \-\-type cache-pool \-\-poolmetadata vg/poolmeta1 vg/lvol1
-
-Convert an LV to a cache LV using the specified cache pool and chunk size:
-.br
-.B lvconvert \-\-type cache \-\-cachepool vg/cpool1 \-c 128 vg/lvol1
-
-Detach and keep the cache pool from a cache LV:
-.br
-.B lvconvert \-\-splitcache vg/lvol1
-
-Detach and remove the cache pool from a cache LV:
-.br
-.B lvconvert \-\-uncache vg/lvol1
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvm.conf (5),
-.BR lvmcache (7),
-.BR lvmthin (7),
-.BR lvdisplay (8),
-.BR lvextend (8),
-.BR lvreduce (8),
-.BR lvremove (8),
-.BR lvrename (8),
-.BR lvscan (8),
-.BR vgcreate (8),
-.BR cache_dump (8),
-.BR cache_repair (8),
-.BR cache_restore (8),
-.BR thin_dump (8),
-.BR thin_repair (8),
-.BR thin_restore (8)
diff --git a/man/lvcreate.8.des b/man/lvcreate.8.des
new file mode 100644
index 0000000..e18affe
--- /dev/null
+++ b/man/lvcreate.8.des
@@ -0,0 +1,28 @@
+lvcreate creates a new LV in a VG. For standard LVs, this requires
+allocating logical extents from the VG's free physical extents. If there
+is not enough free space, then the VG can be extended (see
+\fBvgextend\fP(8)) with other PVs, or existing LVs can be reduced or
+removed (see \fBlvremove\fP, \fBlvreduce\fP.)
+
+To control which PVs a new LV will use, specify one or more PVs as
+position args at the end of the command line. lvcreate will allocate
+physical extents only from the specified PVs.
+
+lvcreate can also create snapshots of existing LVs, e.g. for backup
+purposes. The data in a new snapshot LV represents the content of the
+original LV from the time the snapshot was created.
+
+RAID LVs can be created by specifying an LV type when creating the LV (see
+\fBlvmraid\fP(7)). Different RAID levels require different numbers of
+unique PVs be available in the VG for allocation.
+
+Thin pools (for thin provisioning) and cache pools (for caching) are
+represented by special LVs with types thin-pool and cache-pool (see
+\fBlvmthin\fP(7) and \fBlvmcache\fP(7)). The pool LVs are not usable as
+standard block devices, but the LV names act references to the pools.
+
+Thin LVs are thinly provisioned from a thin pool, and are created with a
+virtual size rather than a physical size. A cache LV is the combination of
+a standard LV with a cache pool, used to cache active portions of the LV
+to improve performance.
+
diff --git a/man/lvcreate.8.end b/man/lvcreate.8.end
new file mode 100644
index 0000000..74ae599
--- /dev/null
+++ b/man/lvcreate.8.end
@@ -0,0 +1,98 @@
+.SH EXAMPLES
+
+Create a striped LV with 3 stripes, a stripe size of 8KiB and a size of 100MiB.
+The LV name is chosen by lvcreate.
+.br
+.B lvcreate \-i 3 \-I 8 \-L 100m vg00
+
+Create a raid1 LV with two images, and a useable size of 500 MiB. This
+operation requires two devices, one for each mirror image. RAID metadata
+(superblock and bitmap) is also included on the two devices.
+.br
+.B lvcreate \-\-type raid1 \-m1 \-L 500m \-n mylv vg00
+
+Create a mirror LV with two images, and a useable size of 500 MiB.
+This operation requires three devices: two for mirror images and
+one for a disk log.
+.br
+.B lvcreate \-\-type mirror \-m1 \-L 500m \-n mylv vg00
+
+Create a mirror LV with 2 images, and a useable size of 500 MiB.
+This operation requires 2 devices because the log is in memory.
+.br
+.B lvcreate \-\-type mirror \-m1 \-\-mirrorlog core \-L 500m \-n mylv vg00
+
+Create a copy\-on\-write snapshot of an LV:
+.br
+.B lvcreate \-\-snapshot \-\-size 100m \-\-name mysnap vg00/mylv
+
+Create a copy\-on\-write snapshot with a size sufficient
+for overwriting 20% of the size of the original LV.
+.br
+.B lvcreate \-s \-l 20%ORIGIN \-n mysnap vg00/mylv
+
+Create a sparse LV with 1TiB of virtual space, and actual space just under
+100MiB.
+.br
+.B lvcreate \-\-snapshot \-\-virtualsize 1t \-\-size 100m \-\-name mylv vg00
+
+Create a linear LV with a usable size of 64MiB on specific physical extents.
+.br
+.B lvcreate \-L 64m \-n mylv vg00 /dev/sda:0\-7 /dev/sdb:0\-7
+
+Create a RAID5 LV with a usable size of 5GiB, 3 stripes, a stripe size of
+64KiB, using a total of 4 devices (including one for parity).
+.br
+.B lvcreate \-\-type raid5 \-L 5G \-i 3 \-I 64 \-n mylv vg00
+
+Create a RAID5 LV using all of the free space in the VG and spanning all the
+PVs in the VG (note that the command will fail if there are more than 8 PVs in
+the VG, in which case \fB\-i 7\fP must be used to get to the current maximum of
+8 devices including parity for RaidLVs).
+.br
+.B lvcreate \-\-config allocation/raid_stripe_all_devices=1
+.RS
+.B \-\-type raid5 \-l 100%FREE \-n mylv vg00
+.RE
+
+Create RAID10 LV with a usable size of 5GiB, using 2 stripes, each on
+a two-image mirror. (Note that the \fB-i\fP and \fB-m\fP arguments behave
+differently:
+\fB-i\fP specifies the total number of stripes,
+but \fB-m\fP specifies the number of images in addition
+to the first image).
+.br
+.B lvcreate \-\-type raid10 \-L 5G \-i 2 \-m 1 \-n mylv vg00
+
+Create a 1TiB thin LV, first creating a new thin pool for it, where
+the thin pool has 100MiB of space, uses 2 stripes, has a 64KiB stripe
+size, and 256KiB chunk size.
+.br
+.B lvcreate \-\-type thin \-\-name mylv \-\-thinpool mypool
+.RS
+.B \-V 1t \-L 100m \-i 2 \-I 64 \-c 256 vg00
+.RE
+
+Create a thin snapshot of a thin LV (the size option must not be
+used, otherwise a copy-on-write snapshot would be created).
+.br
+.B lvcreate \-\-snapshot \-\-name mysnap vg00/thinvol
+
+Create a thin snapshot of the read-only inactive LV named "origin"
+which becomes an external origin for the thin snapshot LV.
+.br
+.B lvcreate \-\-snapshot \-\-name mysnap \-\-thinpool mypool vg00/origin
+
+Create a cache pool from a fast physical device. The cache pool can
+then be used to cache an LV.
+.br
+.B lvcreate \-\-type cache-pool \-L 1G \-n my_cpool vg00 /dev/fast1
+
+Create a cache LV, first creating a new origin LV on a slow physical device,
+then combining the new origin LV with an existing cache pool.
+.br
+.B lvcreate \-\-type cache \-\-cachepool my_cpool
+.RS
+.B \-L 100G \-n mylv vg00 /dev/slow1
+.RE
+
diff --git a/man/lvcreate.8.in b/man/lvcreate.8.in
deleted file mode 100644
index 84afbda..0000000
--- a/man/lvcreate.8.in
+++ /dev/null
@@ -1,914 +0,0 @@
-.TH LVCREATE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.
-.\" Use 1st. parameter with \% to fix 'man2html' rendeing on same line!
-.de SIZE_G
-. IR \\$1 \c
-. RB [ b | B | s | S | k | K | m | M | g | G ]
-..
-.de SIZE_E
-. IR \\$1 \c
-. RB [ b | B | s | S | k | K | m | M | \c
-. BR g | G | t | T | p | P | e | E ]
-..
-.
-.SH NAME
-.
-lvcreate \- create a logical volume in an existing volume group
-.
-.SH SYNOPSIS
-.
-.ad l
-.B lvcreate
-.RB [ \-a | \-\-activate
-.RB [ a ][ e | l | s ]{ y | n }]
-.RB [ \-\-addtag
-.IR Tag ]
-.RB [ \-\-alloc
-.IR Allocation\%Policy ]
-.RB [ \-A | \-\-autobackup
-.RB { y | n }]
-.RB [ \-H | \-\-cache ]
-.RB [ \-\-cachemode
-.RB { passthrough | writeback | writethrough }]
-.RB [ \-\-cachepolicy
-.IR Policy ]
-.RB \%[ \-\-cachepool
-.IR CachePoolLogicalVolume ]
-.RB [ \-\-cachesettings
-.IR Key \fB= Value ]
-.RB [ \-c | \-\-chunksize
-.IR ChunkSize ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB \%[ \-C | \-\-contiguous
-.RB { y | n }]
-.RB [ \-d | \-\-debug ]
-.RB [ \-\-discards
-.RB \%{ ignore | nopassdown | passdown }]
-.RB [ \-\-errorwhenfull
-.RB { y | n }]
-.RB [{ \-l | \-\-extents
-.BR \fILogicalExtents\%Number [ % { FREE | PVS | VG }]
-.RB |
-.BR \-L | \-\-size
-.BR \fILogicalVolumeSize }
-.RB [ \-i | \-\-stripes
-.IR Stripes
-.RB [ \-I | \-\-stripesize
-.IR StripeSize ]]]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-K | \-\-ignoreactivationskip ]
-.RB [ \-\-ignoremonitoring ]
-.RB [ \-\-minor
-.IR Minor
-.RB [ \-j | \-\-major
-.IR Major ]]
-.RB [ \-\-metadataprofile
-.IR Profile\%Name ]
-.RB [ \-m | \-\-mirrors
-.IR Mirrors
-.RB [ \-\-corelog | \-\-mirrorlog
-.RB { disk | core | mirrored }]
-.RB [ \-\-nosync ]
-.RB [ \-R | \-\-regionsize
-.BR \fIMirrorLogRegionSize ]]
-.RB [ \-\-monitor
-.RB { y | n }]
-.RB [ \-n | \-\-name
-.IR Logical\%Volume ]
-.RB [ \-\-noudevsync ]
-.RB [ \-p | \-\-permission
-.RB { r | rw }]
-.RB [ \-M | \-\-persistent
-.RB { y | n }]
-.\" .RB [ \-\-pooldatasize
-.\" .I DataVolumeSize
-.RB \%[ \-\-poolmetadatasize
-.IR MetadataVolumeSize ]
-.RB [ \-\-poolmetadataspare
-.RB { y | n }]
-.RB [ \-\- [ raid ] maxrecoveryrate
-.IR Rate ]
-.RB [ \-\- [ raid ] minrecoveryrate
-.IR Rate ]
-.RB [ \-r | \-\-readahead
-.RB { \fIReadAheadSectors | auto | none }]
-.RB [ \-\-reportformat
-.RB {basic | json}]
-.RB \%[ \-k | \-\-setactivationskip
-.RB { y | n }]
-.RB [ \-s | \-\-snapshot ]
-.RB [ \-V | \-\-virtualsize
-.IR VirtualSize ]
-.RB [ \-t | \-\-test ]
-.RB [ \-T | \-\-thin ]
-.RB [ \-\-thinpool
-.IR ThinPoolLogicalVolume ]
-.RB [ \-\-type
-.IR SegmentType ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-W | \-\-wipesignatures
-.RB { y | n }]
-.RB [ \-Z | \-\-zero
-.RB { y | n }]
-.RI [ VolumeGroup
-.RI |
-.RI \%{ ExternalOrigin | Origin | Pool } LogicalVolume
-.RI \%[ PhysicalVolumePath [ \fB: \fIPE \fR[ \fB\- PE ]]...]]
-.LP
-.B lvcreate
-.RB [ \-l | \-\-extents
-.BR \fILogicalExtentsNumber [ % { FREE | ORIGIN | PVS | VG }]
-|
-.BR \-L | \-\-size
-.\" | \-\-pooldatasize
-.IR LogicalVolumeSize ]
-.RB [ \-c | \-\-chunksize
-.IR ChunkSize ]
-.RB \%[ \-\-commandprofile
-.IR Profile\%Name ]
-.RB [ \-\-noudevsync ]
-.RB [ \-\-ignoremonitoring ]
-.RB [ \-\-metadataprofile
-.IR Profile\%Name ]
-.RB \%[ \-\-monitor
-.RB { y | n }]
-.RB [ \-n | \-\-name
-.IR SnapshotLogicalVolumeName ]
-.RB [ \-\-reportformat
-.RB {basic | json}]
-.BR \-s | \-\-snapshot | \-H | \-\-cache
-.RI \%{[ VolumeGroup \fB/\fP] OriginalLogicalVolume
-.RB \%[ \-V | \-\-virtualsize
-.IR VirtualSize ]}
-.ad b
-.
-.SH DESCRIPTION
-.
-lvcreate creates a new logical volume in a volume group (see
-.BR vgcreate "(8), " vgchange (8))
-by allocating logical extents from the free physical extent pool
-of that volume group. If there are not enough free physical extents then
-the volume group can be extended (see
-.BR vgextend (8))
-with other physical volumes or by reducing existing logical volumes
-of this volume group in size (see
-.BR lvreduce (8)).
-If you specify one or more PhysicalVolumes, allocation of physical
-extents will be restricted to these volumes.
-.br
-.br
-The second form supports the creation of snapshot logical volumes which
-keep the contents of the original logical volume for backup purposes.
-.
-.SH OPTIONS
-.
-See
-.BR lvm (8)
-for common options.
-.
-.HP
-.BR \-a | \-\-activate
-.RB [ a ][ l | e | s ]{ y | n }
-.br
-Controls the availability of the Logical Volumes for immediate use after
-the command finishes running.
-By default, new Logical Volumes are activated (\fB\-ay\fP).
-If it is possible technically, \fB\-an\fP will leave the new Logical
-Volume inactive. But for example, snapshots of active origin can only be
-created in the active state so \fB\-an\fP cannot be used with
-\fB-\-type snapshot\fP. This does not apply to thin volume snapshots,
-which are by default created with flag to skip their activation
-(\fB-ky\fP).
-Normally the \fB\-\-zero n\fP argument has to be supplied too because
-zeroing (the default behaviour) also requires activation.
-If autoactivation option is used (\fB\-aay\fP), the logical volume is
-activated only if it matches an item in the
-\fBactivation/auto_activation_volume_list\fP
-set in \fBlvm.conf\fP(5).
-For autoactivated logical volumes, \fB\-\-zero n\fP and
-\fB\-\-wipesignatures n\fP is always assumed and it can't
-be overridden. If the clustered locking is enabled,
-\fB\-aey\fP will activate exclusively on one node and
-.BR \-a { a | l } y
-will activate only on the local node.
-.
-.HP
-.BR \-H | \-\-cache
-.br
-Creates cache or cache pool logical volume.
-.\" or both.
-Specifying the optional argument \fB\-\-extents\fP or \fB\-\-size\fP
-will cause the creation of the cache logical volume.
-.\" Specifying the optional argument \fB\-\-pooldatasize\fP will cause
-.\" the creation of the cache pool logical volume.
-.\" Specifying both arguments will cause the creation of cache with its
-.\" cache pool volume.
-When the Volume group name is specified together with existing logical volume
-name which is NOT a cache pool name, such volume is treated
-as cache origin volume and cache pool is created. In this case the
-\fB\-\-extents\fP or \fB\-\-size\fP is used to specify size of cache pool volume.
-See \fBlvmcache\fP(7) for more info about caching support.
-Note that the cache segment type requires a dm-cache kernel module version
-1.3.0 or greater.
-.
-.HP
-.BR \-\-cachemode
-.RB { passthrough | writeback | writethrough }
-.br
-Specifying a cache mode determines when the writes to a cache LV
-are considered complete. When \fBwriteback\fP is specified, a write is
-considered complete as soon as it is stored in the cache pool LV.
-If \fBwritethough\fP is specified, a write is considered complete only
-when it has been stored in the cache pool LV and on the origin LV.
-While \fBwritethrough\fP may be slower for writes, it is more
-resilient if something should happen to a device associated with the
-cache pool LV. With \fBpassthrough\fP mode, all reads are served
-from origin LV (all reads miss the cache) and all writes are
-forwarded to the origin LV; additionally, write hits cause cache
-block invalidates. See \fBlvmcache(7)\fP for more details.
-.
-.HP
-.BR \-\-cachepolicy
-.IR Policy
-.br
-Only applicable to cached LVs; see also \fBlvmcache(7)\fP. Sets
-the cache policy. \fBmq\fP is the basic policy name. \fBsmq\fP is more advanced
-version available in newer kernels.
-.
-.HP
-.BR \-\-cachepool
-.IR CachePoolLogicalVolume { Name | Path }
-.br
-Specifies the name of cache pool volume name. The other way to specify pool name
-is to append name to Volume group name argument.
-.
-.HP
-.BR \-\-cachesettings
-.IB Key = Value
-.br
-Only applicable to cached LVs; see also \fBlvmcache(7)\fP. Sets
-the cache tunable settings. In most use-cases, default values should be adequate.
-Special string value \fBdefault\fP switches setting back to its default kernel value
-and removes it from the list of settings stored in lvm2 metadata.
-.
-.HP
-.BR \-c | \-\-chunksize
-.SIZE_G \%ChunkSize
-.br
-Gives the size of chunk for snapshot, cache pool and thin pool logical volumes.
-Default unit is in kilobytes.
-.br
-For snapshots the value must be power of 2 between 4KiB and 512KiB
-and the default value is 4KiB.
-.br
-For cache pools the value must a multiple of 32KiB
-between 32KiB and 1GiB. The default is 64KiB.
-When the size is specified with volume caching, it may not be smaller
-than cache pool creation chunk size was.
-.br
-For thin pools the value must be a multiple of 64KiB
-between 64KiB and 1GiB.
-Default value starts with 64KiB and grows up to
-fit the pool metadata size within 128MiB,
-if the pool metadata size is not specified.
-See
-.BR lvm.conf (5)
-setting \fBallocation/thin_pool_chunk_size_policy\fP
-to select different calculation policy.
-Thin pool target version <1.4 requires this value to be a power of 2.
-For target version <1.5 discard is not supported for non power of 2 values.
-.
-.HP
-.BR \-C | \-\-contiguous
-.RB { y | n }
-.br
-Sets or resets the contiguous allocation policy for
-logical volumes. Default is no contiguous allocation based
-on a next free principle.
-.
-.HP
-.BR \-\-corelog
-.br
-This is shortcut for option \fB\-\-mirrorlog core\fP.
-.
-.HP
-.BR \-\-discards
-.RB { ignore | nopassdown | passdown }
-.br
-Sets discards behavior for thin pool.
-Default is \fBpassdown\fP.
-.
-.HP
-.BR \-\-errorwhenfull
-.RB { y | n }
-.br
-Configures thin pool behaviour when data space is exhausted.
-Default is \fBn\fPo.
-Device will queue I/O operations until target timeout
-(see dm-thin-pool kernel module option \fPno_space_timeout\fP)
-expires. Thus configured system has a time to i.e. extend
-the size of thin pool data device.
-When set to \fBy\fPes, the I/O operation is immeditelly errored.
-.
-.HP
-.BR \-K | \-\-ignoreactivationskip
-.br
-Ignore the flag to skip Logical Volumes during activation.
-Use \fB\-\-setactivationskip\fP option to set or reset
-activation skipping flag persistently for logical volume.
-.
-.HP
-.BR \-\-ignoremonitoring
-.br
-Make no attempt to interact with dmeventd unless \fB\-\-monitor\fP
-is specified.
-.
-.HP
-.BR -l | \-\-extents
-.IR LogicalExtentsNumber \c
-.RB [ % { VG | PVS | FREE | ORIGIN }]
-.br
-Specifies the size of the new LV in logical extents. The number of
-physical extents allocated may be different, and depends on the LV type.
-Certain LV types require more physical extents for data redundancy or
-metadata. An alternate syntax allows the size to be determined indirectly
-as a percentage of the size of a related VG, LV, or set of PVs. The
-suffix \fB%VG\fP denotes the total size of the VG, the suffix \fB%FREE\fP
-the remaining free space in the VG, and the suffix \fB%PVS\fP the free
-space in the specified Physical Volumes. For a snapshot, the size
-can be expressed as a percentage of the total size of the Origin Logical
-Volume with the suffix \fB%ORIGIN\fP (\fB100%ORIGIN\fP provides space for
-the whole origin).
-When expressed as a percentage, the size defines an upper limit for the
-number of logical extents in the new LV. The precise number of logical
-extents in the new LV is not determined until the command has completed.
-.
-.HP
-.BR \-j | \-\-major
-.IR Major
-.br
-Sets the major number.
-Major numbers are not supported with pool volumes.
-This option is supported only on older systems
-(kernel version 2.4) and is ignored on modern Linux systems where major
-numbers are dynamically assigned.
-.
-.HP
-.BR \-\-metadataprofile
-.IR ProfileName
-.br
-Uses and attaches the \fIProfileName\fP configuration profile to the logical
-volume metadata. Whenever the logical volume is processed next time,
-the profile is automatically applied. If the volume group has another
-profile attached, the logical volume profile is preferred.
-See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
-.
-.HP
-.BR \-\-minor
-.IR Minor
-.br
-Sets the minor number.
-Minor numbers are not supported with pool volumes.
-.
-.HP
-.BR \-m | \-\-mirrors
-.IR mirrors
-.br
-Creates a mirrored logical volume with \fImirrors\fP copies.
-For example, specifying \fB\-m 1\fP
-would result in a mirror with two-sides; that is,
-a linear volume plus one copy.
-
-Specifying the optional argument \fB\-\-nosync\fP will cause the creation
-of the mirror LV to skip the initial resynchronization. Any data written
-afterwards will be mirrored, but the original contents will not be copied.
-
-This is useful for skipping a potentially long and resource intensive initial
-sync of an empty mirrored RaidLV.
-
-There are two implementations of mirroring which can be used and correspond
-to the "\fIraid1\fP" and "\fImirror\fP" segment types.
-The default is "\fIraid1\fP". See the
-\fB\-\-type\fP option for more information if you would like to use the
-legacy "\fImirror\fP" segment type. See
-.BR lvm.conf (5)
-settings \fB global/mirror_segtype_default\fP
-and \fBglobal/raid10_segtype_default\fP
-to configure default mirror segment type.
-The options
-\fB\-\-mirrorlog\fP and \fB\-\-corelog\fP apply
-to the legacy "\fImirror\fP" segment type only.
-
-Note the current maxima for mirrors are 7 for "mirror" providing
-8 mirror legs and 9 for "raid1" providing 10 legs.
-.
-.HP
-.BR \-\-mirrorlog
-.RB { disk | core | mirrored }
-.br
-Specifies the type of log to be used for logical volumes utilizing
-the legacy "\fImirror\fP" segment type.
-.br
-The default is \fBdisk\fP, which is persistent and requires
-a small amount of storage space, usually on a separate device from the
-data being mirrored.
-.br
-Using \fBcore\fP means the mirror is regenerated by copying the data
-from the first device each time the logical volume is activated,
-like after every reboot.
-.br
-Using \fBmirrored\fP will create a persistent log that is itself mirrored.
-.
-.HP
-.BR \-\-monitor
-.RB { y | n }
-.br
-Starts or avoids monitoring a mirrored, snapshot or thin pool logical volume with
-dmeventd, if it is installed.
-If a device used by a monitored mirror reports an I/O error,
-the failure is handled according to
-\fBactivation/mirror_image_fault_policy\fP
-and \fBactivation/mirror_log_fault_policy\fP
-set in \fBlvm.conf\fP(5).
-.
-.HP
-.BR \-n | \-\-name
-.IR LogicalVolume { Name | Path }
-.br
-Sets the name for the new logical volume.
-.br
-Without this option a default name of "lvol#" will be generated where
-# is the LVM internal number of the logical volume.
-.
-.HP
-.BR \-\-nosync
-.br
-Causes the creation of mirror, raid1, raid4, raid5 and raid10 to skip the
-initial resynchronization. In case of mirror, raid1 and raid10, any data
-written afterwards will be mirrored, but the original contents will not be
-copied. In case of raid4 and raid5, no parity blocks will be written,
-though any data written afterwards will cause parity blocks to be stored.
-.br
-This is useful for skipping a potentially long and resource intensive initial
-sync of an empty mirror/raid1/raid4/raid5 and raid10 LV.
-.br
-This option is not valid for raid6, because raid6 relies on proper parity
-(P and Q Syndromes) being created during initial synchronization in order
-to reconstruct proper user date in case of device failures.
-
-raid0 and raid0_meta don't provide any data copies or parity support
-and thus don't support initial resynchronization.
-.
-.HP
-.BR \-\-noudevsync
-.br
-Disables udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.
-.HP
-.BR \-p | \-\-permission
-.RB { r | rw }
-.br
-Sets access permissions to read only (\fBr\fP) or read and write (\fBrw\fP).
-.br
-Default is read and write.
-.
-.HP
-.BR \-M | \-\-persistent
-.RB { y | n }
-.br
-Set to \fBy\fP to make the minor number specified persistent.
-Pool volumes cannot have persistent major and minor numbers.
-Defaults to \fBy\fPes only when major or minor number is specified.
-Otherwise it is \fBn\fPo.
-.\" .HP
-.\" .IR \fB\-\-pooldatasize " " PoolDataVolumeSize [ bBsSkKmMgGtTpPeE ]
-.\" Sets the size of pool's data logical volume.
-.\" For thin pools you may also specify the size
-.\" with the option \fB\-\-size\fP.
-.\"
-.
-.HP
-.BR \-\-poolmetadatasize
-.SIZE_G \%MetadataVolumeSize
-.br
-Sets the size of pool's metadata logical volume.
-Supported values are in range between 2MiB and 16GiB for thin pool,
-and upto 16GiB for cache pool. The minimum value is computed from pool's
-data size.
-Default value for thin pool is (Pool_LV_size / Pool_LV_chunk_size * 64b).
-To work with a thin pool, there should be at least 25% of free space
-when the size of metadata is smaller then 16MiB,
-or at least 4MiB of free space otherwise.
-Default unit is megabytes.
-.
-.HP
-.BR \-\-poolmetadataspare
-.RB { y | n }
-.br
-Controls creation and maintanence of pool metadata spare logical volume
-that will be used for automated pool recovery.
-Only one such volume is maintained within a volume group
-with the size of the biggest pool metadata volume.
-Default is \fBy\fPes.
-.
-.HP
-.BR \-\- [ raid ] maxrecoveryrate
-.SIZE_G \%Rate
-.br
-Sets the maximum recovery rate for a RAID logical volume. \fIRate\fP
-is specified as an amount per second for each device in the array.
-If no suffix is given, then KiB/sec/device is assumed. Setting the
-recovery rate to 0 means it will be unbounded.
-.
-.HP
-.BR \-\- [ raid ] minrecoveryrate
-.SIZE_G \%Rate
-.br
-Sets the minimum recovery rate for a RAID logical volume. \fIRate\fP
-is specified as an amount per second for each device in the array.
-If no suffix is given, then KiB/sec/device is assumed. Setting the
-recovery rate to 0 means it will be unbounded.
-.
-.HP
-.BR \-r | \-\-readahead
-.RB { \fIReadAheadSectors | auto | none }
-.br
-Sets read ahead sector count of this logical volume.
-For volume groups with metadata in lvm1 format, this must
-be a value between 2 and 120.
-The default value is \fBauto\fP which allows the kernel to choose
-a suitable value automatically.
-\fBnone\fP is equivalent to specifying zero.
-.
-.HP
-.BR \-R | \-\-regionsize
-.SIZE_G \%MirrorLogRegionSize
-.br
-A mirror is divided into regions of this size (in MiB), and the mirror log
-uses this granularity to track which regions are in sync.
-.
-.HP
-.BR \-k | \-\-setactivationskip
-.RB { y | n }
-.br
-Controls whether Logical Volumes are persistently flagged to be skipped during
-activation. By default, thin snapshot volumes are flagged for activation skip.
-See
-.BR lvm.conf (5)
-\fBactivation/auto_set_activation_skip\fP
-how to change its default behaviour.
-To activate such volumes, an extra \fB\-\-ignoreactivationskip\fP
-option must be used. The flag is not applied during deactivation. Use
-\fBlvchange \-\-setactivationskip\fP
-command to change the skip flag for existing volumes.
-To see whether the flag is attached, use \fBlvs\fP command
-where the state of the flag is reported within \fBlv_attr\fP bits.
-.
-.HP
-.BR \-L | \-\-size
-.SIZE_E \%LogicalVolumeSize
-.br
-Gives the size to allocate for the new logical volume.
-A size suffix of \fBB\fP for bytes, \fBS\fP for sectors as 512 bytes,
-\fBK\fP for kilobytes, \fBM\fP for megabytes,
-\fBG\fP for gigabytes, \fBT\fP for terabytes, \fBP\fP for petabytes
-or \fBE\fP for exabytes is optional.
-.br
-Default unit is megabytes.
-.
-.HP
-.BR \-s | \fB\-\-snapshot
-.IR OriginalLogicalVolume { Name | Path }
-.br
-Creates a snapshot logical volume (or snapshot) for an existing, so called
-original logical volume (or origin).
-Snapshots provide a 'frozen image' of the contents of the origin
-while the origin can still be updated. They enable consistent
-backups and online recovery of removed/overwritten data/files.
-.br
-Thin snapshot is created when the origin is a thin volume and
-the size IS NOT specified. Thin snapshot shares same blocks within
-the thin pool volume.
-The non thin volume snapshot with the specified size does not need
-the same amount of storage the origin has. In a typical scenario,
-15-20% might be enough. In case the snapshot runs out of storage, use
-.BR lvextend (8)
-to grow it. Shrinking a snapshot is supported by
-.BR lvreduce (8)
-as well. Run
-.BR lvs (8)
-on the snapshot in order to check how much data is allocated to it.
-Note: a small amount of the space you allocate to the snapshot is
-used to track the locations of the chunks of data, so you should
-allocate slightly more space than you actually need and monitor
-(\fB\-\-monitor\fP) the rate at which the snapshot data is growing
-so you can \fBavoid\fP running out of space.
-If \fB\-\-thinpool\fP is specified, thin volume is created that will
-use given original logical volume as an external origin that
-serves unprovisioned blocks.
-Only read-only volumes can be used as external origins.
-To make the volume external origin, lvm expects the volume to be inactive.
-External origin volume can be used/shared for many thin volumes
-even from different thin pools. See
-.BR lvconvert (8)
-for online conversion to thin volumes with external origin.
-.
-.HP
-.BR \-i | \-\-stripes
-.IR Stripes
-.br
-Gives the number of stripes.
-This is equal to the number of physical volumes to scatter
-the logical volume data. When creating a RAID 4/5/6 logical volume,
-the extra devices which are necessary for parity are
-internally accounted for. Specifying \fB\-i 3\fP
-would cause 3 devices for striped and RAID 0 logical volumes,
-4 devices for RAID 4/5, 5 devices for RAID 6 and 6 devices for RAID 10.
-Alternatively, RAID 0 will stripe across 2 devices,
-RAID 4/5 across 3 PVs, RAID 6 across 5 PVs and RAID 10 across
-4 PVs in the volume group if the \fB\-i\fP argument is omitted.
-In order to stripe across all PVs of the VG if the \fB\-i\fP argument is
-omitted, set raid_stripe_all_devices=1 in the allocation
-section of \fBlvm.conf (5)\fP or add
-.br
-\fB\-\-config allocation/raid_stripe_all_devices=1\fP
-.br
-to the command.
-
-Note the current maxima for stripes depend on the created RAID type.
-For raid10, the maximum of stripes is 32,
-for raid0, it is 64,
-for raid4/5, it is 63
-and for raid6 it is 62.
-
-See the \fB\-\-nosync\fP option to optionally avoid initial syncrhonization of RaidLVs.
-
-Two implementations of basic striping are available in the kernel.
-The original device-mapper implementation is the default and should
-normally be used. The alternative implementation using MD, available
-since version 1.7 of the RAID device-mapper kernel target (kernel
-version 4.2) is provided to facilitate the development of new RAID
-features. It may be accessed with \fB--type raid0[_meta]\fP, but is best
-avoided at present because of assorted restrictions on resizing and converting
-such devices.
-.HP
-.BR \-I | \-\-stripesize
-.IR StripeSize
-.br
-Gives the number of kilobytes for the granularity of the stripes.
-.br
-StripeSize must be 2^n (n = 2 to 9) for metadata in LVM1 format.
-For metadata in LVM2 format, the stripe size may be a larger
-power of 2 but must not exceed the physical extent size.
-.
-.HP
-.BR \-T | \-\-thin
-.br
-Creates thin pool or thin logical volume or both.
-Specifying the optional argument \fB\-\-size\fP or \fB\-\-extents\fP
-will cause the creation of the thin pool logical volume.
-Specifying the optional argument \fB\-\-virtualsize\fP will cause
-the creation of the thin logical volume from given thin pool volume.
-Specifying both arguments will cause the creation of both
-thin pool and thin volume using this pool.
-See \fBlvmthin\fP(7) for more info about thin provisioning support.
-Thin provisioning requires device mapper kernel driver
-from kernel 3.2 or greater.
-.
-.HP
-.BR \-\-thinpool
-.IR ThinPoolLogicalVolume { Name | Path }
-.br
-Specifies the name of thin pool volume name. The other way to specify pool name
-is to append name to Volume group name argument.
-.
-.HP
-.BR \-\-type
-.IR SegmentType
-.br
-Creates a logical volume with the specified segment type.
-Supported types are:
-.BR cache ,
-.BR cache-pool ,
-.BR error ,
-.BR linear ,
-.BR mirror,
-.BR raid0 ,
-.BR raid1 ,
-.BR raid4 ,
-.BR raid5_la ,
-.BR raid5_ls
-.RB (=
-.BR raid5 ),
-.BR raid5_ra ,
-.BR raid5_rs ,
-.BR raid6_nc ,
-.BR raid6_nr ,
-.BR raid6_zr
-.RB (=
-.BR raid6 ),
-.BR raid10 ,
-.BR snapshot ,
-.BR striped,
-.BR thin ,
-.BR thin-pool
-or
-.BR zero .
-Segment type may have a commandline switch alias that will
-enable its use.
-When the type is not explicitly specified an implicit type
-is selected from combination of options:
-.BR \-H | \-\-cache | \-\-cachepool
-(cache or cachepool),
-.BR \-T | \-\-thin | \-\-thinpool
-(thin or thinpool),
-.BR \-m | \-\-mirrors
-(raid1 or mirror),
-.BR \-s | \-\-snapshot | \-V | \-\-virtualsize
-(snapshot or thin),
-.BR \-i | \-\-stripes
-(striped).
-The default segment type is \fBlinear\fP.
-.
-.HP
-.BR \-V | \-\-virtualsize
-.SIZE_E \%VirtualSize
-.br
-Creates a thinly provisioned device or a sparse device of the given size (in MiB by default).
-See
-.BR lvm.conf (5)
-settings \fBglobal/sparse_segtype_default\fP
-to configure default sparse segment type.
-See \fBlvmthin\fP(7) for more info about thin provisioning support.
-Anything written to a sparse snapshot will be returned when reading from it.
-Reading from other areas of the device will return blocks of zeros.
-Virtual snapshot (sparse snapshot) is implemented by creating
-a hidden virtual device of the requested size using the zero target.
-A suffix of _vorigin is used for this device.
-Note: using sparse snapshots is not efficient for larger
-device sizes (GiB), thin provisioning should be used for this case.
-.
-.HP
-.BR \-W | \-\-wipesignatures
-.RB { y | n }
-.br
-Controls detection and subsequent wiping of signatures on newly created
-Logical Volume. There's a prompt for each signature detected to confirm
-its wiping (unless \fB--yes\fP is used where LVM assumes 'yes' answer
-for each prompt automatically). If this option is not specified, then by
-default \fB-W\fP | \fB--wipesignatures y\fP is assumed each time the
-zeroing is done (\fB\-Z\fP | \fB\-\-zero y\fP). This default behaviour
-can be controlled by \fB\%allocation/wipe_signatures_when_zeroing_new_lvs\fP
-setting found in
-.BR lvm.conf (5).
-.br
-If blkid wiping is used (\fBallocation/use_blkid_wiping\fP setting in
-.BR lvm.conf (5))
-and LVM2 is compiled with blkid wiping support, then \fBblkid\fP(8) library is used
-to detect the signatures (use \fBblkid \-k\fP command to list the signatures that are recognized).
-Otherwise, native LVM2 code is used to detect signatures (MD RAID, swap and LUKS
-signatures are detected only in this case).
-.br
-Logical volume is not wiped if the read only flag is set.
-.
-.HP
-.BR \-Z | \-\-zero
-.RB { y | n }
-.br
-Controls zeroing of the first 4KiB of data in the new logical volume.
-Default is \fBy\fPes.
-Snapshot COW volumes are always zeroed.
-Logical volume is not zeroed if the read only flag is set.
-.br
-Warning: trying to mount an unzeroed logical volume can cause the system to
-hang.
-.
-.SH Examples
-.
-Creates a striped logical volume with 3 stripes, a stripe size of 8KiB
-and a size of 100MiB in the volume group named vg00.
-The logical volume name will be chosen by lvcreate:
-.sp
-.B lvcreate \-i 3 \-I 8 \-L 100M vg00
-
-Creates a mirror logical volume with 2 sides with a useable size of 500 MiB.
-This operation would require 3 devices (or option
-\fB\-\-alloc \%anywhere\fP) - two for the mirror
-devices and one for the disk log:
-.sp
-.B lvcreate \-m1 \-L 500M vg00
-
-Creates a mirror logical volume with 2 sides with a useable size of 500 MiB.
-This operation would require 2 devices - the log is "in-memory":
-.sp
-.B lvcreate \-m1 \-\-mirrorlog core \-L 500M vg00
-
-Creates a snapshot logical volume named "vg00/snap" which has access to the
-contents of the original logical volume named "vg00/lvol1"
-at snapshot logical volume creation time. If the original logical volume
-contains a file system, you can mount the snapshot logical volume on an
-arbitrary directory in order to access the contents of the filesystem to run
-a backup while the original filesystem continues to get updated:
-.sp
-.B lvcreate \-\-size 100m \-\-snapshot \-\-name snap /dev/vg00/lvol1
-
-Creates a snapshot logical volume named "vg00/snap" with size
-for overwriting 20% of the original logical volume named "vg00/lvol1".:
-.sp
-.B lvcreate \-s \-l 20%ORIGIN \-\-name snap vg00/lvol1
-
-Creates a sparse device named /dev/vg1/sparse of size 1TiB with space for just
-under 100MiB of actual data on it:
-.sp
-.B lvcreate \-\-virtualsize 1T \-\-size 100M \-\-snapshot \-\-name sparse vg1
-
-Creates a linear logical volume "vg00/lvol1" using physical extents
-/dev/sda:0\-7 and /dev/sdb:0\-7 for allocation of extents:
-.sp
-.B lvcreate \-L 64M \-n lvol1 vg00 /dev/sda:0\-7 /dev/sdb:0\-7
-
-Creates a 5GiB RAID5 logical volume "vg00/my_lv", with 3 stripes (plus
-a parity drive for a total of 4 devices) and a stripesize of 64KiB:
-.sp
-.B lvcreate \-\-type raid5 \-L 5G \-i 3 \-I 64 \-n my_lv vg00
-
-Creates a RAID5 logical volume "vg00/my_lv", using all of the free
-space in the VG and spanning all the PVs in the VG (note that the command
-will fail if there's more than 8 PVs in the VG in which case \fB\-i 7\fP
-has to be used to get to the currently possible maximum of
-8 devices including parity for RaidLVs):
-.sp
-.B lvcreate \-\-config allocation/raid_stripe_all_devices=1 \-\-type raid5 \-l 100%FREE \-n my_lv vg00
-
-Creates a 5GiB RAID10 logical volume "vg00/my_lv", with 2 stripes on
-2 2-way mirrors. Note that the \fB-i\fP and \fB-m\fP arguments behave
-differently.
-The \fB-i\fP specifies the number of stripes.
-The \fB-m\fP specifies the number of
-.B additional
-copies:
-.sp
-.B lvcreate \-\-type raid10 \-L 5G \-i 2 \-m 1 \-n my_lv vg00
-
-Creates 100MiB pool logical volume for thin provisioning
-build with 2 stripes 64KiB and chunk size 256KiB together with
-1TiB thin provisioned logical volume "vg00/thin_lv":
-.sp
-.B lvcreate \-i 2 \-I 64 \-c 256 \-L100M \-T vg00/pool \-V 1T \-\-name thin_lv
-
-Creates a thin snapshot volume "thinsnap" of thin volume "thinvol" that
-will share the same blocks within the thin pool.
-Note: the size MUST NOT be specified, otherwise the non-thin snapshot
-is created instead:
-.sp
-.B lvcreate \-s vg00/thinvol \-\-name thinsnap
-
-Creates a thin snapshot volume of read-only inactive volume "origin"
-which then becomes the thin external origin for the thin snapshot volume
-in vg00 that will use an existing thin pool "vg00/pool":
-.sp
-.B lvcreate \-s \-\-thinpool vg00/pool origin
-
-Create a cache pool LV that can later be used to cache one
-logical volume.
-.sp
-.B lvcreate \-\-type cache-pool \-L 1G \-n my_lv_cachepool vg /dev/fast1
-
-If there is an existing cache pool LV, create the large slow
-device (i.e. the origin LV) and link it to the supplied cache pool LV,
-creating a cache LV.
-.sp
-.B lvcreate \-\-cache \-L 100G \-n my_lv vg/my_lv_cachepool /dev/slow1
-
-If there is an existing logical volume, create the small and fast
-cache pool LV and link it to the supplied existing logical
-volume (i.e. the origin LV), creating a cache LV.
-.sp
-.B lvcreate \-\-type cache \-L 1G \-n my_lv_cachepool vg/my_lv /dev/fast1
-
-.\" Create a 1G cached LV "lvol1" with 10M cache pool "vg00/pool".
-.\" .sp
-.\" .B lvcreate \-\-cache \-L 1G \-n lv \-\-pooldatasize 10M vg00/pool
-.
-.SH SEE ALSO
-.
-.nh
-.BR lvm (8),
-.BR lvm.conf (5),
-.BR lvmcache (7),
-.BR lvmthin (7),
-.BR lvconvert (8),
-.BR lvchange (8),
-.BR lvextend (8),
-.BR lvreduce (8),
-.BR lvremove (8),
-.BR lvrename (8)
-.BR lvs (8),
-.BR lvscan (8),
-.BR vgcreate (8),
-.BR blkid (8)
diff --git a/man/lvdisplay.8.des b/man/lvdisplay.8.des
new file mode 100644
index 0000000..48552cc
--- /dev/null
+++ b/man/lvdisplay.8.des
@@ -0,0 +1,5 @@
+lvdisplay shows the attributes of LVs, like size, read/write status,
+snapshot information, etc.
+
+\fBlvs\fP(8) is a preferred alternative that shows the same information
+and more, using a more compact and configurable output format.
diff --git a/man/lvdisplay.8.in b/man/lvdisplay.8.in
deleted file mode 100644
index e8e7809..0000000
--- a/man/lvdisplay.8.in
+++ /dev/null
@@ -1,134 +0,0 @@
-.TH LVDISPLAY 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvdisplay \(em display attributes of a logical volume
-.SH SYNOPSIS
-.B lvdisplay
-.RB [ \-a | \-\-all ]
-.RB [ \-c | \-\-colon ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-maps ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName | LogicalVolume { Name | Path }\ ...]
-.br
-
-.B lvdisplay
-.BR \-C | \-\-columns
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-a | \-\-all ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-logonly ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-segments ]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName | LogicalVolume { Name | Path }\ ...]
-.SH DESCRIPTION
-lvdisplay allows you to see the attributes of a logical volume
-like size, read/write status, snapshot information etc.
-.P
-\fBlvs\fP(8) is an alternative that provides the same information
-in the style of \fBps\fP(1).
-\fBlvs\fP(8) is recommended over \fBlvdisplay\fP.
-
-.SH OPTIONS
-See \fBlvm\fP(8) for common options and \fBlvs\fP for options given with
-\fB\-\-columns\fP.
-.TP
-.B \-\-all
-Include information in the output about internal Logical Volumes that
-are components of normally-accessible Logical Volumes, such as mirrors,
-but which are not independently accessible (e.g. not mountable).
-For example, after creating a mirror using
-\fBlvcreate \-m1 \-\-mirrorlog disk\fP,
-this option will reveal three internal Logical Volumes, with suffixes
-mimage_0, mimage_1, and mlog.
-.TP
-.BR \-C ", " \-\-columns
-Display output in columns, the equivalent of \fBlvs\fP(8).
-Options listed are the same as options given in \fBlvs\fP(8).
-.TP
-.BR \-c ", " \-\-colon
-Generate colon separated output for easier parsing in scripts or programs.
-N.B. \fBlvs\fP(8) provides considerably more control over the output.
-.nf
-
-The values are:
-
-\(bu logical volume name
-\(bu volume group name
-\(bu logical volume access
-\(bu logical volume status
-\(bu internal logical volume number
-\(bu open count of logical volume
-\(bu logical volume size in sectors
-\(bu current logical extents associated to logical volume
-\(bu allocated logical extents of logical volume
-\(bu allocation policy of logical volume
-\(bu read ahead sectors of logical volume
-\(bu major device number of logical volume
-\(bu minor device number of logical volume
-
-.fi
-.TP
-.BR \-m ", " \-\-maps
-Display the mapping of logical extents to physical volumes and
-physical extents. To map physical extents
-to logical extents use:
-.B pvs \-\-segments \-o+lv_name,seg_start_pe,segtype
-.SH Examples
-Shows attributes of that logical volume. If snapshot
-logical volumes have been created for this original logical volume,
-this command shows a list of all snapshot logical volumes and their
-status (active or inactive) as well:
-.sp
-.B lvdisplay \-v vg00/lvol2
-
-Shows the attributes of this snapshot logical volume and also which
-original logical volume it is associated with:
-.sp
-.B lvdisplay vg00/snapshot
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvcreate (8),
-.BR lvs (8),
-.BR lvscan (8),
-.BR pvs (8)
diff --git a/man/lvextend.8.des b/man/lvextend.8.des
new file mode 100644
index 0000000..2a3781d
--- /dev/null
+++ b/man/lvextend.8.des
@@ -0,0 +1,5 @@
+lvextend extends the size of an LV. This requires allocating logical
+extents from the VG's free physical extents. A copy\-on\-write snapshot LV
+can also be extended to provide more space to hold COW blocks. Use
+\fBlvconvert\fP(8) to change the number of data images in a RAID or
+mirrored LV.
diff --git a/man/lvextend.8.end b/man/lvextend.8.end
new file mode 100644
index 0000000..6d197de
--- /dev/null
+++ b/man/lvextend.8.end
@@ -0,0 +1,16 @@
+.SH EXAMPLES
+
+Extend the size of an LV by 54MiB, using a specific PV.
+.br
+.B lvextend \-L +54 vg01/lvol10 /dev/sdk3
+
+Extend the size of an LV by the amount of free
+space on PV /dev/sdk3. This is equivalent to specifying
+"\-l +100%PVS" on the command line.
+.br
+.B lvextend vg01/lvol01 /dev/sdk3
+
+Extend an LV by 16MiB using specific physical extents.
+.br
+.B lvextend \-L+16m vg01/lvol01 /dev/sda:8\-9 /dev/sdb:8\-9
+
diff --git a/man/lvextend.8.in b/man/lvextend.8.in
deleted file mode 100644
index eefbf79..0000000
--- a/man/lvextend.8.in
+++ /dev/null
@@ -1,134 +0,0 @@
-.TH LVEXTEND 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvextend \(em extend the size of a logical volume
-.SH SYNOPSIS
-.B lvextend
-.RB [ \-\-alloc
-.IR AllocationPolicy ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-f | \-\-force ]
-.RB [ \-i | \-\-stripes
-.I Stripes
-.RB [ \-I | \-\-stripesize
-.IR StripeSize ]]
-.RB { \-l | \-\-extents
-.RI [ + ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN }]
-|
-.BR \-L | \-\-size
-.RI [ + ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]}
-.RB [ \-n | \-\-nofsck ]
-.RB [ \-\-noudevsync]
-.RB [ \-r | \-\-resizefs ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-use\-policies ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.I LogicalVolumePath
-.RI [ PhysicalVolumePath [ :PE [ \-PE ]]...]
-.SH DESCRIPTION
-lvextend allows you to extend the size of a logical volume.
-Extension of snapshot logical volumes (see
-.BR lvcreate (8)
-for information to create snapshots) is supported as well.
-But to change the number of copies in a mirrored logical
-volume use
-.BR lvconvert (8).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-f ", " \-\-force
-Proceed with size extension without prompting.
-.TP
-.IR \fB\-l ", " \fB\-\-extents " [" + ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN }]
-Extend or set the logical volume size in units of logical extents.
-With the '\fI+\fP' sign the value is added to the actual size
-of the logical volume and without it, the value is taken as an absolute one.
-The total number of physical extents allocated will be
-greater than this, for example, if the volume is mirrored.
-The number can also be expressed as a percentage of the total space
-in the Volume Group with the suffix \fI%VG\fP, relative to the existing
-size of the Logical Volume with the suffix \fI%LV\fP, of the remaining
-free space for the specified PhysicalVolume(s) with the suffix \fI%PVS\fP,
-as a percentage of the remaining free space in the Volume Group
-with the suffix \fI%FREE\fP, or (for a snapshot) as a percentage of the total
-space in the Origin Logical Volume with the suffix \fI%ORIGIN\fP.
-The resulting value is rounded upward.
-N.B. In a future release, when expressed as a percentage with PVS, VG or FREE,
-the number will be treated as an approximate upper limit for the total number
-of physical extents to be allocated (including extents used by any mirrors, for
-example). The code may currently allocate more space than you might otherwise
-expect.
-.TP
-.IR \fB\-L ", " \fB\-\-size " [" + ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]
-Extend or set the logical volume size in units of megabytes.
-A size suffix of M for megabytes,
-G for gigabytes, T for terabytes, P for petabytes
-or E for exabytes is optional.
-With the + sign the value is added to the actual size
-of the logical volume and without it, the value is taken as an absolute one.
-.TP
-.BR \-i ", " \-\-stripes " " \fIStripes
-Gives the number of stripes for the extension.
-Not applicable to LVs using the original metadata LVM format, which must
-use a single value throughout.
-.TP
-.BR \-I ", " \-\-stripesize " " \fIStripeSize
-Gives the number of kilobytes for the granularity of the stripes.
-Not applicable to LVs using the original metadata LVM format, which must
-use a single value throughout.
-.br
-StripeSize must be 2^n (n = 2 to 9)
-.TP
-.BR \-n ", " \-\-nofsck
-Do not perform fsck before extending filesystem when filesystem
-requires it. You may need to use \fB\-\-force\fR to proceed with
-this option.
-.TP
-.B \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.TP
-.BR \-r ", " \-\-resizefs
-Resize underlying filesystem together with the logical volume using
-\fBfsadm\fR(8).
-.TP
-.B \-\-use\-policies
-Resizes the logical volume according to configured policy. See
-\fBlvm.conf\fR(5) for some details.
-
-.SH Examples
-Extends the size of the logical volume "vg01/lvol10" by 54MiB on physical
-volume /dev/sdk3. This is only possible if /dev/sdk3 is a member of
-volume group vg01 and there are enough free physical extents in it:
-.sp
-.B lvextend \-L +54 /dev/vg01/lvol10 /dev/sdk3
-
-Extends the size of logical volume "vg01/lvol01" by the amount of free
-space on physical volume /dev/sdk3. This is equivalent to specifying
-"\-l +100%PVS" on the command line:
-.sp
-.B lvextend /dev/vg01/lvol01 /dev/sdk3
-
-Extends a logical volume "vg01/lvol01" by 16MiB using physical extents
-/dev/sda:8\-9 and /dev/sdb:8\-9 for allocation of extents:
-.sp
-.B lvextend -L+16M vg01/lvol01 /dev/sda:8\-9 /dev/sdb:8\-9
-
-.SH SEE ALSO
-.BR fsadm (8),
-.BR lvm (8),
-.BR lvm.conf (5),
-.BR lvcreate (8),
-.BR lvconvert (8),
-.BR lvreduce (8),
-.BR lvresize (8),
-.BR lvchange (8)
diff --git a/man/lvm-config.8.des b/man/lvm-config.8.des
new file mode 100644
index 0000000..1d36566
--- /dev/null
+++ b/man/lvm-config.8.des
@@ -0,0 +1,5 @@
+This command is the same as \fBlvmconfig\fP(8).
+
+lvm config produces formatted output from the LVM configuration tree. The
+sources of the configuration data include \fBlvm.conf\fP(5) and command
+line settings from \-\-config.
diff --git a/man/lvm-config.8.in b/man/lvm-config.8.in
deleted file mode 100644
index 5050d77..0000000
--- a/man/lvm-config.8.in
+++ /dev/null
@@ -1 +0,0 @@
-.so man8/lvmconfig.8
diff --git a/man/lvm-dumpconfig.8.des b/man/lvm-dumpconfig.8.des
new file mode 100644
index 0000000..18593fb
--- /dev/null
+++ b/man/lvm-dumpconfig.8.des
@@ -0,0 +1,5 @@
+This command is the same as \fBlvmconfig\fP(8).
+
+lvm dumpconfig produces formatted output from the LVM configuration tree. The
+sources of the configuration data include \fBlvm.conf\fP(5) and command
+line settings from \-\-config.
diff --git a/man/lvm-dumpconfig.8.in b/man/lvm-dumpconfig.8.in
deleted file mode 100644
index 5050d77..0000000
--- a/man/lvm-dumpconfig.8.in
+++ /dev/null
@@ -1 +0,0 @@
-.so man8/lvmconfig.8
diff --git a/man/lvm-fullreport.8.des b/man/lvm-fullreport.8.des
new file mode 100644
index 0000000..f350a0a
--- /dev/null
+++ b/man/lvm-fullreport.8.des
@@ -0,0 +1,6 @@
+lvm fullreport produces formatted output about PVs, PV segments, VGs, LVs
+and LV segments. The information is all gathered together for each VG
+(under a per-VG lock) so it is consistent. Information gathered from
+separate calls to \fBvgs\fP, \fBpvs\fP, and \fBlvs\fP can be inconsistent
+if information changes between commands.
+
diff --git a/man/lvm-fullreport.8.in b/man/lvm-fullreport.8.in
deleted file mode 100644
index 96ac937..0000000
--- a/man/lvm-fullreport.8.in
+++ /dev/null
@@ -1,145 +0,0 @@
-.TH LVM-FULLREPORT 8 "LVM TOOLS #VERSION#" "Red Hat, Inc" \" -*- nroff -*-
-.SH NAME
-lvm fullreport \(em Report information about PVs, PV segments, VGs, LVs and LV segments, all at once for each VG.
-.SH SYNOPSIS
-.B lvm fullreport
-.RB [ \-a | \-\-all ]
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-logonly ]
-.RB [ \-\-nameprefixes ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-rows ]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-\-unquoted ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName
-.RI [ VolumeGroupName ...]]
-.SH DESCRIPTION
-lvm fullreport produces formatted output about PVs, PV segments, VGs, LVs
-and LV segments, all at once for each VG and guarded by per-VG lock
-for consistency.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.B \-\-all
-Include information in the output about internal Logical Volumes that
-are components of normally-accessible Logical Volumes, such as mirrors,
-but which are not independently accessible (e.g. not mountable).
-The names of such Logical Volumes are enclosed within square brackets
-in the output. For example, after creating a mirror using
-.B lvcreate -m1 \-\-mirrorlog disk
-, this option will reveal three internal Logical
-Volumes, with suffixes mimage_0, mimage_1, and mlog.
-.TP
-.B \-\-aligned
-Use with \fB\-\-separator\fP to align the output columns.
-.TP
-.B \-\-binary
-Use binary values "0" or "1" instead of descriptive literal values
-for columns that have exactly two valid values to report (not counting
-the "unknown" value which denotes that the value could not be determined).
-.TP
-.B \-\-configreport \fI ReportName
-Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
-\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
-is 'pv' for PV subreport, 'pvseg' for PV segment subreport, 'vg' for
-VG subreport, 'lv' for LV subreport, 'seg' for LV segment subreport or 'log'
-for log report. If \fB\-\-configreport\fP option is not used to identify a
-report, then all command's subreports are assumed except log report. The log
-report is available only if enabled by \fBlog/report_command_log\fP
-\fBlvm.conf\fP(5) setting or if \fB\-\-logonly\fP option is used.
-.TP
-.B \-\-logonly
-Suppress the main report itself and display only log report on output.
-.TP
-.B \-\-nameprefixes
-Add an "LVM2_" prefix plus the field name to the output. Useful
-with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
-be used to set environment variables (for example, in \fBudev\fP(7) rules).
-.TP
-.B \-\-noheadings
-Suppress the headings line that is normally the first line of output.
-Useful if grepping the output.
-.TP
-.B \-\-nosuffix
-Suppress the suffix on output sizes. Use with \fB\-\-units\fP
-(except h and H) if processing the output.
-.TP
-.BR \-o ", " \-\-options
-Comma-separated ordered list of columns.
-.IP
-Precede the list with '\fI+\fP' to append to the current list
-of columns, '\fI-\fP' to remove from the current list of columns
-or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
-be repeated, providing several lists. These lists are evaluated
-from left to right.
-.IP
-For the list of columns, see \fBpvs\fP(8), \fBvgs\fP(8),
-\fBlvs\fP(8) man page or check \fBpvs\fP, \fBvgs\fP, \fBlvs -o help\fP
-output.
-.TP
-.BR \-O ", " \-\-sort
-Comma-separated ordered list of columns to sort by. Replaces the default
-selection. Precede any column with '\fI\-\fP' for a reverse sort on that
-column.
-.TP
-.B \-\-rows
-Output columns as rows.
-.TP
-.BR \-S ", " \-\-select " " \fISelection
-Display only rows that match Selection criteria. All rows are displayed with
-the additional "selected" column (\fB-o selected\fP) showing 1 if the row
-matches the Selection and 0 otherwise. The Selection criteria are defined
-by specifying column names and their valid values (that can include reserved
-values) while making use of supported comparison operators. See \fBlvm\fP(8)
-and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
-about constructing the Selection criteria. As a quick help and to see full
-list of column names that can be used in Selection including the list of
-reserved values and the set of supported selection operators, check the
-output of \fBpvs\fP, \fBvgs\fP, \fBlvs -S help\fP command.
-.TP
-.B \-\-separator \fISeparator
-String to use to separate each column. Useful if grepping the output.
-.TP
-.B \-\-unbuffered
-Produce output immediately without sorting or aligning the columns properly.
-.TP
-.B \-\-units \fIhHbBsSkKmMgGtTpPeE
-All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
-(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
-Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
-custom units e.g. \-\-units 3M
-.TP
-.B \-\-unquoted
-When used with \fB\-\-nameprefixes\fP, output values in the field=value
-pairs are not quoted.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvs (8),
-.BR vgs (8),
-.BR lvs (8)
diff --git a/man/lvm-lvpoll.8.des b/man/lvm-lvpoll.8.des
new file mode 100644
index 0000000..35c2522
--- /dev/null
+++ b/man/lvm-lvpoll.8.des
@@ -0,0 +1,4 @@
+lvm lvpoll is an internal command used by \fBlvmpolld\fP(8) to monitor and
+complete \fBlvconvert\fP(8) and \fBpvmove\fP(8) operations. lvpoll itself
+does not initiate these operations and should not normally need to be run
+directly.
diff --git a/man/lvm-lvpoll.8.end b/man/lvm-lvpoll.8.end
new file mode 100644
index 0000000..eddb364
--- /dev/null
+++ b/man/lvm-lvpoll.8.end
@@ -0,0 +1,33 @@
+.SH NOTES
+
+To find the name of the pvmove LV that was created by an original
+\fBpvmove /dev/name\fP command, use the command:
+.br
+\fBlvs -a -S move_pv=/dev/name\fP.
+
+.SH EXAMPLES
+
+Continue polling a pvmove operation.
+.br
+.B lvm lvpoll --polloperation pvmove vg00/pvmove0
+
+Abort a pvmove operation.
+.br
+.B lvm lvpoll --polloperation pvmove --abort vg00/pvmove0
+
+Continue polling a mirror conversion.
+.br
+.B lvm lvpoll --polloperation convert vg00/lvmirror
+
+Continue mirror repair.
+.br
+.B lvm lvpoll --polloperation convert vg/damaged_mirror --handlemissingpvs
+
+Continue snapshot merge.
+.br
+.B lvm lvpoll --polloperation merge vg/snapshot_old
+
+Continue thin snapshot merge.
+.br
+.B lvm lvpoll --polloperation merge_thin vg/thin_snapshot
+
diff --git a/man/lvm-lvpoll.8.in b/man/lvm-lvpoll.8.in
deleted file mode 100644
index 8ffbdd4..0000000
--- a/man/lvm-lvpoll.8.in
+++ /dev/null
@@ -1,89 +0,0 @@
-.TH "LVPOLL" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" \" -*- nroff -*-
-.SH NAME
-lvpoll \(em Internal command used by lvmpolld to complete some Logical Volume operations.
-
-.SH SYNOPSIS
-.B lvm lvpoll
-.BR \-\-polloperation
-.RI { pvmove | convert | merge | merge_thin }
-.RB [ \-\-abort ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-handlemissingpvs ]
-.RB [ \-i | \-\-interval
-.IR Seconds ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.IR LogicalVolume [ Path ]
-.SH DESCRIPTION
-\fBlvpoll\fP is an internal command used by \fBlvmpolld\fP(8) to monitor and
-complete \fBlvconvert\fP(8) and \fBpvmove\fP(8) operations.
-\fBlvpoll\fP itself does not initiate these operations and
-you should never normally need to invoke it directly.
-
-.I LogicalVolume
-The Logical Volume undergoing conversion or, in the case of pvmove, the name of
-the internal pvmove Logical Volume (see \fBEXAMPLES\fP).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-\-polloperation " {" \fIconvert | \fImerge | \fImerge_thin | \fIpvmove }
-Mandatory option.
-\fIpvmove\fP refers to a pvmove operation that is moving data.
-\fIconvert\fP refers to an operation that is increasing the number of redundant copies of data maintained by a mirror.
-\fImerge\fP indicates a merge operation that doesn't involve thin volumes.
-\fImerge_thin\fP indicates a merge operation involving thin snapshots.
-\fBpvmove\fP(8) and \fBlvconvert\fP(8) describe how to initiate these operations.
-.TP
-.B \-\-abort
-Abort pvmove in progress. See \fBpvmove\fP(8).
-.TP
-.B \-\-handlemissingpvs
-Used when the polling operation needs to handle missing PVs to be able to
-continue. This can happen when \fBlvconvert\fP(8) is repairing a mirror
-with one or more faulty devices.
-.TP
-.BR \-i ", " \-\-interval " "\fISeconds
-Report progress at regular intervals
-
-.SH EXAMPLES
-Resume polling of a pvmove operation identified by the Logical Volume vg00/pvmove0:
-.sp
-.B lvm lvpoll --polloperation pvmove vg00/pvmove0
-.P
-Abort the same pvmove operation:
-.sp
-.B lvm lvpoll --polloperation pvmove --abort vg00/pvmove0
-.P
-To find out the name of the pvmove Logical Volume resulting from an original
-\fBpvmove /dev/sda1\fP command you may use the following \fBlvs\fP command.
-(Remove the parentheses from the LV name.)
-.sp
-.B lvs -a -S move_pv=/dev/sda1
-.P
-Resume polling of mirror conversion vg00/lvmirror:
-.sp
-.B lvm lvpoll --polloperation convert vg00/lvmirror
-.P
-Complete mirror repair:
-.sp
-.B lvm lvpoll --polloperation convert vg/damaged_mirror --handlemissingpvs
-.P
-Process snapshot merge:
-.sp
-.B lvm lvpoll --polloperation merge vg/snapshot_old
-.P
-Finish thin snapshot merge:
-.sp
-.B lvm lvpoll --polloperation merge_thin vg/thin_snapshot
-.SH SEE ALSO
-.BR lvconvert (8),
-.BR lvm (8),
-.BR lvmpolld (8),
-.BR lvs (8),
-.BR pvmove (8)
diff --git a/man/lvmchange.8.in b/man/lvmchange.8.in
deleted file mode 100644
index dc6b3bd..0000000
--- a/man/lvmchange.8.in
+++ /dev/null
@@ -1,10 +0,0 @@
-.TH LVMCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvmchange \(em change attributes of the logical volume manager
-.SH SYNOPSIS
-.B lvmchange
-.SH DESCRIPTION
-lvmchange is not currently supported under LVM2, although
-\fBdmsetup\fP(8) has a \fBremove_all\fP command.
-.SH SEE ALSO
-.BR dmsetup (8)
diff --git a/man/lvmconfig.8.des b/man/lvmconfig.8.des
new file mode 100644
index 0000000..17f9f18
--- /dev/null
+++ b/man/lvmconfig.8.des
@@ -0,0 +1,3 @@
+lvmconfig produces formatted output from the LVM configuration tree. The
+sources of the configuration data include \fBlvm.conf\fP(5) and command
+line settings from \-\-config.
diff --git a/man/lvmconfig.8.in b/man/lvmconfig.8.in
deleted file mode 100644
index f4b6abd..0000000
--- a/man/lvmconfig.8.in
+++ /dev/null
@@ -1,225 +0,0 @@
-.TH "LVMCONFIG" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
-.SH "NAME"
-lvmconfig, lvm dumpconfig, lvm config \(em Display LVM configuration
-.SH SYNOPSIS
-.
-.ad l
-.B lvmconfig
-.RB [ \-f | \-\-file
-.IR Filename ]
-.RB [ \-\-type
-.RB { current | default | diff | full |\: list | missing | new \c
-.RB | profilable | profilable-command | profilable-metadata }]
-.RB [ \-\-atversion
-.IR Version ]
-.RB [ \-\-sinceversion
-.IR Version ]
-.RB [ \-\-ignoreadvanced ]
-.RB [ \-\-ignoreunsupported ]
-.RB [ \-\-ignorelocal ]
-.RB [ \-l | \-\-list ]
-.RB [ \-\-config
-.IR ConfigurationString ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-\-profile
-.IR ProfileName ]
-.RB [ \-\-metadataprofile
-.IR ProfileName ]
-.RB [ \-\-mergedconfig ]
-.RB [ \-\-showdeprecated ]
-.RB [ \-\-showunsupported ]
-.RB [ \-\-validate ]
-.RB [ \-\-withsummary ]
-.RB [ \-\-withcomments ]
-.RB [ \-\-withspaces ]
-.RB [ \-\-withversions ]
-.RB [ ConfigurationNode... ]
-.ad b
-.
-.SH DESCRIPTION
-lvmconfig produces formatted output from the LVM configuration tree.
-The command was added in release 2.02.119 and has an identical longer form
-\fBlvm dumpconfig\fP.
-
-.SH OPTIONS
-.TP
-.BR \-f ", " \-\-file " \fIFilename"
-Send output to a file named 'filename'.
-
-.TP
-.BR \-l ", " \-\-list
-List configuration settings with summarizing comment. This is the same as using
-\fBlvmconfig --type list --withsummary\fP.
-
-.TP
-.BR \-\-type " {" current | default | diff | full | missing | new | profilable |\: profilable-command | profilable-metadata }
-Select the type of configuration to display. The configuration settings
-displayed have either default values or currently-used values assigned based on
-the type selected. If no type is selected, \fB\-\-type current\fP is used
-by default. Whenever a configuration setting with a default value is
-commented out, it means the setting does not have any concrete default
-value defined. Output can be saved and used as a proper \fBlvm.conf\fP(5)
-file.
-.RS
-.IP \fBcurrent\fP 3
-Display the current \fBlvm.conf\fP configuration merged with any \fBtag
-config\fP if used. See also \fBlvm.conf\fP(5) for more info about LVM
-configuration methods.
-.IP \fBdefault\fP 3
-Display all possible configuration settings with default values assigned.
-.IP \fBdiff\fP 3
-Display all configuration settings for which the values used differ from defaults.
-The value assigned for each configuration setting is the value currently used.
-Using this type also implies the use of \fB\-\-mergedconfig\fP option.
-This is actually minimal LVM configuration which can be used without
-a change to current configured behaviour.
-.IP \fBfull\fP 3
-Display full configuration tree - a combination of current configuration tree
-(\fB\-\-type current\fP) and tree of settings for which default values are
-used (\fB\-\-type missing\fP). This is exactly the configuration tree that
-LVM2 uses during command execution. Using this type also implies
-the use of \fB\-\-mergedconfig\fP option. If comments are displayed
-(see \fB\-\-withcomments\fP and \fB\-\-withsummary\fP options), then
-for each setting found in existing configuration and for which defaults
-are not used, there's an extra comment line printed to denote this.
-.IP \fBlist\fP 3
-Display plain list of configuration settings.
-.IP \fBmissing\fP 3
-Display all configuration settings with default values assigned which are
-missing in the configuration currently used and for which LVM automatically
-fallbacks to using these default values.
-.IP \fBnew\fP 3
-Display all new configuration settings introduced in current LVM version
-or specific version as defined by \fB\-\-atversion\fP option.
-.IP \fBprofilable\fP 3
-Display all profilable configuration settings with default values assigned.
-See \fBlvm.conf\fP(5) for more info about \fBprofile config\fP method.
-.IP \fBprofilable-command\fP 3
-Display all profilable configuration settings with default values assigned
-that can be used in command profile. This is a subset of settings displayed
-by \fB\-\-type profilable\fP.
-.IP \fBprofilable-metadata\fP 3
-Display all profilable configuration settings with default values assigned
-that can be used in metadata profile. This is a subset of settings displayed
-by \fB\-\-type profilable\fP.
-.RE
-
-.TP
-.BI \-\-atversion " Version"
-Specify an LVM version in x.y.z format where x is the major version,
-the y is the minor version and z is the patchlevel (e.g. 2.2.106).
-When configuration is displayed, the configuration settings recognized
-at this LVM version will be considered only. This can be used
-to display a configuration that a certain LVM version understands and
-which does not contain any newer settings for which LVM would
-issue a warning message when checking the configuration.
-
-.TP
-.BI \-\-sinceversion " Version"
-Specify an LVM version in x.y.z format where x is the major version,
-the y is the minor version and z is the patchlevel (e.g. 2.2.106).
-This option is currently applicable only with \fB\-\-type new\fP
-to display all configuration settings introduced since given version.
-
-.TP
-.B \-\-ignoreadvanced
-Exclude advanced configuration settings from the output.
-
-.TP
-.B \-\-ignoreunsupported
-Exclude unsupported configuration settings from the output. These settings are
-either used for debugging and development purposes only or their support is not
-yet complete and they are not meant to be used in production. The \fBcurrent\fP
-and \fBdiff\fP types include unsupported settings in their output by default,
-all the other types ignore unsupported settings.
-
-.TP
-.B \-\-ignorelocal
-Ignore local section.
-
-.TP
-.BI \-\-config " ConfigurationString"
-Use \fIConfigurationString\fP to override existing configuration.
-This configuration is then applied for the lvmconfig command itself.
-See also \fBlvm.conf\fP(5) for more info about \fBconfig cascade\fP.
-
-.TP
-.BI \-\-commandprofile " ProfileName"
-Use \fIProfileName\fP to override existing configuration.
-This configuration is then applied for the lvmconfig command itself.
-See also \fB\-\-mergedconfig\fP option and \fBlvm.conf\fP(5) for
-more info about \fBconfig cascade\fP.
-
-.TP
-.BI \-\-profile " ProfileName"
-The same as using \fB\-\-commandprofile\fP but the configuration is not
-applied for the lvmconfig command itself.
-
-.TP
-.BI \-\-metadataprofile " ProfileName"
-Use \fIProfileName\fP to override existing configuration.
-The configuration defined in metadata profile has no effect for
-the lvmconfig command itself. lvmconfig displays the configuration only.
-See also \fB\-\-mergedconfig\fP option and \fBlvm.conf\fP(5) for more
-info about \fBconfig cascade\fP.
-
-.TP
-.B \-\-mergedconfig
-When the lvmconfig command is run with the \fB\-\-config\fP option
-and/or \fB\-\-commandprofile\fP (or using \fBLVM_COMMAND_PROFILE\fP
-environment variable), \fB\-\-profile\fP, \fB\-\-metadataprofile\fP
-option, merge all the contents of the \fBconfig cascade\fP before displaying it.
-Without the \fB\-\-mergeconfig\fP option used, only the configuration at
-the front of the cascade is displayed. See also \fBlvm.conf\fP(5) for more
-info about \fBconfig cascade\fP.
-
-.TP
-.B \-\-showdeprecated
-Include deprecated configuration settings in the output. These settings
-are always deprecated since certain version. If concrete version is specified
-with \fB--atversion\fP option, deprecated settings are automatically included
-if specified version is lower that the version in which the settings were
-deprecated. The \fBcurrent\fP and \fBdiff\fP types include deprecated settings
-int their output by default, all the other types ignore deprecated settings.
-
-.TP
-.B \-\-showunsupported
-Include unsupported configuration settings in the output. These settings
-are either used for debugging or development purposes only or their support
-is not yet complete and they are not meant to be used in production. The
-\fBcurrent\fP and \fBdiff\fP types include unsupported settings in their
-output by default, all the other types ignore unsupported settings.
-
-.TP
-.B \-\-validate
-Validate current configuration used and exit with appropriate
-return code. The validation is done only for the configuration
-at the front of the \fBconfig cascade\fP. To validate the whole
-merged configuration tree, use also the \fB\-\-mergedconfig\fP option.
-The validation is done even if \fBconfig/checks\fP \fBlvm.conf\fP(5)
-option is disabled.
-
-.TP
-.B \-\-withsummary
-Display a one line comment for each configuration node.
-
-.TP
-.B \-\-withcomments
-Display a full comment for each configuration node. For deprecated
-settings, also display comments about deprecation in addition.
-
-.TP
-.B \-\-withspaces
-Where appropriate, add more spaces in output for better readability.
-
-.TP
-.B \-\-withversions
-Also display a comment containing the version of introduction for
-each configuration node. If the setting is deprecated, also display
-the version since which it is deprecated.
-
-.SH SEE ALSO
-.BR lvm (8)
-.BR lvmconf (8)
-.BR lvm.conf (5)
diff --git a/man/lvmdiskscan.8.des b/man/lvmdiskscan.8.des
new file mode 100644
index 0000000..c1e87cc
--- /dev/null
+++ b/man/lvmdiskscan.8.des
@@ -0,0 +1,7 @@
+lvmdiskscan scans all SCSI, (E)IDE disks, multiple devices and a bunch of
+other block devices in the system looking for LVM PVs. The size reported
+is the real device size. Define a filter in \fBlvm.conf\fP(5) to restrict
+the scan to avoid a CD ROM, for example.
+
+This command is deprecated, use \fBpvs\fP instead.
+
diff --git a/man/lvmdiskscan.8.in b/man/lvmdiskscan.8.in
deleted file mode 100644
index 6de34c1..0000000
--- a/man/lvmdiskscan.8.in
+++ /dev/null
@@ -1,27 +0,0 @@
-.TH LVMDISKSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvmdiskscan \(em scan for all devices visible to LVM2
-.SH SYNOPSIS
-.B lvmdiskscan
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-l | \-\-lvmpartition ]
-.RB [ \-v | \-\-verbose ]
-.SH DESCRIPTION
-lvmdiskscan scans all SCSI, (E)IDE disks, multiple devices and a bunch
-of other block devices in the system looking for LVM physical volumes.
-The size reported is the real device size.
-Define a filter in \fBlvm.conf\fP(5) to restrict
-the scan to avoid a CD ROM, for example.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-l ", " \-\-lvmpartition
-Only reports Physical Volumes.
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvm.conf (5),
-.BR pvscan (8),
-.BR vgscan (8)
diff --git a/man/lvmlockd.8.in b/man/lvmlockd.8.in
index f01c695..6e9b703 100644
--- a/man/lvmlockd.8.in
+++ b/man/lvmlockd.8.in
@@ -573,25 +573,37 @@ To place the lvmlock LV on a specific device, create the VG with only that
device, then use vgextend to add other devices.
-.SS shared LVs
-
-When an LV is used concurrently from multiple hosts (e.g. by a
-multi\-host/cluster application or file system), the LV can be activated
-on multiple hosts concurrently using a shared lock.
-
-To activate the LV with a shared lock: lvchange \-asy vg/lv.
-
-With lvmlockd, an unspecified activation mode is always exclusive, i.e.
-\-ay defaults to \-aey.
-
-If the LV type does not allow the LV to be used concurrently from multiple
-hosts, then a shared activation lock is not allowed and the lvchange
-command will report an error. LV types that cannot be used concurrently
+.SS LV activation
+
+In a shared VG, activation changes involve locking through lvmlockd, and
+the following values are possible with lvchange/vgchange -a:
+
+.IP \fBy\fP|\fBey\fP
+The command activates the LV in exclusive mode, allowing a single host
+to activate the LV. Before activating the LV, the command uses lvmlockd
+to acquire an exclusive lock on the LV. If the lock cannot be acquired,
+the LV is not activated and an error is reported. This would happen if
+the LV is active on another host.
+
+.IP \fBsy\fP
+The command activates the LV in shared mode, allowing multiple hosts to
+activate the LV concurrently. Before activating the LV, the
+command uses lvmlockd to acquire a shared lock on the LV. If the lock
+cannot be acquired, the LV is not activated and an error is reported.
+This would happen if the LV is active exclusively on another host. If the
+LV type prohibits shared access, such as a snapshot, the command will
+report an error and fail.
+The shared mode is intended for a multi\-host/cluster application or
+file system.
+LV types that cannot be used concurrently
from multiple hosts include thin, cache, raid, mirror, and snapshot.
-
lvextend on LV with shared locks is not yet allowed. The LV must be
deactivated, or activated exclusively to run lvextend.
+.IP \fBn\fP
+The command deactivates the LV. After deactivating the LV, the command
+uses lvmlockd to release the current lock on the LV.
+
.SS recover from lost PV holding sanlock locks
diff --git a/man/lvmsadc.8.des b/man/lvmsadc.8.des
new file mode 100644
index 0000000..e4cfd8d
--- /dev/null
+++ b/man/lvmsadc.8.des
@@ -0,0 +1,3 @@
+lvmsadc is not currently supported in LVM. The device-mapper statistics
+facility provides similar performance metrics using the \fBdmstats(8)\fP
+command.
diff --git a/man/lvmsadc.8.in b/man/lvmsadc.8.in
deleted file mode 100644
index 81d2b66..0000000
--- a/man/lvmsadc.8.in
+++ /dev/null
@@ -1,16 +0,0 @@
-.TH "LVMSADC" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
-
-.SH "NAME"
-lvmsadc \(em LVM system activity data collector
-
-.SH "SYNOPSIS"
-.B lvmsadc
-
-.SH "DESCRIPTION"
-lvmsadc is not currently supported under LVM2: the device-mapper statistics
-facility provides similar performance metrics using the \fBdmstats(8)\fP
-command.
-
-.SH "SEE ALSO"
-.BR dmstats (8)
-.BR lvm (8)
diff --git a/man/lvmsar.8.des b/man/lvmsar.8.des
new file mode 100644
index 0000000..3177506
--- /dev/null
+++ b/man/lvmsar.8.des
@@ -0,0 +1,3 @@
+lvmsar is not currently supported in LVM. The device-mapper statistics
+facility provides similar performance metrics using the \fBdmstats(8)\fP
+command.
diff --git a/man/lvmsar.8.in b/man/lvmsar.8.in
deleted file mode 100644
index fca111f..0000000
--- a/man/lvmsar.8.in
+++ /dev/null
@@ -1,16 +0,0 @@
-.TH "LVMSAR" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
-
-.SH "NAME"
-lvmsar \(em LVM system activity reporter
-
-.SH "SYNOPSIS"
-.B lvmsar
-
-.SH "DESCRIPTION"
-lvmsar is not currently supported under LVM2: the device-mapper statistics
-facility provides similar performance metrics using the \fBdmstats(8)\fP
-command.
-
-.SH "SEE ALSO"
-.BR dmstats (8)
-.BR lvm (8)
diff --git a/man/lvreduce.8.des b/man/lvreduce.8.des
new file mode 100644
index 0000000..7f0ba0c
--- /dev/null
+++ b/man/lvreduce.8.des
@@ -0,0 +1,14 @@
+lvreduce reduces the size of an LV. The freed logical extents are returned
+to the VG to be used by other LVs. A copy\-on\-write snapshot LV can also
+be reduced if less space is needed to hold COW blocks. Use
+\fBlvconvert\fP(8) to change the number of data images in a RAID or
+mirrored LV.
+
+Be careful when reducing an LV's size, because data in the reduced area is
+lost. Ensure that any file system on the LV is resized \fBbefore\fP
+running lvreduce so that the removed extents are not in use by the file
+system.
+
+Sizes will be rounded if necessary. For example, the LV size must be an
+exact number of extents, and the size of a striped segment must be a
+multiple of the number of stripes.
diff --git a/man/lvreduce.8.end b/man/lvreduce.8.end
new file mode 100644
index 0000000..59fde52
--- /dev/null
+++ b/man/lvreduce.8.end
@@ -0,0 +1,5 @@
+.SH EXAMPLES
+
+Reduce the size of an LV by 3 logical extents:
+.br
+.B lvreduce \-l \-3 vg00/lvol1
diff --git a/man/lvreduce.8.in b/man/lvreduce.8.in
deleted file mode 100644
index edf0c92..0000000
--- a/man/lvreduce.8.in
+++ /dev/null
@@ -1,110 +0,0 @@
-.TH LVREDUCE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvreduce \(em reduce the size of a logical volume
-.SH SYNOPSIS
-.B lvreduce
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-f | \-\-force ]
-.RB [ \-\-noudevsync ]
-.RB { \-l | \-\-extents
-.RI [ \- ] LogicalExtentsNumber [ % { VG | LV | FREE | ORIGIN }]
-.RB |
-.BR \-L | \-\-size
-.RI [ \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]}
-.RB [ \-n | \-\-nofsck ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-r | \-\-resizefs ]
-.IR LogicalVolume { Name | Path }
-.SH DESCRIPTION
-lvreduce allows you to reduce the size of a logical volume.
-Be careful when reducing a logical volume's size, because data in the
-reduced part is lost!!!
-.br
-You should therefore ensure that any filesystem on the volume is
-resized
-.I before
-running lvreduce so that the extents that are to be removed are not in use.
-.br
-Shrinking snapshot logical volumes (see
-.BR lvcreate (8)
-for information to create snapshots) is supported as well.
-But to change the number of copies in a mirrored logical
-volume use
-.BR lvconvert (8).
-.br
-Sizes will be rounded if necessary - for example, the volume size must
-be an exact number of extents and the size of a striped segment must
-be a multiple of the number of stripes.
-.br
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-f ", " \-\-force
-Force size reduction without prompting even when it may cause data loss.
-.TP
-.IR \fB\-l ", " \fB\-\-extents " [" \- ] LogicalExtentsNumber [ % { VG | LV | FREE | ORIGIN }]
-Reduce or set the logical volume size in units of logical extents.
-With the \fI-\fP sign the value will be subtracted from
-the logical volume's actual size and without it the value will be taken
-as an absolute size.
-The total number of physical extents freed will be greater than this logical
-value if, for example, the volume is mirrored.
-The number can also be expressed as a percentage of the total space
-in the Volume Group with the suffix \fI%VG\fP, relative to the existing
-size of the Logical Volume with the suffix \fI%LV\fP, as a percentage of the
-remaining free space in the Volume Group with the suffix \fI%FREE\fP, or (for
-a snapshot) as a percentage of the total space in the Origin Logical
-Volume with the suffix \fI%ORIGIN\fP.
-The resulting value for the subtraction is rounded downward, for the absolute
-size it is rounded upward.
-N.B. In a future release, when expressed as a percentage with VG or FREE, the
-number will be treated as an approximate total number of physical extents to be
-freed (including extents used by any mirrors, for example). The code may
-currently release more space than you might otherwise expect.
-.TP
-.IR \fB\-L ", " \fB\-\-size " [" \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]
-Reduce or set the logical volume size in units of megabytes.
-A size suffix of \fIk\fP for kilobyte, \fIm\fP for megabyte,
-\fIg\fP for gigabytes, \fIt\fP for terabytes, \fIp\fP for petabytes
-or \fIe\fP for exabytes is optional.
-With the \fI\-\fP sign the value will be subtracted from
-the logical volume's actual size and without it it will be taken as
-an absolute size.
-.TP
-.BR \-n ", " \-\-nofsck
-Do not perform fsck before resizing filesystem when filesystem
-requires it. You may need to use \fB\-\-force\fR to proceed with
-this option.
-.TP
-.BR \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.TP
-.BR \-r ", " \-\-resizefs
-Resize underlying filesystem together with the logical volume using
-.BR fsadm (8).
-.SH Examples
-Reduce the size of logical volume lvol1 in volume group vg00 by 3 logical extents:
-.sp
-.B lvreduce \-l \-3 vg00/lvol1
-.SH SEE ALSO
-.BR fsadm (8),
-.BR lvchange (8),
-.BR lvconvert (8),
-.BR lvcreate (8),
-.BR lvextend (8),
-.BR lvm (8),
-.BR lvresize (8),
-.BR vgreduce (8)
diff --git a/man/lvremove.8.des b/man/lvremove.8.des
new file mode 100644
index 0000000..d049c63
--- /dev/null
+++ b/man/lvremove.8.des
@@ -0,0 +1,22 @@
+lvremove removes one or more LVs. For standard LVs, this returns the
+logical extents that were used by the LV to the VG for use by other LVs.
+
+Confirmation will be requested before deactivating any active LV prior to
+removal. LVs cannot be deactivated or removed while they are open (e.g.
+if they contain a mounted filesystem). Removing an origin LV will also
+remove all dependent snapshots.
+
+\fBHistorical LVs\fP
+
+If the configuration setting \fBmetadata/record_lvs_history\fP is enabled
+and the LV being removed forms part of the history of at least one LV that
+is still present, then a simplified representation of the LV will be
+retained. This includes the time of removal (\fBlv_time_removed\fP
+reporting field), creation time (\fBlv_time\fP), name (\fBlv_name\fP), LV
+uuid (\fBlv_uuid\fP) and VG name (\fBvg_name\fP). This allows later
+reporting to see the ancestry chain of thin snapshot volumes, even after
+some intermediate LVs have been removed. The names of such historical LVs
+acquire a hyphen as a prefix (e.g. '-lvol1') and cannot be reactivated.
+Use lvremove a second time, with the hyphen, to remove the record of the
+former LV completely.
+
diff --git a/man/lvremove.8.end b/man/lvremove.8.end
new file mode 100644
index 0000000..5c70ed6
--- /dev/null
+++ b/man/lvremove.8.end
@@ -0,0 +1,11 @@
+.SH EXAMPLES
+
+Remove an active LV without asking for confirmation.
+.br
+.B lvremove \-f vg00/lvol1
+
+Remove all LVs the specified VG.
+.br
+.B lvremove vg00
+
+
diff --git a/man/lvremove.8.in b/man/lvremove.8.in
deleted file mode 100644
index fe9375c..0000000
--- a/man/lvremove.8.in
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH LVREMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvremove \(em remove a logical volume
-.SH SYNOPSIS
-.B lvremove
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-\-nohistory ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-f | \-\-force ]
-.RB [ \-\-noudevsync ]
-.RI [ LogicalVolume { Name | Path }...]
-.SH DESCRIPTION
-lvremove removes one or more logical volumes.
-Confirmation will be requested before deactivating any active logical
-volume prior to removal. Logical volumes cannot be deactivated
-or removed while they are open (e.g. if they contain a mounted filesystem).
-Removing an origin logical volume will also remove all dependent snapshots.
-.sp
-If the logical volume is clustered then it must be deactivated on all
-nodes in the cluster before it can be removed. A single lvchange command
-issued from one node can do this.
-.sp
-If the configuration setting \fBmetadata/record_lvs_history\fP is enabled
-and the logical volume being removed forms part of the history of at least
-one logical volume that is still present then a simplified representation of
-the logical volume will be retained. This includes the time of removal
-(\fBlv_time_removed\fP reporting field), creation time (\fBlv_time\fP), name
-(\fBlv_name\fP), LV uuid (\fBlv_uuid\fP) and VG name (\fBvg_name\fP) and
-allows you to see the ancestry chain of thin snapshot volumes even after
-some intermediate logical volumes have been removed.
-The names of such historical logical volumes acquire a hyphen as a prefix
-(e.g. '-lvol1') and cannot be reactivated. Use lvremove a second time,
-with the hyphen, to remove the record of the former logical volume completely.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-f ", " \-\-force
-Remove active logical volumes without confirmation.
-Tool will try to deactivate \fIunused\fP volume.
-To proceed with damaged pools use \-ff
-.TP
-.B \-\-nohistory
-Disable the recording of history of logical volumes which are being removed.
-(This has no effect unless the configuration setting
-\fBmetadata/record_lvs_history\fP is enabled.)
-.TP
-.B \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.SH Examples
-Remove the active logical volume lvol1 in volume group vg00
-without asking for confirmation:
-.sp
-.B lvremove \-f vg00/lvol1
-.sp
-Remove all logical volumes in volume group vg00:
-.sp
-.B lvremove vg00
-.SH SEE ALSO
-.BR lvcreate (8),
-.BR lvdisplay (8),
-.BR lvchange (8),
-.BR lvm (8),
-.BR lvs (8),
-.BR lvscan (8),
-.BR vgremove (8)
diff --git a/man/lvrename.8.des b/man/lvrename.8.des
new file mode 100644
index 0000000..a8455fc
--- /dev/null
+++ b/man/lvrename.8.des
@@ -0,0 +1,2 @@
+lvrename renames an existing LV or a historical LV (see \fBlvremove\fP for
+historical LV information.)
diff --git a/man/lvrename.8.end b/man/lvrename.8.end
new file mode 100644
index 0000000..3409b8a
--- /dev/null
+++ b/man/lvrename.8.end
@@ -0,0 +1,10 @@
+.SH EXAMPLES
+
+Rename "lvold" to "lvnew":
+.br
+.B lvrename /dev/vg02/lvold vg02/lvnew
+
+An alternate syntax to rename "lvold" to "lvnew":
+.br
+.B lvrename vg02 lvold lvnew
+
diff --git a/man/lvrename.8.in b/man/lvrename.8.in
deleted file mode 100644
index de6e519..0000000
--- a/man/lvrename.8.in
+++ /dev/null
@@ -1,51 +0,0 @@
-.TH LVRENAME 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvrename \(em rename a logical volume
-.SH SYNOPSIS
-.B lvrename
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-f | \-\-force ]
-.RB [ \-\-noudevsync ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RI { OldLogicalVolume { Name | Path }
-.IR NewLogicalVolume { Name | Path }
-|
-.I VolumeGroupName OldLogicalVolumeName NewLogicalVolumeName\fR}
-.SH DESCRIPTION
-lvrename renames an existing logical volume or an existing
-historical logical volume from
-.IR OldLogicalVolume { Name | Path }
-to
-.IR NewLogicalVolume { Name | Path }.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.SH EXAMPLE
-To rename lvold in volume group vg02 to lvnew:
-.sp
-.B lvrename /dev/vg02/lvold vg02/lvnew
-.sp
-An alternate syntax to rename this logical volume is:
-.sp
-.B lvrename vg02 lvold lvnew
-.sp
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvchange (8),
-.BR vgcreate (8),
-.BR vgrename (8)
diff --git a/man/lvresize.8.des b/man/lvresize.8.des
new file mode 100644
index 0000000..7fdcacc
--- /dev/null
+++ b/man/lvresize.8.des
@@ -0,0 +1,2 @@
+lvresize resizes an LV in the same way as lvextend and lvreduce. See
+\fBlvextend\fP(8) and \fBlvreduce\fP(8) for more information.
diff --git a/man/lvresize.8.end b/man/lvresize.8.end
new file mode 100644
index 0000000..a336d62
--- /dev/null
+++ b/man/lvresize.8.end
@@ -0,0 +1,6 @@
+.SH EXAMPLES
+
+Extend an LV by 16MB using specific physical extents:
+.br
+.B lvresize \-L+16M vg1/lv1 /dev/sda:0\-1 /dev/sdb:0\-1
+
diff --git a/man/lvresize.8.in b/man/lvresize.8.in
deleted file mode 100644
index 9cdb787..0000000
--- a/man/lvresize.8.in
+++ /dev/null
@@ -1,124 +0,0 @@
-.TH LVRESIZE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvresize \(em resize a logical volume
-.SH SYNOPSIS
-.B lvresize
-.RB [ \-\-alloc " " \fIAllocationPolicy ]
-.RB [ \-\-noudevsync ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-i | \-\-stripes " " \fIStripes
-.RB [ \-I | \-\-stripesize " " \fIStripeSize ]]
-.RB { \-l | \-\-extents
-.RI [ + | \- ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN "}] |"
-.BR \-L | \-\-size
-.RI [ + | \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]}
-.RB [ \-\-poolmetadatasize
-.RI [ + ] MetadataVolumeSize [ bBsSkKmMgG ]]
-.RB [ \-f | \-\-force ]
-.RB [ \-n | \-\-nofsck ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-r | \-\-resizefs ]
-.IR LogicalVolume { Name | Path }
-.RI [ PhysicalVolumePath [ :PE [ \-PE ]]...]
-.SH DESCRIPTION
-lvresize allows you to resize a logical volume.
-Be careful when reducing a logical volume's size, because data in the reduced
-part is lost!!!
-You should therefore ensure that any filesystem on the volume is
-shrunk first so that the extents that are to be removed are not in use.
-Resizing snapshot logical volumes (see
-.BR lvcreate (8)
-for information about creating snapshots) is supported as well.
-But to change the number of copies in a mirrored logical
-volume use
-.BR lvconvert (8).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-f ", " \-\-force
-Force resize without prompting even when it may cause data loss.
-.TP
-.BR \-n ", " \-\-nofsck
-Do not perform fsck before resizing filesystem when filesystem
-requires it. You may need to use \fB\-\-force\fR to proceed with
-this option.
-.TP
-.BR \-r ", " \-\-resizefs
-Resize underlying filesystem together with the logical volume using
-\fBfsadm\fR(8).
-.TP
-.IR \fB\-l ", " \fB\-\-extents " [" + | \- ] LogicalExtentsNumber [ % { VG | LV | PVS | FREE | ORIGIN }]
-Change or set the logical volume size in units of logical extents.
-With the \fI+\fP or \fI\-\fP sign the value is added to or subtracted from the actual size
-of the logical volume and without it, the value is taken as an absolute one.
-The total number of physical extents affected will be
-greater than this if, for example, the volume is mirrored.
-The number can also be expressed as a percentage of the total space
-in the Volume Group with the suffix \fI%VG\fP, relative to the existing
-size of the Logical Volume with the suffix \fI%LV\fP, as a percentage of
-the remaining free space of the PhysicalVolumes on the command line with the
-suffix \fI%PVS\fP, as a percentage of the remaining free space in the
-Volume Group with the suffix \fI%FREE\fP, or (for a snapshot) as a percentage
-of the total space in the Origin Logical Volume with the suffix \fI%ORIGIN\fP.
-The resulting value is rounded downward for the subtraction otherwise
-it is rounded upward.
-N.B. In a future release, when expressed as a percentage with PVS, VG or FREE,
-the number will be treated as an approximate total number of physical extents
-to be allocated or freed (including extents used by any mirrors, for example).
-The code may currently allocate or remove more space than you might otherwise
-expect.
-.TP
-.IR \fB\-L ", " \fB\-\-size " [" + | \- ] LogicalVolumeSize [ bBsSkKmMgGtTpPeE ]
-Change or set the logical volume size in units of megabytes.
-A size suffix of \fIM\fP for megabytes,
-\fIG\fP for gigabytes, \fIT\fP for terabytes, \fIP\fP for petabytes
-or \fIE\fP for exabytes is optional.
-With the \fI+\fP or \fI\-\fP sign the value is added or subtracted
-from the actual size of the logical volume and rounded
-to the full extent size and without it,
-the value is taken as an absolute one.
-.TP
-.BR \-i ", " \-\-stripes " " \fIStripes
-Gives the number of stripes to use when extending a Logical Volume.
-Defaults to whatever the last segment of the Logical Volume uses.
-Not applicable to LVs using the original metadata LVM format, which must
-use a single value throughout.
-.TP
-.IR \fB\-\-poolmetadatasize " [" + ] MetadataVolumeSize [ bBsSkKmMgG ]
-Change or set the thin pool metadata logical volume size.
-With the \fI+\fP sign the value is added to the actual size
-of the metadata volume and rounded to the full extent size
-and without it, the value is taken as an absolute one.
-Maximal size is 16GiB. Default unit is megabytes.
-.TP
-.BR \-I ", " \-\-stripesize " " \fIStripeSize
-Gives the number of kilobytes for the granularity of the stripes.
-Defaults to whatever the last segment of the Logical Volume uses.
-Not applicable to LVs using the original metadata LVM format, which
-must use a single value throughout.
-.br
-StripeSize must be 2^n (n = 2 to 9) for metadata in LVM1 format.
-For metadata in LVM2 format, the stripe size may be a larger
-power of 2 but must not exceed the physical extent size.
-.TP
-.B \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.SH EXAMPLES
-.br
-Extend a logical volume vg1/lv1 by 16MB using physical extents
-/dev/sda:0\-1 and /dev/sdb:0\-1 for allocation of extents:
-.sp
-.B lvresize \-L+16M vg1/lv1 /dev/sda:0\-1 /dev/sdb:0\-1
-.SH SEE ALSO
-.BR fsadm (8),
-.BR lvm (8),
-.BR lvconvert (8),
-.BR lvcreate (8),
-.BR lvreduce (8),
-.BR lvchange (8)
diff --git a/man/lvs.8.des b/man/lvs.8.des
new file mode 100644
index 0000000..5f80764
--- /dev/null
+++ b/man/lvs.8.des
@@ -0,0 +1 @@
+lvs produces formatted output about LVs.
diff --git a/man/lvs.8.end b/man/lvs.8.end
new file mode 100644
index 0000000..d71f7c1
--- /dev/null
+++ b/man/lvs.8.end
@@ -0,0 +1,75 @@
+.SH NOTES
+.
+The lv_attr bits are:
+.IP 1 3
+Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin,
+(O)rigin with merging snapshot, (r)aid, (R)aid without initial sync,
+(s)napshot, merging (S)napshot, (p)vmove, (v)irtual,
+mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device,
+under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, raid or
+pool m(e)tadata or pool metadata spare.
+.IP 2 3
+Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only
+volume
+.IP 3 3
+Allocation policy: (a)nywhere, (c)ontiguous, (i)nherited, c(l)ing, (n)ormal
+This is capitalised if the volume is currently locked against allocation
+changes, for example during
+.BR pvmove (8).
+.IP 4 3
+fixed (m)inor
+.IP 5 3
+State: (a)ctive, (h)istorical, (s)uspended, (I)nvalid snapshot,
+invalid (S)uspended snapshot, snapshot (m)erge failed,
+suspended snapshot (M)erge failed, mapped (d)evice present without tables,
+mapped device present with (i)nactive table, thin-pool (c)heck needed,
+suspended thin-pool (C)heck needed, (X) unknown
+.IP 6 3
+device (o)pen, (X) unknown
+.IP 7 3
+Target type: (C)ache, (m)irror, (r)aid, (s)napshot, (t)hin, (u)nknown, (v)irtual.
+This groups logical volumes related to the same kernel target together. So,
+for example, mirror images, mirror logs as well as mirrors themselves appear as
+(m) if they use the original device-mapper mirror kernel driver; whereas the raid
+equivalents using the md raid kernel driver all appear as (r).
+Snapshots using the original device-mapper driver appear as (s); whereas
+snapshots of thin volumes using the new thin provisioning driver appear as (t).
+.IP 8 3
+Newly-allocated data blocks are overwritten with blocks of (z)eroes before use.
+.IP 9 3
+Volume Health, where there are currently three groups of attributes identified:
+.IP
+Common ones for all Logical Volumes: (p)artial, (X) unknown.
+.br
+(p)artial signifies that one or more of the Physical Volumes this Logical
+Volume uses is missing from the system. (X) unknown signifies the status
+is unknown.
+.IP
+Related to RAID Logical Volumes: (r)efresh needed, (m)ismatches exist, (w)ritemostly.
+.br
+(r)efresh signifies that one or more of the Physical Volumes this RAID Logical
+Volume uses had suffered a write error. The write error could be due to a
+temporary failure of that Physical Volume or an indication that it is failing.
+The device should be refreshed or replaced. (m)ismatches signifies that the
+RAID logical volume has portions of the array that are not coherent.
+Inconsistencies are detected by initiating a "check" on a RAID logical volume.
+(The scrubbing operations, "check" and "repair", can be performed on a RAID
+logical volume via the 'lvchange' command.) (w)ritemostly signifies the
+devices in a RAID 1 logical volume that have been marked write-mostly.
+.IP
+Related to Thin pool Logical Volumes: (F)ailed, out of (D)ata space,
+(M)etadata read only.
+.br
+(F)ailed is set if thin pool encounters serious failures and hence no further I/O
+is permitted at all. The out of (D)ata space is set if thin pool has run out of
+data space. (M)etadata read only signifies that thin pool encounters certain
+types of failures but it's still possible to do reads at least,
+but no metadata changes are allowed.
+.IP
+Related to Thin Logical Volumes: (F)ailed.
+.br
+(F)ailed is set when related thin pool enters Failed state and no further I/O
+is permitted at all.
+.IP 10 3
+s(k)ip activation: this volume is flagged to be skipped during activation.
+
diff --git a/man/lvs.8.in b/man/lvs.8.in
deleted file mode 100644
index 48ef866..0000000
--- a/man/lvs.8.in
+++ /dev/null
@@ -1,290 +0,0 @@
-.TH LVS 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvs \(em report information about logical volumes
-.SH SYNOPSIS
-.B lvs
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-a | \-\-all ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-H | \-\-history ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-logonly ]
-.RB [ \-\-nameprefixes ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RI [ + | \- ] Key1 [,[ + | \- ] Key2 [,...]]]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-rows ]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-segments ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-\-unquoted ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName | LogicalVolume { Name | Path }
-.RI [ VolumeGroupName | LogicalVolume { Name | Path }\ ...]]
-
-.SH DESCRIPTION
-lvs produces formatted output about logical volumes.
-.SH OPTIONS
-See
-.BR lvm (8)
-for common options.
-.TP
-.B \-\-aligned
-Use with \fB\-\-separator\fP to align the output columns.
-.TP
-.B \-\-all
-Include information in the output about internal Logical Volumes that
-are components of normally-accessible Logical Volumes, such as mirrors,
-but which are not independently accessible (e.g. not mountable).
-The names of such Logical Volumes are enclosed within square brackets
-in the output. For example, after creating a mirror using
-.B lvcreate -m1 \-\-mirrorlog disk
-, this option will reveal three internal Logical
-Volumes, with suffixes mimage_0, mimage_1, and mlog.
-.TP
-.B \-\-binary
-Use binary values "0" or "1" instead of descriptive literal values
-for columns that have exactly two valid values to report (not counting
-the "unknown" value which denotes that the value could not be determined).
-.TP
-.B \-\-configreport \fI ReportName
-Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
-\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
-is either 'lv' for command's main report or 'log' for log report.
-If \fB\-\-configreport\fP option is not used to identify a report, then
-command's main report is assumed. The log report is available only if
-enabled by \fBlog/report_command_log\fP \fBlvm.conf\fP(5) setting or
-if \fB\-\-logonly\fP option is used.
-.TP
-.B \-H ", " \-\-history
-Include historical logical volumes in the output.
-(This has no effect unless logical volumes were removed while the configuration
-setting \fBmetadata/record_lvs_history\fP was enabled.)
-.TP
-.B \-\-logonly
-Suppress the lvs report itself and display only log report on output.
-.TP
-.B \-\-nameprefixes
-Add an "LVM2_" prefix plus the field name to the output. Useful
-with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
-be used to set environment variables (for example, in
-.BR udev (7)
-rules).
-.TP
-.B \-\-noheadings
-Suppress the headings line that is normally the first line of output.
-Useful if grepping the output.
-.TP
-.B \-\-nosuffix
-Suppress the suffix on output sizes. Use with \fB\-\-units\fP
-(except h and H) if processing the output.
-.TP
-.BR \-o ", " \-\-options
-Comma-separated ordered list of columns.
-.IP
-Precede the list with '\fI+\fP' to append to the current list
-of columns, '\fI-\fP' to remove from the current list of columns
-or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
-be repeated, providing several lists. These lists are evaluated
-from left to right.
-.IP
-Use \fB\-o lv_all\fP to select all logical volume columns,
-and \fB\-o seg_all\fP
-to select all logical volume segment columns.
-.IP
-Use \fB\-o help\fP to view the full list of columns available.
-.IP
-Column names include:
-chunk_size,
-convert_lv,
-copy_percent,
-data_lv,
-devices,
-discards,
-lv_attr,
-lv_host,
-lv_kernel_major,
-lv_kernel_minor,
-lv_kernel_read_ahead,
-lv_major,
-lv_minor,
-lv_name,
-lv_path,
-lv_profile,
-lv_read_ahead,
-lv_size,
-lv_tags,
-lv_time,
-lv_uuid,
-metadata_lv,
-mirror_log,
-modules,
-move_pv,
-origin,
-origin_size,
-pool_lv,
-raid_max_recovery_rate,
-raid_min_recovery_rate,
-raid_mismatch_count,
-raid_sync_action,
-raid_write_behind,
-region_size,
-segtype,
-seg_count,
-seg_pe_ranges,
-seg_size,
-seg_size_pe,
-seg_start,
-seg_start_pe,
-seg_tags,
-snap_percent,
-stripes,
-stripe_size,
-sync_percent,
-thin_count,
-transaction_id,
-zero.
-.IP
-With \fB\-\-segments\fP, any "seg_" prefixes are optional;
-otherwise any "lv_" prefixes are optional. Columns mentioned in
-.BR vgs (8)
-can also be chosen.
-.IP
-The lv_attr bits are:
-.RS
-.IP 1 3
-Volume type: (C)ache, (m)irrored, (M)irrored without initial sync, (o)rigin,
-(O)rigin with merging snapshot, (r)aid, (R)aid without initial sync,
-(s)napshot, merging (S)napshot, (p)vmove, (v)irtual,
-mirror or raid (i)mage, mirror or raid (I)mage out-of-sync, mirror (l)og device,
-under (c)onversion, thin (V)olume, (t)hin pool, (T)hin pool data, raid or
-pool m(e)tadata or pool metadata spare.
-.IP 2 3
-Permissions: (w)riteable, (r)ead-only, (R)ead-only activation of non-read-only
-volume
-.IP 3 3
-Allocation policy: (a)nywhere, (c)ontiguous, (i)nherited, c(l)ing, (n)ormal
-This is capitalised if the volume is currently locked against allocation
-changes, for example during
-.BR pvmove (8).
-.IP 4 3
-fixed (m)inor
-.IP 5 3
-State: (a)ctive, (h)istorical, (s)uspended, (I)nvalid snapshot,
-invalid (S)uspended snapshot, snapshot (m)erge failed,
-suspended snapshot (M)erge failed, mapped (d)evice present without tables,
-mapped device present with (i)nactive table, thin-pool (c)heck needed,
-suspended thin-pool (C)heck needed, (X) unknown
-.IP 6 3
-device (o)pen, (X) unknown
-.IP 7 3
-Target type: (C)ache, (m)irror, (r)aid, (s)napshot, (t)hin, (u)nknown, (v)irtual.
-This groups logical volumes related to the same kernel target together. So,
-for example, mirror images, mirror logs as well as mirrors themselves appear as
-(m) if they use the original device-mapper mirror kernel driver; whereas the raid
-equivalents using the md raid kernel driver all appear as (r).
-Snapshots using the original device-mapper driver appear as (s); whereas
-snapshots of thin volumes using the new thin provisioning driver appear as (t).
-.IP 8 3
-Newly-allocated data blocks are overwritten with blocks of (z)eroes before use.
-.IP 9 3
-Volume Health, where there are currently three groups of attributes identified:
-.IP
-Common ones for all Logical Volumes: (p)artial, (X) unknown.
-.br
-(p)artial signifies that one or more of the Physical Volumes this Logical
-Volume uses is missing from the system. (X) unknown signifies the status
-is unknown.
-.IP
-Related to RAID Logical Volumes: (r)efresh needed, (m)ismatches exist, (w)ritemostly.
-.br
-(r)efresh signifies that one or more of the Physical Volumes this RAID Logical
-Volume uses had suffered a write error. The write error could be due to a
-temporary failure of that Physical Volume or an indication that it is failing.
-The device should be refreshed or replaced. (m)ismatches signifies that the
-RAID logical volume has portions of the array that are not coherent.
-Inconsistencies are detected by initiating a "check" on a RAID logical volume.
-(The scrubbing operations, "check" and "repair", can be performed on a RAID
-logical volume via the 'lvchange' command.) (w)ritemostly signifies the
-devices in a RAID 1 logical volume that have been marked write-mostly.
-.IP
-Related to Thin pool Logical Volumes: (F)ailed, out of (D)ata space,
-(M)etadata read only.
-.br
-(F)ailed is set if thin pool encounters serious failures and hence no further I/O
-is permitted at all. The out of (D)ata space is set if thin pool has run out of
-data space. (M)etadata read only signifies that thin pool encounters certain
-types of failures but it's still possible to do reads at least,
-but no metadata changes are allowed.
-.IP
-Related to Thin Logical Volumes: (F)ailed.
-.br
-(F)ailed is set when related thin pool enters Failed state and no further I/O
-is permitted at all.
-.IP 10 3
-s(k)ip activation: this volume is flagged to be skipped during activation.
-.RE
-.TP
-.BR \-O ", " \-\-sort
-Comma-separated ordered list of columns to sort by. Replaces the default
-selection. Precede any column with '\fI\-\fP' for a reverse sort on that column.
-.TP
-.B \-\-rows
-Output columns as rows.
-.TP
-.BR \-S ", " \-\-select " " \fISelection
-Display only rows that match Selection criteria. All rows are displayed with
-the additional "selected" column (\fB-o selected\fP) showing 1 if the row
-matches the Selection and 0 otherwise. The Selection criteria are defined
-by specifying column names and their valid values (that can include reserved
-values) while making use of supported comparison operators. See \fBlvm\fP(8)
-and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
-about constructing the Selection criteria. As a quick help and to see full
-list of column names that can be used in Selection including the list of
-reserved values and the set of supported selection operators, check the
-output of \fBlvs -S help\fP command.
-.TP
-.B \-\-segments
-Use default columns that emphasize segment information.
-.TP
-.B \-\-separator \fISeparator
-String to use to separate each column. Useful if grepping the output.
-.TP
-.B \-\-unbuffered
-Produce output immediately without sorting or aligning the columns properly.
-.TP
-.B \-\-units \fIhHbBsSkKmMgGtTpPeE
-All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
-(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
-Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
-custom units e.g. \fB\-\-units 3M\fP
-.TP
-.B \-\-unquoted
-When used with \fB\-\-nameprefixes\fP, output values in the field=value
-pairs are not quoted.
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvdisplay (8),
-.BR pvs (8),
-.BR vgs (8)
diff --git a/man/lvscan.8.des b/man/lvscan.8.des
new file mode 100644
index 0000000..e30eb58
--- /dev/null
+++ b/man/lvscan.8.des
@@ -0,0 +1,5 @@
+lvscan scans all VGs or all supported LVM block devices in the system for
+LVs. The output consists of one line for each LV indicating whether or not
+it is active, a snapshot or origin, the size of the device and its
+allocation policy. Use \fBlvs\fP(8) or \fBlvdisplay\fP(8) to obtain more
+comprehensive information about LVs.
diff --git a/man/lvscan.8.in b/man/lvscan.8.in
deleted file mode 100644
index 5710e3c..0000000
--- a/man/lvscan.8.in
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH LVSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-lvscan \(em scan (all disks) for Logical Volumes
-.SH SYNOPSIS
-.B lvscan
-.RB [ \-a | \-\-all]
-.RB [ \-b | \-\-blockdevice ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-v | \-\-verbose ]
-.SH DESCRIPTION
-lvscan scans all known volume groups or all supported LVM block devices
-in the system for defined Logical Volumes. The output consists
-of one line for each Logical Volume indicating whether or not it is active,
-a snapshot or origin, the size of the device and its allocation policy.
-Use \fBlvs\fP(8) or \fBlvdisplay\fP(8) to obtain more-comprehensive
-information about the Logical Volumes.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-\-all
-Include information in the output about internal Logical Volumes that
-are components of normally-accessible Logical Volumes, such as mirrors,
-but which are not independently accessible (e.g. not mountable).
-For example, after creating a mirror using
-.B lvcreate \-m1 \-\-mirrorlog disk\fR,
-this option will reveal three internal Logical Volumes, with suffixes
-mimage_0, mimage_1, and mlog.
-.TP
-.BR \-b ", " \-\-blockdevice
-This option is now ignored. Instead, use \fBlvs\fP(8) or
-\fBlvdisplay\fP(8) to obtain the device number.
-.TP
-.IR \fB\-\-cache " " LogicalVolume
-Applicable only when \fBlvmetad\fP(8) is in use (see also \fBlvm.conf\fP(5),
-global/use_lvmetad). This command issues a rescan of physical volume labels and
-metadata areas of all PVs that the logical volume uses. In particular, this can
-be used when a RAID logical volume becomes degraded, to update information
-about physical volume availability. This is only necessary if the logical
-volume is \fBnot\fP being monitored by dmeventd (see \fBlvchange\fP(8), option
-\fB\-\-monitor\fP).
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvcreate (8),
-.BR lvdisplay (8)
-.BR lvs (8)
diff --git a/man/pvchange.8.des b/man/pvchange.8.des
new file mode 100644
index 0000000..802850f
--- /dev/null
+++ b/man/pvchange.8.des
@@ -0,0 +1 @@
+pvchange changes PV attributes in the VG.
diff --git a/man/pvchange.8.end b/man/pvchange.8.end
new file mode 100644
index 0000000..a524d07
--- /dev/null
+++ b/man/pvchange.8.end
@@ -0,0 +1,6 @@
+.SH EXAMPLES
+
+Disallow the allocation of physical extents on a PV (e.g. because of
+disk errors, or because it will be removed after freeing it).
+.br
+.B pvchange \-x n /dev/sdk1
diff --git a/man/pvchange.8.in b/man/pvchange.8.in
deleted file mode 100644
index c7ddc58..0000000
--- a/man/pvchange.8.in
+++ /dev/null
@@ -1,59 +0,0 @@
-.TH PVCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvchange \(em change attributes of a physical volume
-.SH SYNOPSIS
-.B pvchange
-.RB [ \-\-addtag
-.IR Tag ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-f | \-\-force ]
-.RB [ \-\-deltag
-.IR Tag ]
-.RB [ \-\-metadataignore
-.RI { y | n }]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-a | \-\-all ]
-.RB [ \-x | \-\-allocatable
-.RI { y | n }]
-.RB [ \-u | \-\-uuid ]
-.RI [ PhysicalVolumePath ...]
-.SH DESCRIPTION
-pvchange allows you to change the allocation permissions of one or
-more physical volumes.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-a ", " \-\-all
-If PhysicalVolumePath is not specified on the command line all
-physical volumes are searched for and used.
-.TP
-.BR \-\-metadataignore " {" \fIy | \fIn }
-Ignore or un-ignore metadata areas on this physical volume.
-If metadata areas on a physical volume are ignored, LVM will
-not not store metadata in the metadata areas present on this Physical
-Volume.
-.TP
-.BR \-u ", " \-\-uuid
-Generate new random UUID for specified physical volumes.
-.TP
-.BR \-x ", " \-\-allocatable " {" \fIy | \fIn }
-Enable or disable allocation of physical extents on this physical volume.
-.SH Example
-Disallows the allocation of physical extents on this physical volume
-(possibly because of disk errors, or because it will be removed after
-freeing it:
-.sp
-.B pvchange \-x n /dev/sdk1
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvcreate (8)
diff --git a/man/pvck.8.des b/man/pvck.8.des
new file mode 100644
index 0000000..0a32657
--- /dev/null
+++ b/man/pvck.8.des
@@ -0,0 +1 @@
+pvck checks the LVM metadata for consistency on PVs.
diff --git a/man/pvck.8.end b/man/pvck.8.end
new file mode 100644
index 0000000..67af238
--- /dev/null
+++ b/man/pvck.8.end
@@ -0,0 +1,8 @@
+.SH EXAMPLES
+
+If the partition table is corrupted or lost on /dev/sda, and you suspect
+there was an LVM partition at approximately 100 MiB, then this
+area of the disk can be scanned using the \fB\-\-labelsector\fP
+parameter with a value of 204800 (100 * 1024 * 1024 / 512 = 204800).
+.br
+.B pvck \-\-labelsector 204800 /dev/sda
diff --git a/man/pvck.8.in b/man/pvck.8.in
deleted file mode 100644
index 368dc06..0000000
--- a/man/pvck.8.in
+++ /dev/null
@@ -1,37 +0,0 @@
-.TH PVCK 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvck \(em check physical volume metadata
-.SH SYNOPSIS
-.B pvck
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-labelsector
-.IR sector ]
-.I PhysicalVolume
-.RI [ PhysicalVolume ...]
-.SH DESCRIPTION
-pvck checks physical volume LVM metadata for consistency.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.B \-\-labelsector \fIsector
-By default, 4 sectors of \fBPhysicalVolume\fP are scanned for an LVM label,
-starting at sector 0. This parameter allows you to specify a different
-starting sector for the scan and is useful for recovery situations. For
-example, suppose the partition table is corrupted or lost on /dev/sda,
-but you suspect there was an LVM partition at approximately 100 MiB. This
-area of the disk may be scanned by using the \fB\-\-labelsector\fP parameter
-with a value of 204800 (100 * 1024 * 1024 / 512 = 204800):
-.sp
-.B pvck \-\-labelsector 204800 /dev/sda
-.sp
-Note that a script can be used with \fB\-\-labelsector\fP to automate the
-process of finding LVM labels.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvcreate (8),
-.BR pvscan (8)
-.BR vgck (8)
diff --git a/man/pvcreate.8.des b/man/pvcreate.8.des
new file mode 100644
index 0000000..3dfddbc
--- /dev/null
+++ b/man/pvcreate.8.des
@@ -0,0 +1,18 @@
+pvcreate initializes a PV so that it is recognized as belonging to LVM,
+and allows the PV to be used in a VG. A PV can be a disk partition, whole
+disk, meta device, or loopback file.
+
+For DOS disk partitions, the partition id should be set to 0x8e using
+.BR fdisk (8),
+.BR cfdisk (8),
+or a equivalent. For GUID Partition Table (GPT), the id is
+E6D6D379-F507-44C2-A23C-238F2A3DF928. For
+whole disk devices only
+the partition table must be erased, which will effectively destroy all
+data on that disk. This can be done by zeroing the first sector with:
+
+.BI "dd if=/dev/zero of=" PhysicalVolume " bs=512 count=1"
+
+Use \fBvgcreate\fP(8) to create a new VG on the PV, or \fBvgextend\fP(8)
+to add the PV to existing VG.
+
diff --git a/man/pvcreate.8.end b/man/pvcreate.8.end
new file mode 100644
index 0000000..b1b0f3e
--- /dev/null
+++ b/man/pvcreate.8.end
@@ -0,0 +1,13 @@
+.SH EXAMPLES
+
+Initialize a partition and a full device.
+.br
+.B pvcreate /dev/sdc4 /dev/sde
+
+If a device is a 4KiB sector drive that compensates for windows
+partitioning (sector 7 is the lowest aligned logical block, the 4KiB
+sectors start at LBA -1, and consequently sector 63 is aligned on a 4KiB
+boundary) manually account for this when initializing for use by LVM.
+.br
+.B pvcreate \-\-dataalignmentoffset 7s /dev/sdb
+
diff --git a/man/pvcreate.8.in b/man/pvcreate.8.in
deleted file mode 100644
index 97a9909..0000000
--- a/man/pvcreate.8.in
+++ /dev/null
@@ -1,210 +0,0 @@
-.TH PVCREATE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvcreate \(em initialize a disk or partition for use by LVM
-.SH SYNOPSIS
-.B pvcreate
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-f [ f ]| \-\-force
-.RB [ \-\-force ]]
-.RB [ \-y | \-\-yes ]
-.RB [ \-\-labelsector ]
-.RB [ \-\-bootloaderareasize
-.IR size ]
-.RB [ \-M | \-\-metadatatype
-.IR type ]
-.RB [ \-\- [ pv ] metadatacopies
-.IR NumberOfCopies ]
-.RB [ \-\-metadatasize
-.IR size ]
-.RB [ \-\-metadataignore
-.RI { y | n }]
-.RB [ \-\-dataalignment
-.IR alignment ]
-.RB [ \-\-dataalignmentoffset
-.IR alignment_offset ]
-.RB [ \-\-restorefile
-.IR file ]
-.RB [ \-\-norestorefile ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-setphysicalvolumesize
-.IR size ]
-.RB [ \-u | \-\-uuid
-.IR uuid ]
-.RB [ \-Z | \-\-zero
-.RI { y | n }]
-.I PhysicalVolume
-.RI [ PhysicalVolume ...]
-.SH DESCRIPTION
-pvcreate initializes
-.I PhysicalVolume
-for later use by the Logical Volume Manager (LVM). Each
-.I PhysicalVolume
-can be a disk partition, whole disk, meta device, or loopback file.
-For DOS disk partitions, the partition id should be set to 0x8e using
-.BR fdisk (8),
-.BR cfdisk (8),
-or a equivalent. For GUID Partition Table (GPT), the id is
-E6D6D379-F507-44C2-A23C-238F2A3DF928. For
-.B whole disk devices only
-the partition table must be erased, which will effectively destroy all
-data on that disk. This can be done by zeroing the first sector with:
-.sp
-.BI "dd if=/dev/zero of=" PhysicalVolume " bs=512 count=1"
-.sp
-Continue with
-.BR vgcreate (8)
-to create a new volume group on
-.IR PhysicalVolume ,
-or
-.BR vgextend (8)
-to add
-.I PhysicalVolume
-to an existing volume group.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-f ", " \-\-force
-Force the creation without any confirmation. You can not recreate
-(reinitialize) a physical volume belonging to an existing volume group.
-In an emergency you can override this behaviour with \fB-ff\fP.
-.TP
-.BR \-u ", " \-\-uuid " " \fIuuid
-Specify the uuid for the device.
-Without this option, \fBpvcreate\fP(8) generates a random uuid.
-All of your physical volumes must have unique uuids.
-You need to use this option before restoring a backup of LVM metadata
-onto a replacement device - see \fBvgcfgrestore\fP(8). As such, use of
-\fB\-\-restorefile\fP is compulsory unless the \fB\-\-norestorefile\fP is
-used.
-.TP
-.BR \-y ", " \-\-yes
-Answer yes to all questions.
-.TP
-.BR \-Z ", " \-\-zero " {" \fIy | \fIn }
-Whether or not the first 4 sectors (2048 bytes) of the device should be
-wiped.
-If this option is not given, the
-default is to wipe these sectors unless either or both of the
-\fB\-\-restorefile\fP or \fB\-\-uuid\fP options were specified.
-.SH NEW METADATA OPTIONS
-LVM2 introduces a new format for storing metadata on disk.
-This new format is more efficient and resilient than the format the
-original version of LVM used and offers the advanced user greater
-flexibility and control.
-.P
-The new format may be selected on the command line with \fB\-M2\fP or by
-setting \fBformat = "lvm2"\fP in the \fBglobal\fP section of \fBlvm.conf\fP(5).
-Each physical volume in the same volume group must use the same format, but
-different volume groups on a machine may use different formats
-simultaneously: the tools can handle both formats.
-Additional formats can be added as shared libraries.
-.P
-Additional tools for manipulating the locations and sizes of metadata areas
-will be written in due course. Use the verbose/debug options on the tools
-to see where the metadata areas are placed.
-.TP
-.B \-\-metadatasize \fIsize
-The approximate amount of space to be set aside for each metadata area.
-(The size you specify may get rounded.)
-.TP
-.B \-\-dataalignment \fIalignment
-Align the start of the data to a multiple of this number.
-You should also specify an appropriate \fIPhysicalExtentSize\fP when creating
-the Volume Group with \fBvgcreate\fP.
-.sp
-To see the location of the first Physical Extent of an existing Physical Volume
-use \fBpvs \-o +pe_start\fP . It will be a multiple of the requested
-alignment. In addition it may be shifted by \fIalignment_offset\fP from
-\fIdata_alignment_offset_detection\fP (if enabled in \fBlvm.conf\fP(5)) or
-\fB\-\-dataalignmentoffset\fP.
-.TP
-.B \-\-dataalignmentoffset \fIalignment_offset
-Shift the start of the data area by this additional \fIalignment_offset\fP.
-.TP
-.BR \-\- [ pv ] metadatacopies " " \fINumberOfCopies
-The number of metadata areas to set aside on each PV. Currently
-this can be 0, 1 or 2.
-If set to 2, two copies of the volume group metadata
-are held on the PV, one at the front of the PV and one at the end.
-If set to 1 (the default), one copy is kept at the front of the PV
-(starting in the 5th sector).
-If set to 0, no copies are kept on this PV - you might wish to use this
-with VGs containing large numbers of PVs. But if you do this and
-then later use \fBvgsplit\fP(8) you must ensure that each VG is still going
-to have a suitable number of copies of the metadata after the split!
-.TP
-.BR \-\-metadataignore " {" \fIy | \fIn }
-Ignore or un-ignore metadata areas on this physical volume.
-The default is "n". This setting can be changed with \fBpvchange\fP.
-If metadata areas on a physical volume are ignored, LVM will
-not store metadata in the metadata areas present on this Physical
-Volume. Metadata areas cannot be created or extended after Logical
-Volumes have been allocated on the device. If you do not want to store
-metadata on this device, it is still wise always to allocate a metadata
-area in case you need it in the future and to use this option to instruct
-LVM2 to ignore it.
-.TP
-.B \-\-restorefile \fIfile
-In conjunction with \fB\-\-uuid\fP, this extracts the location and size
-of the data on the PV from the file (produced by \fBvgcfgbackup\fP)
-and ensures that the metadata that the program produces is consistent
-with the contents of the file i.e. the physical extents will be in
-the same place and not get overwritten by new metadata. This provides
-a mechanism to upgrade the metadata format or to add/remove metadata
-areas. Use with care. See also \fBvgconvert\fP(8).
-.TP
-.B \-\-norestorefile
-In conjunction with \fB\-\-uuid\fP, this allows a \fIuuid\fP to be specified
-without also requiring that a backup of the metadata be provided.
-.TP
-.B \-\-labelsector \fIsector
-By default the PV is labelled with an LVM2 identifier in its second
-sector (sector 1). This lets you use a different sector near the
-start of the disk (between 0 and 3 inclusive - see LABEL_SCAN_SECTORS
-in the source). Use with care.
-.TP
-.B \-\-bootloaderareasize \fIsize
-Create a separate bootloader area of specified size besides PV's data
-area. The bootloader area is an area of reserved space on the PV from
-which LVM2 will not allocate any extents and it's kept untouched. This is
-primarily aimed for use with bootloaders to embed their own data or metadata.
-The start of the bootloader area is always aligned, see also \fB\-\-dataalignment\fP
-and \fB\-\-dataalignmentoffset\fP. The bootloader area size may eventually
-end up increased due to the alignment, but it's never less than the
-size that is requested. To see the bootloader area start and size of
-an existing Physical Volume use \fBpvs \-o +pv_ba_start,pv_ba_size\fP.
-.TP
-.B \-\-setphysicalvolumesize \fIsize
-Overrides the automatically-detected size of the PV. Use with care.
-.SH Examples
-Initialize partition #4 on the third SCSI disk and the entire fifth
-SCSI disk for later use by LVM:
-.sp
-.B pvcreate /dev/sdc4 /dev/sde
-
-If the 2nd SCSI disk is a 4KiB sector drive that compensates for windows
-partitioning (sector 7 is the lowest aligned logical block, the 4KiB
-sectors start at LBA -1, and consequently sector 63 is aligned on a 4KiB
-boundary) manually account for this when initializing for use by LVM:
-.sp
-.B pvcreate \-\-dataalignmentoffset 7s /dev/sdb
-
-.SH SEE ALSO
-.BR lvm.conf (5),
-.BR lvm (8),
-.BR vgcreate (8),
-.BR vgextend (8),
-.BR lvcreate (8),
-.BR cfdisk (8),
-.BR fdisk (8),
-.BR losetup (8),
-.BR mdadm (8),
-.BR vgcfgrestore (8),
-.BR vgconvert (8)
diff --git a/man/pvdisplay.8.des b/man/pvdisplay.8.des
new file mode 100644
index 0000000..74d57ca
--- /dev/null
+++ b/man/pvdisplay.8.des
@@ -0,0 +1,5 @@
+pvdisplay shows the attributes of PVs, like size, physical extent size,
+space used for the VG descriptor area, etc.
+
+\fBpvs\fP(8) is a preferred alternative that shows the same information
+and more, using a more compact and configurable output format.
diff --git a/man/pvdisplay.8.in b/man/pvdisplay.8.in
deleted file mode 100644
index 9bca720..0000000
--- a/man/pvdisplay.8.in
+++ /dev/null
@@ -1,109 +0,0 @@
-.TH PVDISPLAY 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvdisplay \- display attributes of a physical volume
-.SH SYNOPSIS
-.B pvdisplay
-.RB [ \-c | \-\-colon ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-maps ]
-.RB [ \-\-nosuffix ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-s | \-\-short ]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-\-units
-.IR hsbkmgtHKMGT ]
-.RB [ \-v [ v ]| \-\-verbose
-.RB [ \-\-verbose ]]
-.RB [ \-\-version ]
-.RI [ PhysicalVolumePath ...]
-.br
-
-.br
-.B pvdisplay
-.BR \-C | \-\-columns
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-a | \-\-all ]
-.RB [ \-\-commandprofile
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-logonly ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-v [ v ]| \-\-verbose
-.RB [ \-\-verbose ]]
-.RB [ \-\-version ]
-.RI [ PhysicalVolumePath ...]
-.SH DESCRIPTION
-pvdisplay allows you to see the attributes of one or more physical volumes
-like size, physical extent size, space used for the volume group descriptor
-area and so on.
-.P
-\fBpvs\fP(8) is an alternative that provides the same information
-in the style of \fBps\fP(1).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-C ", " \-\-columns
-Display output in columns, the equivalent of \fBpvs\fP(8). See
-\fBpvs\fP(8) for a description of other options with this form of
-\fBpvdisplay\fP.
-.TP
-.BR \-c ", " \-\-colon
-Generate colon separated output for easier parsing in scripts or programs.
-N.B. \fBpvs\fP(8) provides considerably more control over the output.
-.nf
-
-The values are:
-
-\(bu physical volume device name
-\(bu volume group name
-\(bu physical volume size in sectors
-\(bu internal physical volume number (obsolete)
-\(bu physical volume status
-\(bu physical volume (not) allocatable
-\(bu current number of logical volumes on this physical volume
-\(bu physical extent size in kilobytes
-\(bu total number of physical extents
-\(bu free number of physical extents
-\(bu allocated number of physical extents
-
-.fi
-.TP
-.BR \-s ", " \-\-short
-Only display the size of the given physical volumes.
-.TP
-.BR \-m ", " \-\-maps
-Display the mapping of physical extents to logical volumes and
-logical extents.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvs (8),
-.BR pvcreate (8),
-.BR lvcreate (8),
-.BR vgcreate (8)
diff --git a/man/pvmove.8.des b/man/pvmove.8.des
new file mode 100644
index 0000000..5286ef4
--- /dev/null
+++ b/man/pvmove.8.des
@@ -0,0 +1,61 @@
+pvmove moves the allocated physical extents (PEs) on a source PV to one or
+more destination PVs. You can optionally specify a source LV in which
+case only extents used by that LV will be moved to free (or specified)
+extents on the destination PV. If no destination PV is specified, the
+normal allocation rules for the VG are used.
+
+If pvmove is interrupted for any reason (e.g. the machine crashes) then
+run pvmove again without any PV arguments to restart any operations that
+were in progress from the last checkpoint. Alternatively, use the abort
+option at any time to abort the operation. The resulting location of LVs
+after an abort depends on whether the atomic option was used.
+
+More than one pvmove can run concurrently if they are moving data from
+different source PVs, but additional pvmoves will ignore any LVs already
+in the process of being changed, so some data might not get moved.
+
+pvmove works as follows:
+
+1. A temporary 'pvmove' LV is created to store details of all the data
+movements required.
+
+2. Every LV in the VG is searched for contiguous data that need moving
+according to the command line arguments.
+For each piece of data found, a new segment is added to the end of the
+pvmove LV.
+This segment takes the form of a temporary mirror to copy the data
+from the original location to a newly allocated location.
+The original LV is updated to use the new temporary mirror segment
+in the pvmove LV instead of accessing the data directly.
+
+3. The VG metadata is updated on disk.
+
+4. The first segment of the pvmove LV is activated and starts to mirror
+the first part of the data. Only one segment is mirrored at once as this
+is usually more efficient.
+
+5. A daemon repeatedly checks progress at the specified time interval.
+When it detects that the first temporary mirror is in sync, it breaks that
+mirror so that only the new location for that data gets used and writes a
+checkpoint into the VG metadata on disk. Then it activates the mirror for
+the next segment of the pvmove LV.
+
+6. When there are no more segments left to be mirrored, the temporary LV
+is removed and the VG metadata is updated so that the LVs reflect the new
+data locations.
+
+Note that this new process cannot support the original LVM1
+type of on-disk metadata. Metadata can be converted using
+\fBvgconvert\fP(8).
+
+If the \fB\-\-atomic\fP option is used, a slightly different approach is
+used for the move. Again, a temporary 'pvmove' LV is created to store the
+details of all the data movements required. This temporary LV contains
+all the segments of the various LVs that need to be moved. However, in
+this case, an identical LV is allocated that contains the same number of
+segments and a mirror is created to copy the contents from the first
+temporary LV to the second. After a complete copy is made, the temporary
+LVs are removed, leaving behind the segments on the destination PV. If an
+abort is issued during the move, all LVs being moved will remain on the
+source PV.
+
diff --git a/man/pvmove.8.end b/man/pvmove.8.end
new file mode 100644
index 0000000..9dd3adc
--- /dev/null
+++ b/man/pvmove.8.end
@@ -0,0 +1,46 @@
+.SH EXAMPLES
+
+Move all physical extents that are used by simple LVs on the specified PV to
+free physical extents elsewhere in the VG.
+.br
+.B pvmove /dev/sdb1
+
+Use a specific destination PV when moving physical extents.
+.br
+.B pvmove /dev/sdb1 /dev/sdc1
+
+Move extents belonging to a single LV.
+.br
+.B pvmove \-n lvol1 /dev/sdb1 /dev/sdc1
+
+Rather than moving the contents of an entire device, it is possible to
+move a range of physical extents, for example numbers 1000 to 1999
+inclusive on the specified PV.
+.br
+.B pvmove /dev/sdb1:1000\-1999
+
+A range of physical extents to move can be specified as start+length. For
+example, starting from PE 1000. (Counting starts from 0, so this refers to the
+1001st to the 2000th PE inclusive.)
+.br
+.B pvmove /dev/sdb1:1000+1000
+
+Move a range of physical extents to a specific PV (which must have
+sufficient free extents).
+.br
+.B pvmove /dev/sdb1:1000\-1999 /dev/sdc1
+
+Move a range of physical extents to specific new extents on a new PV.
+.br
+.B pvmove /dev/sdb1:1000\-1999 /dev/sdc1:0\-999
+
+If the source and destination are on the same disk, the
+\fBanywhere\fP allocation policy is needed.
+.br
+.B pvmove \-\-alloc anywhere /dev/sdb1:1000\-1999 /dev/sdb1:0\-999
+
+The part of a specific LV present within in a range of physical
+extents can also be picked out and moved.
+.br
+.B pvmove \-n lvol1 /dev/sdb1:1000\-1999 /dev/sdc1
+
diff --git a/man/pvmove.8.in b/man/pvmove.8.in
deleted file mode 100644
index 39fdfe4..0000000
--- a/man/pvmove.8.in
+++ /dev/null
@@ -1,187 +0,0 @@
-.TH PVMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvmove \(em move physical extents
-.SH SYNOPSIS
-.B pvmove
-.RB [ \-\-abort ]
-.RB [ \-\-alloc
-.IR AllocationPolicy ]
-.RB [ \-\-atomic ]
-.RB [ \-b | \-\-background ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-i | \-\-interval
-.IR Seconds ]
-.RB [ \-\-noudevsync ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-n | \-\-name
-.IR LogicalVolume ]
-.RI [ SourcePhysicalVolume [ :PE [ \-PE ]...]
-.RI [ DestinationPhysicalVolume [ :PE [ \-PE ]...]...]]
-.SH DESCRIPTION
-pvmove allows you to move the allocated physical extents (PEs) on
-.I SourcePhysicalVolume
-to one or more other physical volumes (PVs).
-You can optionally specify a source
-.I LogicalVolume
-in which case only extents used by that LV will be moved to
-free (or specified) extents on
-.IR DestinationPhysicalVolume (s).
-If no
-.I DestinationPhysicalVolume
-is specified, the normal allocation rules for the Volume Group are used.
-
-If pvmove gets interrupted for any reason (e.g. the machine crashes)
-then run pvmove again without any PhysicalVolume arguments to
-restart any moves that were in progress from the last checkpoint.
-Alternatively use \fBpvmove \-\-abort\fP at any time to abort. The
-resulting location of logical volumes after an abort is issued depends
-on whether the
-.B \-\-atomic
-option was used when starting the pvmove process.
-
-You can run more than one pvmove at once provided they are moving data
-off different SourcePhysicalVolumes, but additional pvmoves will ignore
-any Logical Volumes already in the process of being changed, so some
-data might not get moved.
-
-\fBpvmove\fP works as follows:
-
-1. A temporary 'pvmove' Logical Volume is created to store
-details of all the data movements required.
-
-2. Every Logical Volume in the Volume Group is searched
-for contiguous data that need moving
-according to the command line arguments.
-For each piece of data found, a new segment is added to the end of the
-pvmove LV.
-This segment takes the form of a temporary mirror to copy the data
-from the original location to a newly-allocated location.
-The original LV is updated to use the new temporary mirror segment
-in the pvmove LV instead of accessing the data directly.
-
-3. The Volume Group metadata is updated on disk.
-
-4. The first segment of the pvmove Logical Volume is activated and starts
-to mirror the first part of the data. Only one segment is mirrored at once
-as this is usually more efficient.
-
-5. A daemon repeatedly checks progress at the specified time interval.
-When it detects that the first temporary mirror is in-sync,
-it breaks that mirror so that only the new location for that data gets used
-and writes a checkpoint into the Volume Group metadata on disk.
-Then it activates the mirror for the next segment of the pvmove LV.
-
-6. When there are no more segments left to be mirrored,
-the temporary Logical Volume is removed and the Volume Group metadata
-is updated so that the Logical Volumes reflect the new data locations.
-
-Note that this new process cannot support the original LVM1
-type of on-disk metadata. Metadata can be converted using \fBvgconvert\fP(8).
-
-If the
-.B \-\-atomic
-option is used, a slightly different approach is used for the move. Again,
-a temporary 'pvmove' logical volume is created to store the details of all
-the data movements required. This temporary LV contains all the segments of
-the various LVs that need to be moved. However this time, an identical
-logical volume is allocated that contains the same number of segments and
-a mirror is created to copy the contents from the first temporary LV to the
-second. When a complete copy is accomplished, the temporary logical volumes
-are removed, leaving behind the segments on the destination physical volume.
-If an abort is issued during the move, all logical volumes being moved will
-remain on the source physical volume.
-
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.B \-\-abort
-Abort any moves in progress. If the
-.B \-\-atomic
-option was used to start the pvmove, all logical volumes will remain on
-the source physical volume. Otherwise, those segments that have completed
-the move will stay on the destination physical volume, while those that
-have not will remain on the source physical volume.
-.TP
-.B \-\-atomic
-Make the entire operation atomic. That is, ensure that all affected logical
-volumes are moved to the destination physical volume together; unless the move
-has been aborted. If the move has been aborted, all logical volumes will
-remain on the source physical volume.
-.TP
-.B \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.TP
-.BR \-b ", " \-\-background
-Run the daemon in the background.
-.TP
-.BR \-i ", " \-\-interval " " \fISeconds
-Report progress as a percentage at regular intervals.
-.TP
-.BR \-n ", " \-\-name " " \fILogicalVolume
-Move only the extents belonging to
-.I LogicalVolume
-from
-.I SourcePhysicalVolume
-instead of all allocated extents to the destination physical volume(s).
-
-.SH Examples
-To move all Physical Extents that are used by simple Logical Volumes on
-/dev/sdb1 to free Physical Extents elsewhere in the Volume Group use:
-.sp
-.B pvmove /dev/sdb1
-.P
-Additionally, a specific destination device /dev/sdc1
-can be specified like this:
-.sp
-.B pvmove /dev/sdb1 /dev/sdc1
-.P
-To perform the action only on extents belonging to the single Logical Volume
-lvol1 do this:
-.sp
-.B pvmove \-n lvol1 /dev/sdb1 /dev/sdc1
-.P
-Rather than moving the contents of the entire device, it is possible to
-move a range of Physical Extents - for example numbers 1000 to 1999
-inclusive on /dev/sdb1 - like this:
-.sp
-.B pvmove /dev/sdb1:1000\-1999
-.P
-A range can also be specified as start+length, so
-.sp
-.B pvmove /dev/sdb1:1000+1000
-.P
-also refers to 1000 Physical Extents starting from Physical Extent number 1000.
-(Counting starts from 0, so this refers to the 1001st to the 2000th inclusive.)
-.P
-To move a range of Physical Extents to a specific location (which must have
-sufficient free extents) use the form:
-.sp
-.B pvmove /dev/sdb1:1000\-1999 /dev/sdc1
-.sp
-or
-.sp
-.B pvmove /dev/sdb1:1000\-1999 /dev/sdc1:0\-999
-.P
-If the source and destination are on the same disk, the
-.B anywhere
-allocation policy would be needed, like this:
-.sp
-.B pvmove \-\-alloc anywhere /dev/sdb1:1000\-1999 /dev/sdb1:0\-999
-.P
-The part of a specific Logical Volume present within in a range of Physical
-Extents can also be picked out and moved, like this:
-.sp
-.B pvmove \-n lvol1 /dev/sdb1:1000\-1999 /dev/sdc1
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgconvert (8)
-.BR pvs (8)
diff --git a/man/pvremove.8.des b/man/pvremove.8.des
new file mode 100644
index 0000000..f12b76e
--- /dev/null
+++ b/man/pvremove.8.des
@@ -0,0 +1,2 @@
+pvremove wipes the label on a device so that LVM will no longer recognise
+it as a PV.
diff --git a/man/pvremove.8.in b/man/pvremove.8.in
deleted file mode 100644
index 6444884..0000000
--- a/man/pvremove.8.in
+++ /dev/null
@@ -1,37 +0,0 @@
-.TH PVREMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvremove \(em remove a physical volume
-.SH SYNOPSIS
-.B pvremove
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-f [ f ]| \-\-force
-.RB [ \-\-force ]]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-y | \-\-yes ]
-.I PhysicalVolume
-.RI [ PhysicalVolume ...]
-.SH DESCRIPTION
-pvremove wipes the label on a device so that LVM will no longer
-recognise it as a physical volume.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-ff ", " \-\-force " " \-\-force
-Force the removal of a physical volume belonging to an existing volume group.
-Normally \fBvgreduce\fP(8) should be used instead of this command.
-You cannot remove a physical volume which in use by some active logical volume.
-.TP
-.BR \-y ", " \-\-yes
-Answer yes to all questions.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvcreate (8),
-.BR pvdisplay (8),
-.BR vgreduce (8)
diff --git a/man/pvresize.8.des b/man/pvresize.8.des
new file mode 100644
index 0000000..b3cfe63
--- /dev/null
+++ b/man/pvresize.8.des
@@ -0,0 +1,2 @@
+pvresize resizes a PV. The PV may already be in a VG and may have active
+LVs allocated on it.
diff --git a/man/pvresize.8.end b/man/pvresize.8.end
new file mode 100644
index 0000000..316e408
--- /dev/null
+++ b/man/pvresize.8.end
@@ -0,0 +1,16 @@
+.SH NOTES
+
+pvresize will refuse to shrink a PV if it has allocated extents beyond the
+new end.
+
+.SH EXAMPLES
+
+Expand a PV after enlarging the partition.
+.br
+.B pvresize /dev/sda1
+
+Shrink a PV prior to shrinking the partition (ensure that the PV size is
+appropriate for the intended new partition size).
+.br
+.B pvresize \-\-setphysicalvolumesize 40G /dev/sda1
+
diff --git a/man/pvresize.8.in b/man/pvresize.8.in
deleted file mode 100644
index b7d8f33..0000000
--- a/man/pvresize.8.in
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH PVRESIZE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvresize \(em resize a disk or partition in use by LVM2
-.SH SYNOPSIS
-.B pvresize
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-setphysicalvolumesize
-.IR size ]
-.I PhysicalVolume
-.RI [ PhysicalVolume ...]
-.SH DESCRIPTION
-pvresize resizes
-.I PhysicalVolume
-which may already be in a volume group and have active logical volumes
-allocated on it.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BI \-\-setphysicalvolumesize " size"
-Overrides the automatically-detected size of the PV. Use with care, or
-prior to reducing the physical size of the device.
-.SH EXAMPLES
-Expand the PV on /dev/sda1 after enlarging the partition with fdisk:
-.sp
-.B pvresize /dev/sda1
-.sp
-Shrink the PV on /dev/sda1 prior to shrinking the partition with fdisk
-(ensure that the PV size is appropriate for your intended new partition
-size):
-.sp
-.B pvresize \-\-setphysicalvolumesize 40G /dev/sda1
-.sp
-.SH RESTRICTIONS
-pvresize will refuse to shrink
-.I PhysicalVolume
-if it has allocated extents after where its new end would be. In the future,
-it should relocate these elsewhere in the volume group if there is sufficient
-free space, like
-.B pvmove
-does.
-.sp
-.B pvresize
-won't currently work correctly on LVM1 volumes.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvmove (8),
-.BR lvresize (8),
-.BR fdisk (8)
diff --git a/man/pvs.8.des b/man/pvs.8.des
new file mode 100644
index 0000000..08497ce
--- /dev/null
+++ b/man/pvs.8.des
@@ -0,0 +1 @@
+pvs produces formatted output about PVs.
diff --git a/man/pvs.8.end b/man/pvs.8.end
new file mode 100644
index 0000000..ba36a8b
--- /dev/null
+++ b/man/pvs.8.end
@@ -0,0 +1,11 @@
+.SH NOTES
+.
+The pv_attr bits are:
+.IP 1 3
+(d)uplicate, (a)llocatable, (u)sed
+.IP 2 3
+e(x)ported
+.IP 3 3
+(m)issing
+
+
diff --git a/man/pvs.8.in b/man/pvs.8.in
deleted file mode 100644
index 54f21c3..0000000
--- a/man/pvs.8.in
+++ /dev/null
@@ -1,153 +0,0 @@
-.TH PVS 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvs \(em report information about physical volumes
-.SH SYNOPSIS
-.B pvs
-.RB [ \-a | \-\-all ]
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-logonly ]
-.RB [ \-\-nameprefixes ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-rows ]
-.RB [ \-\-segments ]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-\-unquoted ]
-.RB [ \-v|\-\-verbose ]
-.RB [ \-\-version]
-.RI [ PhysicalVolume
-.RI [ PhysicalVolume ...]]
-.SH DESCRIPTION
-pvs produces formatted output about physical volumes.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.B \-\-all
-Include information in the output about devices that have not been
-initialized with \fBpvcreate\fP(8).
-.TP
-.B \-\-aligned
-Use with \fB\-\-separator\fP to align the output columns.
-.TP
-.B \-\-binary
-Use binary values "0" or "1" instead of descriptive literal values
-for columns that have exactly two valid values to report (not counting
-the "unknown" value which denotes that the value could not be determined).
-.TP
-.B \-\-configreport \fI ReportName
-Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
-\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
-is either 'pv' for command's main report or 'log' for log report.
-If \fB\-\-configreport\fP option is not used to identify a report, then
-command's main report is assumed. The log report is available only if
-enabled by \fBlog/report_command_log\fP \fBlvm.conf\fP(5) setting or
-if \fB\-\-logonly\fP option is used.
-.TP
-.B \-\-logonly
-Suppress the pvs report itself and display only log report on output.
-.TP
-.B \-\-nameprefixes
-Add an "LVM2_" prefix plus the field name to the output. Useful
-with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
-be used to set environment variables (for example, in \fBudev\fP(7) rules).
-.TP
-.B \-\-noheadings
-Suppress the headings line that is normally the first line of output.
-Useful if grepping the output.
-.TP
-.B \-\-nosuffix
-Suppress the suffix on output sizes. Use with \fB\-\-units\fP
-(except h and H) if processing the output.
-.TP
-.BR \-o ", " \-\-options
-Comma-separated ordered list of columns.
-.IP
-Precede the list with '\fI+\fP' to append to the current list
-of columns, '\fI-\fP' to remove from the current list of columns
-or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
-be repeated, providing several lists. These lists are evaluated
-from left to right.
-.IP
-Use \fB-o pv_all\fP to select all physical volume columns,
-and \fB-o pvseg_all\fP to select all Physical Volume segment columns.
-.IP
-Use \fB-o help\fP to view the full list of columns available.
-.IP
-Column names include: pv_fmt, pv_uuid, dev_size, pv_name, pv_mda_free,
-pv_mda_size, pv_ba_start, pv_ba_size, pe_start, pv_size, pv_free, pv_used,
-pv_attr, pv_pe_count, pv_pe_alloc_count, pv_tags, pv_mda_count,
-pv_mda_used_count, pvseg_start, and pvseg_size
-.IP
-With \fB\-\-segments\fP, any "pvseg_" prefixes are optional; otherwise any
-"pv_" prefixes are optional. Columns mentioned in \fBvgs\fP(8) can also
-be chosen. The pv_attr bits are: (a)llocatable, e(x)ported, (m)issing,
-(u)sed (but not allocatable), (d)uplicate.
-.TP
-.B \-\-segments
-Produces one line of output for each contiguous allocation of space on each
-Physical Volume, showing the start (pvseg_start) and length (pvseg_size) in
-units of physical extents.
-.TP
-.BR \-S ", " \-\-select " " \fISelection
-Display only rows that match Selection criteria. All rows are displayed with
-the additional "selected" column (\fB-o selected\fP) showing 1 if the row
-matches the Selection and 0 otherwise. The Selection criteria are defined
-by specifying column names and their valid values (that can include reserved
-values) while making use of supported comparison operators. See \fBlvm\fP(8)
-and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
-about constructing the Selection criteria. As a quick help and to see full
-list of column names that can be used in Selection including the list of
-reserved values and the set of supported selection operators, check the
-output of \fBpvs -S help\fP command.
-.TP
-.BR \-O ", " \-\-sort
-Comma-separated ordered list of columns to sort by. Replaces the default
-selection. Precede any column with '\fI\-\fP' for a reverse sort on that
-column.
-.TP
-.B \-\-rows
-Output columns as rows.
-.TP
-.B \-\-separator \fISeparator
-String to use to separate each column. Useful if grepping the output.
-.TP
-.B \-\-unbuffered
-Produce output immediately without sorting or aligning the columns properly.
-.TP
-.B \-\-units \fIhHbBsSkKmMgGtTpPeE
-All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
-(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
-Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
-custom units e.g. \-\-units 3M
-.TP
-.B \-\-unquoted
-When used with \fB\-\-nameprefixes\fP, output values in the field=value
-pairs are not quoted.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvdisplay (8),
-.BR lvs (8),
-.BR vgs (8)
diff --git a/man/pvscan.8.des b/man/pvscan.8.des
new file mode 100644
index 0000000..ab8c50c
--- /dev/null
+++ b/man/pvscan.8.des
@@ -0,0 +1,105 @@
+pvscan scans all supported LVM block devices in the system for PVs.
+
+\fBScanning with lvmetad\fP
+
+pvscan operates differently when used with the
+.BR lvmetad (8)
+daemon.
+
+Scanning disks is required to read LVM metadata and identify LVM PVs.
+Once read, lvmetad caches the metadata so that LVM commands can read it
+without repeatedly scanning disks. This is helpful because scanning disks
+is time consuming, and frequent scanning may interfere with the normal
+work of the system and disks.
+
+When lvmetad is not used, LVM commands revert to scanning disks to read
+metadata. Any LVM command that needs metadata will scan disks for it;
+running the pvscan command is not necessary for the sake of other LVM
+commands.
+
+When lvmetad is used, LVM commands avoid scanning disks by reading
+metadata from lvmetad. When new disks appear, they must be scanned so
+their metadata can be cached in lvmetad. This is done by the command
+pvscan \-\-cache, which scans disks and passes the metadata to lvmetad.
+
+The pvscan \-\-cache command is typically run automatically by system
+services when a new device appears. Users do not generally need to run
+this command if the system and lvmetad are running properly.
+
+Many scripts contain unnecessary pvscan (or vgscan) commands for
+historical reasons. To avoid disrupting the system with extraneous disk
+scanning, an ordinary pvscan (without \-\-cache) will simply read metadata
+from lvmetad like other LVM commands. It does not do anything beyond
+displaying the current state of the cache.
+
+.IP \[bu] 2
+When given specific device name arguments, pvscan \-\-cache will only
+read the named devices.
+
+.IP \[bu] 2
+LVM udev rules and systemd services are used to initiate automatic device
+scanning.
+
+.IP \[bu] 2
+To prevent devices from being scanned by pvscan --cache, add them
+to
+.BR lvm.conf (5)
+.B devices/global_filter.
+The devices/filter setting does not
+apply to system level scanning.
+For more information, see:
+.br
+.B lvmconfig --withcomments devices/global_filter
+
+.IP \[bu] 2
+If lvmetad is started or restarted after devices are visible, or
+if the global_filter has changed, then all devices must be rescanned
+for metadata with the command pvscan \-\-cache.
+
+.IP \[bu] 2
+lvmetad does not cache older metadata formats, e.g. lvm1, and will
+be temporarily disabled if they are seen.
+
+.IP \[bu] 2
+To notify lvmetad about a device that is no longer present, the major and
+minor numbers must be given, not the path.
+
+.P
+
+\fBAutomatic activation\fP
+
+When event-driven system services detect a new LVM device, the first step
+is to automatically scan and cache the metadata from the device. This is
+done by pvscan \-\-cache. A second step is to automatically activate LVs
+that are present on the new device. This auto-activation is done by the
+same pvscan \-\-cache command when the option '\-a|\-\-activate ay' is
+included.
+
+Auto-activation of VGs or LVs can be enabled/disabled using:
+.br
+.BR lvm.conf (5)
+.B activation/auto_activation_volume_list
+
+For more information, see:
+.br
+.B lvmconfig --withcomments activation/auto_activation_volume_list
+
+When this setting is undefined, all LVs are auto-activated (when lvm is
+fully integrated with the event-driven system services.)
+
+When a VG or LV is not auto-activated, traditional activation using
+vgchange or lvchange -a|--activate is needed.
+
+.IP \[bu] 2
+pvscan auto-activation can be only done in combination with \-\-cache.
+
+.IP \[bu] 2
+Auto-activation is designated by the "a" argument in '-a|--activate ay'.
+This is meant to distinguish system generated commands from explicit user
+commands, although it can be used in any activation command. Whenever it
+is used, the auto_activation_volume_list is applied.
+
+.IP \[bu] 2
+Auto-activation is not yet supported for LVs that are part of partial or
+clustered volume groups.
+
diff --git a/man/pvscan.8.in b/man/pvscan.8.in
deleted file mode 100644
index 5ff5fa5..0000000
--- a/man/pvscan.8.in
+++ /dev/null
@@ -1,178 +0,0 @@
-.TH PVSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-pvscan \(em scan all disks for physical volumes
-
-.SH SYNOPSIS
-.B pvscan
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-e | \-\-exported ]
-.RB [ \-n | \-\-novolumegroup ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-s | \-\-short ]
-.RB [ \-u | \-\-uuid ]
-.BR
-
-.B pvscan
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.B \-\-cache
-.RB [ \-a | \-\-activate " " \fIay ]
-.RB [ \-b | \-\-background ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-major
-.I major
-.B \-\-minor
-.I minor
-|
-.IR DevicePath
-|
-.IR major:minor ]...
-
-.SH DESCRIPTION
-pvscan scans all supported LVM block devices in the system for physical
-volumes.
-
-.SS Scanning with lvmetad
-
-pvscan operates differently when used with the
-.BR lvmetad (8)
-daemon.
-
-Scanning disks is required to read LVM metadata and identify LVM PVs.
-Once read, lvmetad caches the metadata so that LVM commands can read it
-without repeatedly scanning disks. This is helpful because scanning disks
-is time consuming, and frequent scanning may interfere with the normal
-work of the system and disks.
-
-When lvmetad is not used, LVM commands revert to scanning disks to read
-metadata. Any LVM command that needs metadata will scan disks for it;
-running the pvscan command is not necessary for the sake of other LVM
-commands.
-
-When lvmetad is used, LVM commands avoid scanning disks by reading
-metadata from lvmetad. When new disks appear, they must be scanned so
-their metadata can be cached in lvmetad. This is done by the command
-pvscan \-\-cache, which scans disks and passes the metadata to lvmetad.
-
-The pvscan \-\-cache command is typically run automatically by system
-services when a new device appears. Users do not generally need to run
-this command if the system and lvmetad are running properly.
-
-Many scripts contain unnecessary pvscan (or vgscan) commands for
-historical reasons. To avoid disrupting the system with extraneous disk
-scanning, an ordinary pvscan (without \-\-cache) will simply read metadata
-from lvmetad like other LVM commands. It does not do anything beyond
-displaying the current state of the cache.
-
-.I Notes
-
-.IP \[bu] 2
-When given specific device name arguments, pvscan \-\-cache will only
-read the named devices.
-
-.IP \[bu] 2
-LVM udev rules and systemd services are used to initiate automatic device
-scanning.
-
-.IP \[bu] 2
-To prevent devices from being scanned by pvscan --cache, add them
-to
-.BR lvm.conf (5)
-.B devices/global_filter.
-The devices/filter setting does not
-apply to system level scanning.
-For more information, see:
-.br
-.B lvmconfig --withcomments devices/global_filter
-
-.IP \[bu] 2
-If lvmetad is started or restarted after devices are visible, or
-if the global_filter has changed, then all devices must be rescanned
-for metadata with the command pvscan \-\-cache.
-
-.IP \[bu] 2
-lvmetad does not cache older metadata formats, e.g. lvm1, and will
-be temporarily disabled if they are seen.
-
-.IP \[bu] 2
-To notify lvmetad about a device that is no longer present, the major and
-minor numbers must be given, not the path.
-
-.SS Automatic activation
-
-When event-driven system services detect a new LVM device, the first step
-is to automatically scan and cache the metadata from the device. This is
-done by pvscan \-\-cache. A second step is to automatically activate LVs
-that are present on the new device. This auto-activation is done by the
-same pvscan \-\-cache command when the option '\-a|\-\-activate ay' is
-included.
-
-Auto-activation of VGs or LVs can be enabled/disabled using:
-.br
-.BR lvm.conf (5)
-.B activation/auto_activation_volume_list
-
-For more information, see:
-.br
-.B lvmconfig --withcomments activation/auto_activation_volume_list
-
-When this setting is undefined, all LVs are auto-activated (when lvm is
-fully integrated with the event-driven system services.)
-
-When a VG or LV is not auto-activated, traditional activation using
-vgchange or lvchange -a|--activate is needed.
-
-.I Notes
-
-.IP \[bu] 2
-pvscan auto-activation can be only done in combination with \-\-cache.
-
-.IP \[bu] 2
-Auto-activation is designated by the "a" argument in '-a|--activate ay'.
-This is meant to distinguish system generated commands from explicit user
-commands, although it can be used in any activation command. Whenever it
-is used, the auto_activation_volume_list is applied.
-
-.IP \[bu] 2
-Auto-activation is not yet supported for LVs that are part of partial or
-clustered volume groups.
-
-.P
-
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-e ", " \-\-exported
-Only show physical volumes belonging to exported volume groups.
-.TP
-.BR \-n ", " \-\-novolumegroup
-Only show physical volumes not belonging to any volume group.
-.TP
-.BR \-s ", " \-\-short
-Short listing format.
-.TP
-.BR \-u ", " \-\-uuid
-Show UUIDs in addition to device names.
-.TP
-.BR \-a ", " \-\-activate " " \fIay
-Automatically activate any logical volumes that are possible to activate
-with the addition of the new devices.
-.TP
-.BR \-b ", " \-\-background
-Run the command in the background.
-.TP
-.BR \-\-cache " [" \-\-major " " \fImajor " " \-\-minor " " \fIminor " | " \fIDevicePath " | " \fImajor:minor " ]..."
-Scan one or more devices and send the metadata to lvmetad.
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvmconfig (8),
-.BR lvmetad (8)
diff --git a/man/see_also.end b/man/see_also.end
new file mode 100644
index 0000000..70eeb89
--- /dev/null
+++ b/man/see_also.end
@@ -0,0 +1,67 @@
+.SH SEE ALSO
+
+.BR lvm (8)
+.BR lvm.conf (5)
+.BR lvmconfig (8)
+
+.BR pvchange (8)
+.BR pvck (8)
+.BR pvcreate (8)
+.BR pvdisplay (8)
+.BR pvmove (8)
+.BR pvremove (8)
+.BR pvresize (8)
+.BR pvs (8)
+.BR pvscan (8)
+
+.BR vgcfgbackup (8)
+.BR vgcfgrestore (8)
+.BR vgchange (8)
+.BR vgck (8)
+.BR vgcreate (8)
+.BR vgconvert (8)
+.BR vgdisplay (8)
+.BR vgexport (8)
+.BR vgextend (8)
+.BR vgimport (8)
+.BR vgimportclone (8)
+.BR vgmerge (8)
+.BR vgmknodes (8)
+.BR vgreduce (8)
+.BR vgremove (8)
+.BR vgrename (8)
+.BR vgs (8)
+.BR vgscan (8)
+.BR vgsplit (8)
+
+.BR lvcreate (8)
+.BR lvchange (8)
+.BR lvconvert (8)
+.BR lvdisplay (8)
+.BR lvextend (8)
+.BR lvreduce (8)
+.BR lvremove (8)
+.BR lvrename (8)
+.BR lvresize (8)
+.BR lvs (8)
+.BR lvscan (8)
+
+.BR lvm2-activation-generator (8)
+.BR blkdeactivate (8)
+.BR lvmdump (8)
+
+.BR dmeventd (8)
+.BR lvmetad (8)
+.BR lvmpolld (8)
+.BR lvmlockd (8)
+.BR lvmlockctl (8)
+.BR clvmd (8)
+.BR cmirrord (8)
+.BR lvmdbusd (8)
+
+.BR lvmsystemid (7)
+.BR lvmreport (7)
+.BR lvmraid (7)
+.BR lvmthin (7)
+.BR lvmcache (7)
+
diff --git a/man/vgcfgbackup.8.des b/man/vgcfgbackup.8.des
new file mode 100644
index 0000000..0720e01
--- /dev/null
+++ b/man/vgcfgbackup.8.des
@@ -0,0 +1,16 @@
+vgcfgbackup creates back up files containing metadata of VGs.
+If no VGs are named, back up files are created for all VGs.
+See \fBvgcfgrestore\fP for information on using the back up
+files.
+
+In a default installation, each VG is backed up into a separate file
+bearing the name of the VG in the directory \fI#DEFAULT_BACKUP_DIR#\fP.
+
+To use an alternative back up file, use \fB\-f\fP. In this case, when
+backing up multiple VGs, the file name is treated as a template, with %s
+replaced by the VG name.
+
+NB. This DOES NOT back up the data content of LVs.
+
+It may also be useful to regularly back up the files in
+\fI#DEFAULT_SYS_DIR#\fP.
diff --git a/man/vgcfgbackup.8.in b/man/vgcfgbackup.8.in
deleted file mode 100644
index c6f20d9..0000000
--- a/man/vgcfgbackup.8.in
+++ /dev/null
@@ -1,36 +0,0 @@
-.TH VGCFGBACKUP 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgcfgbackup \(em backup volume group descriptor area
-.SH SYNOPSIS
-.B vgcfgbackup
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-f | \-\-file
-.IR Filename ]
-.RB [ \-h | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-v | \-\-verbose ]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgcfgbackup allows you to backup the metadata of your volume groups.
-If you don't name any volume groups on the command line, all of them
-will be backed up.
-.sp
-In a default installation, each volume group gets backed up into a separate
-file bearing the name of the volume group in the directory
-\fI#DEFAULT_BACKUP_DIR#\fP.
-You can write the backup to an alternative file using \fB\-f\fP. In this case
-if you are backing up more than one volume group the filename is
-treated as a template, and %s gets replaced by the volume group name.
-.sp
-NB. This DOESN'T backup user/system data in logical
-volume(s)! Backup \fI#DEFAULT_SYS_DIR#\fP regularly too.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcfgrestore (8)
diff --git a/man/vgcfgrestore.8.des b/man/vgcfgrestore.8.des
new file mode 100644
index 0000000..cb7867d
--- /dev/null
+++ b/man/vgcfgrestore.8.des
@@ -0,0 +1,8 @@
+vgcfgrestore restores the metadata of a VG from a text back up file
+produced by \fBvgcfgbackup\fP. This writes VG metadata onto the devices
+specifed in back up file.
+
+A back up file can be specified with \fB\-\-file\fP. If no backup file is
+specified, the most recent one is used. Use \fB\-\-list\fP for a list of
+the available back up and archive files of a VG.
+
diff --git a/man/vgcfgrestore.8.end b/man/vgcfgrestore.8.end
new file mode 100644
index 0000000..5ac451d
--- /dev/null
+++ b/man/vgcfgrestore.8.end
@@ -0,0 +1,9 @@
+.SH NOTES
+
+To replace PVs, \fBvgdisplay \-\-partial \-\-verbose\fP will show the
+UUIDs and sizes of any PVs that are no longer present. If a PV in the VG
+is lost and you wish to substitute another of the same size, use
+\fBpvcreate \-\-restorefile filename \-\-uuid uuid\fP (plus additional
+arguments as appropriate) to initialise it with the same UUID as the
+missing PV. Repeat for all other missing PVs in the VG. Then use
+\fBvgcfgrestore \-\-file filename\fP to restore the VG's metadata.
diff --git a/man/vgcfgrestore.8.in b/man/vgcfgrestore.8.in
deleted file mode 100644
index 96b0a10..0000000
--- a/man/vgcfgrestore.8.in
+++ /dev/null
@@ -1,58 +0,0 @@
-.TH VGCFGRESTORE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgcfgrestore \(em restore volume group descriptor area
-.SH SYNOPSIS
-.B vgcfgrestore
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-f | \-\-file
-.RI < filename >]
-.RB [ \-\-force ]
-.RB [ \-l [ l ]| \-\-list ]
-.RB [ \-h | \-\-help ]
-.RB [ \-M | \-\-metadatatype
-.IR 1 | 2 ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RI \fIVolumeGroupName\fP
-.SH DESCRIPTION
-vgcfgrestore allows you to restore the metadata of \fIVolumeGroupName\fP
-from a text backup file produced by \fBvgcfgbackup\fP.
-You can specify a backup file with \fB\-\-file\fP.
-If no backup file is specified, the most recent
-one is used. Use \fB\-\-list\fP for a list of the available
-backup and archive files of \fIVolumeGroupName\fP.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-l ", " \-\-list\fP
-List files pertaining to \fIVolumeGroupName\fP
-List metadata backup and archive files pertaining to \fIVolumeGroupName\fP.
-May be used with the \fB\-f\fP option. Does not restore \fIVolumeGroupName\fP.
-.TP
-.BR \-f ", " \-\-file " " \fIfilename
-Name of LVM metadata backup file
-Specifies a metadata backup or archive file to be used for restoring
-VolumeGroupName. Often this file has been created with \fBvgcfgbackup\fP.
-.TP
-.B \-\-force
-Necessary to restore metadata with thin pool volumes.
-.br
-\fBWARNING: Use with extreme caution.
-Most changes to thin metadata cannot be reverted.
-You may lose data if you restore metadata that does not match the thin pool
-kernel metadata precisely.\fP
-.SH REPLACING PHYSICAL VOLUMES
-\fBvgdisplay \-\-partial \-\-verbose\fP will show you the UUIDs and sizes of
-any PVs that are no longer present.
-If a PV in the VG is lost and you wish to substitute
-another of the same size, use
-\fBpvcreate \-\-restorefile filename \-\-uuid uuid\fP (plus additional
-arguments as appropriate) to initialise it with the same UUID as
-the missing PV. Repeat for all other missing PVs in the VG.
-Then use \fBvgcfgrestore \-\-file filename\fP to restore the volume
-group's metadata.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcreate (8)
diff --git a/man/vgchange.8.des b/man/vgchange.8.des
new file mode 100644
index 0000000..6b873d8
--- /dev/null
+++ b/man/vgchange.8.des
@@ -0,0 +1,2 @@
+vgchange changes VG attributes, changes LV activation in the kernel, and
+includes other utilities for VG maintenance.
diff --git a/man/vgchange.8.end b/man/vgchange.8.end
new file mode 100644
index 0000000..a11bdd1
--- /dev/null
+++ b/man/vgchange.8.end
@@ -0,0 +1,16 @@
+.SH NOTES
+
+If vgchange recognizes COW snapshot LVs that were dropped because they ran
+out of space, it displays a message informing the administrator that the
+snapshots should be removed.
+
+.SH EXAMPLES
+
+Activate all LVs in all VGs on all existing devices.
+.br
+.B vgchange \-a y
+
+Change the maximum number of LVs for an inactive VG.
+.br
+.B vgchange \-l 128 vg00
+
diff --git a/man/vgchange.8.in b/man/vgchange.8.in
deleted file mode 100644
index 3b2fc3e..0000000
--- a/man/vgchange.8.in
+++ /dev/null
@@ -1,346 +0,0 @@
-.TH VGCHANGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgchange \(em change attributes of a volume group
-.SH SYNOPSIS
-.B vgchange
-.RB [ \-\-addtag
-.IR Tag ]
-.RB [ \-\-alloc
-.IR AllocationPolicy ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-a | \-\-activate
-.RI [ a | e | s | l ]
-.RI { y | n }]
-.RB [ \-\-activationmode
-.IB { complete | degraded | partial } ]
-.RB [ \-K | \-\-ignoreactivationskip ]
-.RB [ \-\-monitor
-.RI { y | n }]
-.RB [ \-\-poll
-.RI { y | n }]
-.RB [ \-c | \-\-clustered
-.RI { y | n }]
-.RB [ \-u | \-\-uuid ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-\-deltag
-.IR Tag ]
-.RB [ \-\-detachprofile ]
-.RB [ \-h | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoremonitoring ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-sysinit ]
-.RB [ \-\-noudevsync ]
-.RB [ \-\-lock\-start ]
-.RB [ \-\-lock\-stop ]
-.RB [ \-\-lock\-type
-.IR LockType ]
-.RB [ \-l | \-\-logicalvolume
-.IR MaxLogicalVolumes ]
-.RB [ \-p | \-\-maxphysicalvolumes
-.IR MaxPhysicalVolumes ]
-.RB [ \-\-metadataprofile
-.IR ProfileName ]
-.RB [ \-\- [ vg ] metadatacopies
-.IR NumberOfCopies | unmanaged | all ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-s | \-\-physicalextentsize
-.IR PhysicalExtentSize [ bBsSkKmMgGtTpPeE ]]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-\-systemid
-.IR SystemID ]
-.RB [ \-\-refresh ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ \-x | \-\-resizeable
-.RI { y | n }]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgchange allows you to change the attributes of one or more
-volume groups. Its main purpose is to activate and deactivate
-.IR VolumeGroupName ,
-or all volume groups if none is specified. Only active volume groups
-are subject to changes and allow access to their logical volumes.
-[Not yet implemented: During volume group activation, if
-.B vgchange
-recognizes snapshot logical volumes which were dropped because they ran
-out of space, it displays a message informing the administrator that such
-snapshots should be removed (see
-.BR lvremove (8)).
-]
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-A ", " \-\-autobackup " {" \fIy | \fIn }
-Controls automatic backup of metadata after the change. See
-.BR vgcfgbackup (8).
-Default is yes.
-.TP
-.BR \-a ", " \-\-activate " [" \fIa | \fIe | \fIs | \fIl ]{ \fIy | \fIn }
-Controls the availability of the logical volumes in the volume
-group for input/output.
-In other words, makes the logical volumes known/unknown to the kernel.
-If autoactivation option is used (\-aay), each logical volume in
-the volume group is activated only if it matches an item in the
-activation/auto_activation_volume_list set in lvm.conf. If this
-list is not set, then all volumes are considered for activation.
-The \-aay option should be also used during system boot so it's
-possible to select which volumes to activate using the
-activation/auto_activation_volume_list settting.
-.IP
-Activation of a logical volume creates a symbolic link
-/dev/VolumeGroupName/LogicalVolumeName pointing to the device node.
-This link is removed on deactivation.
-All software and scripts should access the device through
-this symbolic link and present this as the name of the device.
-The location and name of the underlying device node may depend on
-the distribution and configuration (e.g. udev) and might change
-from release to release.
-.IP
-In a clustered VG, clvmd is used for activation, and the
-following options are possible:
-
-With \-aey, clvmd activates the LV in exclusive mode
-(with an exclusive lock), allowing a single node to activate the LV.
-
-With \-asy, clvmd activates the LV in shared mode
-(with a shared lock), allowing multiple nodes to activate the LV concurrently.
-If the LV type prohibits shared access, such as an LV with a snapshot,
-the 's' option is ignored and an exclusive lock is used.
-
-With \-ay (no mode specified), clvmd activates the LV in shared mode
-if the LV type allows concurrent access, such as a linear LV.
-Otherwise, clvmd activates the LV in exclusive mode.
-
-With \-aey, \-asy, and \-ay, clvmd attempts to activate the LV
-on all nodes. If exclusive mode is used, then only one of the
-nodes will be successful.
-
-With \-an, clvmd attempts to deactivate the LV on all nodes.
-
-With \-aly, clvmd activates the LV only on the local node, and \-aln
-deactivates only on the local node. If the LV type allows concurrent
-access, then shared mode is used, otherwise exclusive.
-
-LVs with snapshots are always activated exclusively because they can only
-be used on one node at once.
-
-For local VGs, \-ay, \-aey, and \-asy are all equivalent.
-.IP
-In a shared VG, lvmlockd is used for locking if LVM is compiled with lockd
-support, and the following options are possible:
-
-With \-aey, the command activates the LV in exclusive mode, allowing a
-single host to activate the LV (the host running the command). Before
-activating the LV, the command uses lvmlockd to acquire an exclusive lock
-on the LV. If the lock cannot be acquired, the LV is not activated and an
-error is reported. This would happen if the LV is active on another host.
-
-With \-asy, the command activates the LV in shared mode, allowing multiple
-hosts to activate the LV concurrently. Before activating the LV, the
-command uses lvmlockd to acquire a shared lock on the LV. If the lock
-cannot be acquired, the LV is not activated and an error is reported.
-This would happen if the LV is active exclusively on another host. If the
-LV type prohibits shared access, such as a snapshot, the command will
-report an error and fail.
-
-With \-an, the command deactivates the LV on the host running the command.
-After deactivating the LV, the command uses lvmlockd to release the
-current lock on the LV.
-
-With lvmlockd, an unspecified mode is always exclusive, \-ay defaults to
-\-aey.
-
-.TP
-.BR \-\-activationmode " {" \fIcomplete | \fIdegraded | \fIpartial }
-The activation mode determines whether logical volumes are allowed to
-activate when there are physical volumes missing (e.g. due to a device
-failure). \fIcomplete\fP is the most restrictive; allowing only those
-logical volumes to be activated that are not affected by the missing
-PVs. \fIdegraded\fP allows RAID logical volumes to be activated even if
-they have PVs missing. (Note that the "mirror" segment type is not
-considered a RAID logical volume. The "raid1" segment type should
-be used instead.) Finally, \fIpartial\fP allows any logical volume to
-be activated even if portions are missing due to a missing or failed
-PV. This last option should only be used when performing recovery or
-repair operations. \fIdegraded\fP is the default mode. To change it, modify
-.B activation_mode
-in
-.BR lvm.conf (5).
-.TP
-.BR \-K ", " \-\-ignoreactivationskip
-Ignore the flag to skip Logical Volumes during activation.
-.TP
-.BR \-c ", " \-\-clustered " {" \fIy | \fIn }
-If clustered locking is enabled, this indicates whether this
-Volume Group is shared with other nodes in the cluster or whether
-it contains only local disks that are not visible on the other nodes.
-If the cluster infrastructure is unavailable on a particular node at a
-particular time, you may still be able to use Volume Groups that
-are not marked as clustered.
-.TP
-.BR \-\-detachprofile
-Detach any metadata configuration profiles attached to given
-Volume Groups. See \fBlvm.conf\fP(5) for more information
-about \fBmetadata profiles\fP.
-.TP
-.BR \-u ", " \-\-uuid
-Generate new random UUID for specified Volume Groups.
-.TP
-.BR \-\-monitor " {" \fIy | \fIn }
-Start or stop monitoring a mirrored or snapshot logical volume with
-dmeventd, if it is installed.
-If a device used by a monitored mirror reports an I/O error,
-the failure is handled according to
-.B mirror_image_fault_policy
-and
-.B mirror_log_fault_policy
-set in
-.BR lvm.conf (5).
-.TP
-.BR \-\-poll " {" \fIy | \fIn }
-Without polling a logical volume's backgrounded transformation process
-will never complete. If there is an incomplete pvmove or lvconvert (for
-example, on rebooting after a crash), use \fB\-\-poll y\fP to restart the
-process from its last checkpoint. However, it may not be appropriate to
-immediately poll a logical volume when it is activated, use
-\fB\-\-poll n\fP to defer and then \fB\-\-poll y\fP to restart the process.
-.TP
-.BR \-\-sysinit
-Indicates that vgchange(8) is being invoked from early system initialisation
-scripts (e.g. rc.sysinit or an initrd), before writeable filesystems are
-available. As such, some functionality needs to be disabled and this option
-acts as a shortcut which selects an appropriate set of options. Currently
-this is equivalent to using
-.BR \-\-ignorelockingfailure ,
-.BR \-\-ignoremonitoring ,
-.B \-\-poll n
-and setting \fBLVM_SUPPRESS_LOCKING_FAILURE_MESSAGES\fP
-environment variable.
-
-If \fB\-\-sysinit\fP is used in conjunction with lvmetad(8) enabled and running,
-autoactivation is preferred over manual activation via direct vgchange call.
-Logical volumes are autoactivated according to auto_activation_volume_list
-set in lvm.conf(5).
-.TP
-.BR \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.TP
-.BR \-\-ignoremonitoring
-Make no attempt to interact with dmeventd unless
-.BR \-\-monitor
-is specified.
-Do not use this if dmeventd is already monitoring a device.
-.TP
-.BR \-\-lock\-start
-Start the lockspace of a shared VG in lvmlockd. lvmlockd locks becomes
-available for the VG, allowing LVM to use the VG. See
-.BR lvmlockd (8).
-.TP
-.BR \-\-lock\-stop
-Stop the lockspace of a shared VG in lvmlockd. lvmlockd locks become
-unavailable for the VG, preventing LVM from using the VG. See
-.BR lvmlockd (8).
-.TP
-.BR \-\-lock\-type " " \fILockType
-Change the VG lock type to or from a shared lock type used with lvmlockd. See
-.BR lvmlockd (8).
-.TP
-.BR \-l ", " \-\-logicalvolume " " \fIMaxLogicalVolumes
-Changes the maximum logical volume number of an existing inactive
-volume group.
-.TP
-.BR \-p ", " \-\-maxphysicalvolumes " " \fIMaxPhysicalVolumes
-Changes the maximum number of physical volumes that can belong
-to this volume group.
-For volume groups with metadata in lvm1 format, the limit is 255.
-If the metadata uses lvm2 format, the value 0 removes this restriction:
-there is then no limit. If you have a large number of physical volumes in
-a volume group with metadata in lvm2 format, for tool performance reasons,
-you should consider some use of \fB\-\-pvmetadatacopies 0\fP as described in
-\fBpvcreate(8)\fP, and/or use \fB\-\-vgmetadatacopies\fP.
-.TP
-.BR \-\-metadataprofile " " \fIProfileName
-Uses and attaches ProfileName configuration profile to the volume group
-metadata. Whenever the volume group is processed next time, the profile
-is automatically applied. The profile is inherited by all logical volumes
-in the volume group unless the logical volume itself has its own profile
-attached. See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
-.TP
-.BR \-\- [ vg ] metadatacopies " " \fINumberOfCopies | \fIunmanaged | \fIall
-Sets the desired number of metadata copies in the volume group. If set to
-a non-zero value, LVM will automatically manage the 'metadataignore'
-flags on the physical volumes (see \fBpvchange\fP or \fBpvcreate \-\-metadataignore\fP) in order
-to achieve \fINumberOfCopies\fP copies of metadata. If set to \fIunmanaged\fP,
-LVM will not automatically manage the 'metadataignore' flags. If set to
-\fIall\fP, LVM will first clear all of the 'metadataignore' flags on all
-metadata areas in the volume group, then set the value to \fIunmanaged\fP.
-The \fBvgmetadatacopies\fP option is useful for volume groups containing
-large numbers of physical volumes with metadata as it may be used to
-minimize metadata read and write overhead.
-.TP
-.BR \-s ", " \-\-physicalextentsize " " \fIPhysicalExtentSize [ \fIBbBsSkKmMgGtTpPeE ]
-Changes the physical extent size on physical volumes of this volume group.
-A size suffix (k for kilobytes up to t for terabytes) is optional, megabytes
-is the default if no suffix is present. For LVM2 format, the value must be a
-power of 2 of at least 1 sector (where the sector size is the largest sector
-size of the PVs currently used in the VG) or, if not a power of 2, at least
-128KiB. For the older LVM1 format, it must be a power of 2 of at least 8KiB.
-The default is 4 MiB.
-
-Before increasing the physical extent size, you might need to use lvresize,
-pvresize and/or pvmove so that everything fits. For example, every
-contiguous range of extents used in a logical volume must start and
-end on an extent boundary.
-
-If the volume group metadata uses lvm1 format, extents can vary in size from
-8KiB to 16GiB and there is a limit of 65534 extents in each logical volume.
-The default of 4 MiB leads to a maximum logical volume size of around 256GiB.
-
-If the volume group metadata uses lvm2 format those restrictions do not apply,
-but having a large number of extents will slow down the tools but have no
-impact on I/O performance to the logical volume. The smallest PE is 1KiB.
-
-The 2.4 kernel has a limitation of 2TiB per block device.
-.TP
-.BR \-\-systemid " " \fISystemID
-Changes the system ID of the VG. Using this option requires caution
-because the VG may become foreign to the host running the command,
-leaving the host unable to access it. See
-.BR lvmsystemid (7).
-.TP
-.BR \-\-refresh
-If any logical volume in the volume group is active, reload its metadata.
-This is not necessary in normal operation, but may be useful
-if something has gone wrong or if you're doing clustering
-manually without a clustered lock manager.
-.TP
-.BR \-x ", " \-\-resizeable " {" \fIy | \fIn }
-Enables or disables the extension/reduction of this volume group
-with/by physical volumes.
-.SH Examples
-To activate all known volume groups in the system:
-.sp
-.B vgchange \-a y
-
-To change the maximum number of logical volumes of inactive volume group
-vg00 to 128.
-.sp
-.B vgchange \-l 128 /dev/vg00
-
-
-.SH SEE ALSO
-.BR lvchange (8),
-.BR lvm (8),
-.BR vgcreate (8)
diff --git a/man/vgck.8.des b/man/vgck.8.des
new file mode 100644
index 0000000..24e1dbe
--- /dev/null
+++ b/man/vgck.8.des
@@ -0,0 +1 @@
+vgck checks LVM metadata for consistency.
diff --git a/man/vgck.8.in b/man/vgck.8.in
deleted file mode 100644
index b10f57e..0000000
--- a/man/vgck.8.in
+++ /dev/null
@@ -1,22 +0,0 @@
-.TH VGCK 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgck \(em check volume group metadata
-.SH SYNOPSIS
-.B vgck
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-v | \-\-verbose ]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgck checks LVM metadata for each named volume group for consistency.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcreate (8),
-.BR vgchange (8),
-.BR vgscan (8)
diff --git a/man/vgconvert.8.des b/man/vgconvert.8.des
new file mode 100644
index 0000000..47bc0cc
--- /dev/null
+++ b/man/vgconvert.8.des
@@ -0,0 +1,7 @@
+vgconvert converts VG metadata from one format to another. The new
+metadata format must be able to fit into the space provided by the old
+format.
+
+Because the LVM1 format should no longer be used, this command is no
+longer needed in general.
+
diff --git a/man/vgconvert.8.in b/man/vgconvert.8.in
deleted file mode 100644
index d864483..0000000
--- a/man/vgconvert.8.in
+++ /dev/null
@@ -1,48 +0,0 @@
-.TH VGCONVERT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgconvert \- convert volume group metadata format
-.SH SYNOPSIS
-.B vgconvert
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-labelsector ]
-.RB [ \-\-bootloaderareasize
-.IR size ]
-.RB [ \-M | \-\-metadatatype
-.IR type ]
-.RB [ \-\-pvmetadatacopies
-.IR NumberOfCopies ]
-.RB [ \-\-metadatasize
-.IR size ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-version ]
-.I VolumeGroupName
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgconvert converts
-.I VolumeGroupName
-metadata from one format to another provided that the metadata
-fits into the same space.
-.SH OPTIONS
-See \fBlvm\fP(8) and \fBpvcreate\fP(8) for options.
-.SH Examples
-Convert volume group vg1 from LVM1 metadata format to the new LVM2
-metadata format.
-.sp
-.B vgconvert \-M2 vg1
-.SH RECOVERY
-Use \fBpvscan\fP(8) to see which PVs lost their metadata.
-Run \fBpvcreate\fP(8) with the \fB\-\-uuid\fP and \fB\-\-restorefile\fP
-options on each such PV to reformat it as it was, using the archive
-file that \fBvgconvert\fP(8) created at the start of the procedure.
-Finally run \fBvgcfgrestore\fP(8) with that archive file to restore
-the original metadata.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvcreate (8),
-.BR vgcfgrestore (8)
diff --git a/man/vgcreate.8.des b/man/vgcreate.8.des
new file mode 100644
index 0000000..a2d7161
--- /dev/null
+++ b/man/vgcreate.8.des
@@ -0,0 +1,4 @@
+vgcreate creates a new VG on block devices. If the devices were not
+previously intialized as PVs with \fBpvcreate\fP(8), vgcreate will
+inititialize them, making them PVs. The pvcreate options for initializing
+devices are also available with vgcreate.
diff --git a/man/vgcreate.8.end b/man/vgcreate.8.end
new file mode 100644
index 0000000..66bcfbb
--- /dev/null
+++ b/man/vgcreate.8.end
@@ -0,0 +1,6 @@
+.SH EXAMPLES
+
+Create a VG with two PVs, using the default physical extent size.
+.br
+.B vgcreate myvg /dev/sdk1 /dev/sdl1
+
diff --git a/man/vgcreate.8.in b/man/vgcreate.8.in
deleted file mode 100644
index c66753b..0000000
--- a/man/vgcreate.8.in
+++ /dev/null
@@ -1,187 +0,0 @@
-.TH VGCREATE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgcreate \(em create a volume group
-.SH SYNOPSIS
-.B vgcreate
-.RB [ \-\-addtag
-.IR Tag ]
-.RB [ \-\-alloc
-.IR AllocationPolicy ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-c | \-\-clustered
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-l | \-\-maxlogicalvolumes
-.IR MaxLogicalVolumes ]
-.RB [ \-M | \-\-metadatatype
-.IR type ]
-.RB [ \-\-metadataprofile
-.IR ProfileName ]
-.RB [ \-p | \-\-maxphysicalvolumes
-.IR MaxPhysicalVolumes ]
-.RB [ \-\- [ vg ] metadatacopies
-.IR NumberOfCopies | unmanaged | all ]
-.RB [ \-s | \-\-physicalextentsize
-.IR PhysicalExtentSize [ bBsSkKmMgGtTpPeE ]]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-shared ]
-.RB [ \-\-systemid
-.IR SystemID ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RB [ "PHYSICAL DEVICE OPTIONS" ]
-.I VolumeGroupName PhysicalDevicePath
-.RI [ PhysicalDevicePath ...]
-.SH DESCRIPTION
-vgcreate creates a new volume group called
-.I VolumeGroupName
-using the block special device \fIPhysicalDevicePath\fP.
-.sp
-If \fIPhysicalDevicePath\fP was not previously configured for LVM with
-\fBpvcreate\fP(8), the device will be initialized with the same
-default values used with \fBpvcreate\fP(8). If non-default
-\fPpvcreate\fP values are desired, they may be given on the
-commandline with the same options as \fBpvcreate\fP(8). See
-.B PHYSICAL DEVICE OPTIONS
-for available options. Note that the restore-related options such as
-.BR \-\-restorefile ", " \-\-uuid " and " \-\-physicalvolumesize
-are not available. If a restore operation is needed, use
-\fBpvcreate\fP(8) and \fBvgcfgrestore\fP(8).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-c ", " \-\-clustered " {" \fIy | \fIn }
-If clustered locking is enabled, this defaults to \fBy\fP indicating that
-this Volume Group is shared with other nodes in the cluster.
-
-If the new Volume Group contains only local disks that are not visible
-on the other nodes, you must specify \fB\-\-clustered\ n\fP.
-If the cluster infrastructure is unavailable on a particular node at a
-particular time, you may still be able to use such Volume Groups.
-.TP
-.BR \-l ", " \-\-maxlogicalvolumes " " \fIMaxLogicalVolumes
-Sets the maximum number of logical volumes allowed in this
-volume group.
-The setting can be changed with \fBvgchange\fP(8).
-For volume groups with metadata in lvm1 format, the limit
-and default value is 255.
-If the metadata uses lvm2 format, the default value is 0
-which removes this restriction: there is then no limit.
-.TP
-.BR \-p ", " \-\-maxphysicalvolumes " " \fIMaxPhysicalVolumes
-Sets the maximum number of physical volumes that can belong
-to this volume group.
-The setting can be changed with \fBvgchange\fP.
-For volume groups with metadata in lvm1 format, the limit
-and default value is 255.
-If the metadata uses lvm2 format, the value 0 removes this restriction:
-there is then no limit. If you have a large number of physical volumes in
-a volume group with metadata in lvm2 format, for tool performance reasons,
-you should consider some use of \fB\-\-pvmetadatacopies 0\fP as described in
-\fBpvcreate\fP(8), and/or use \fB\-\-vgmetadatacopies\fP.
-.TP
-.BR \-\- [ vg ] metadatacopies " " \fINumberOfCopies | \fIunmanaged | \fIall
-Sets the desired number of metadata copies in the volume group. If set to
-a non-zero value, LVM will automatically manage the 'metadataignore'
-flags on the physical volumes (see \fBpvcreate\fP(8) or
-\fBpvchange \-\-metadataignore\fP) in order
-to achieve \fINumberOfCopies\fP copies of metadata. If set to \fIunmanaged\fP,
-LVM will not automatically manage the 'metadataignore' flags. If set to
-\fIall\fP, LVM will first clear all of the 'metadataignore' flags on all
-metadata areas in the volume group, then set the value to \fIunmanaged\fP.
-The \fBvgmetadatacopies\fP option is useful for volume groups containing
-large numbers of physical volumes with metadata as it may be used to
-minimize metadata read and write overhead.
-The default value is \fIunmanaged\fP.
-.TP
-.BR \-\-metadataprofile " " \fIProfileName
-Uses and attaches the ProfileName configuration profile to the volume group
-metadata. Whenever the volume group is processed next time, the profile is
-automatically applied. The profile is inherited by all logical volumes in
-the volume group unless the logical volume itself has its own profile attached.
-See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
-.TP
-.BR \-s ", " \-\-physicalextentsize " " \fIPhysicalExtentSize [ \fIbBsSkKmMgGtTpPeE ]
-Sets the physical extent size on physical volumes of this volume group.
-A size suffix (k for kilobytes up to t for terabytes) is optional, megabytes
-is the default if no suffix is present. For LVM2 format, the value must be a
-power of 2 of at least 1 sector (where the sector size is the largest sector
-size of the PVs currently used in the VG) or, if not a power of 2, at least
-128KiB. For the older LVM1 format, it must be a power of 2 of at least 8KiB.
-The default is 4 MiB.
-Once this value has been set, it is difficult to change it without recreating
-the volume group which would involve backing up and restoring data on any
-logical volumes. However, if no extents need moving for the new
-value to apply, it can be altered using \fBvgchange \-s\fP.
-
-If the volume group metadata uses lvm1 format, extents can vary in size from
-8KiB to 16GiB and there is a limit of 65534 extents in each logical volume. The
-default of 4 MiB leads to a maximum logical volume size of around 256GiB.
-
-If the volume group metadata uses lvm2 format those restrictions do not apply,
-but having a large number of extents will slow down the tools but have no
-impact on I/O performance to the logical volume. The smallest PE is 1KiB
-
-The 2.4 kernel has a limitation of 2TiB per block device.
-
-.TP
-.B \-\-shared
-Create a shared VG using lvmlockd if LVM is compiled with lockd support.
- lvmlockd will select lock type sanlock or dlm depending on which lock
-manager is running. This allows multiple hosts to share a VG on shared
-devices. lvmlockd and a lock manager must be configured and running. See
-.BR lvmlockd (8).
-
-.TP
-.BR \-\-systemid " " \fISystemID
-Specifies the system ID that will be given to the new VG, overriding the
-system ID of the host running the command. A VG is normally created
-without this option, in which case the new VG is given the system ID of
-the host creating it. Using this option requires caution because the
-system ID of the new VG may not match the system ID of the host running
-the command, leaving the VG inaccessible to the host. See
-.BR lvmsystemid (7).
-
-.SH PHYSICAL DEVICE OPTIONS
-The following options are available for initializing physical devices in the
-volume group. These options are further described in the \fBpvcreate\fP(8)
-man page.
-.TP
-.BR \-f ", " \-\-force
-.TP
-.BR \-y ", " \-\-yes
-.TP
-.BR \-Z ", " \-\-zero " {" \fIy | \fIn }
-.TP
-.B \-\-labelsector \fIsector
-.TP
-.B \-\-metadatasize \fIsize
-.TP
-.B \-\-pvmetadatacopies \fIcopies
-.TP
-.B \-\-dataalignment \fIalignment
-.TP
-.B \-\-dataalignmentoffset \fIalignment_offset
-.SH Examples
-Creates a volume group named "test_vg" using physical volumes "/dev/sdk1"
-and "/dev/sdl1" with default physical extent size of 4MiB:
-.sp
-.B vgcreate test_vg /dev/sdk1 /dev/sdl1
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvdisplay (8),
-.BR pvcreate (8),
-.BR vgdisplay (8),
-.BR vgextend (8),
-.BR vgreduce (8),
-.BR lvcreate (8),
-.BR lvdisplay (8),
-.BR lvextend (8),
-.BR lvreduce (8)
diff --git a/man/vgdisplay.8.des b/man/vgdisplay.8.des
new file mode 100644
index 0000000..c42f821
--- /dev/null
+++ b/man/vgdisplay.8.des
@@ -0,0 +1,4 @@
+vgdisplay shows the attributes of VGs, and the associated PVs and LVs.
+
+\fBvgs\fP(8) is a preferred alternative that shows the same information
+and more, using a more compact and configurable output format.
diff --git a/man/vgdisplay.8.in b/man/vgdisplay.8.in
deleted file mode 100644
index 045a6ae..0000000
--- a/man/vgdisplay.8.in
+++ /dev/null
@@ -1,123 +0,0 @@
-.TH VGDISPLAY 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgdisplay \(em display attributes of volume groups
-.SH SYNOPSIS
-.B vgdisplay
-.RB [ \-A | \-\-activevolumegroups ]
-.RB [ \-c | \-\-colon ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-s | \-\-short ]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName ...]
-.br
-
-.br
-.B vgdisplay
-.BR \-C | \-\-columns
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-logonly ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgdisplay allows you to see the attributes of
-.I VolumeGroupName
-(or all volume groups if none is given) with it's physical and logical
-volumes and their sizes etc.
-.P
-\fBvgs\fP(8) is an alternative that provides the same information
-in the style of \fBps\fP(1).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-A ", " \-\-activevolumegroups
-Only select the active volume groups. The volume group is considered active
-if at least one of its logical volumes is active.
-.TP
-.BR \-C ", " \-\-columns
-Display output in columns, the equivalent of \fBvgs\fP(8).
-Options listed are the same as options given in \fPvgs\fP(8).
-.TP
-.BR \-c ", " \-\-colon
-Generate colon separated output for easier parsing in scripts or programs.
-N.B. \fBvgs\fP(8) provides considerably more control over the output.
-.nf
-
-The values are:
-
-1 volume group name
-2 volume group access
-3 volume group status
-4 internal volume group number
-5 maximum number of logical volumes
-6 current number of logical volumes
-7 open count of all logical volumes in this volume group
-8 maximum logical volume size
-9 maximum number of physical volumes
-10 current number of physical volumes
-11 actual number of physical volumes
-12 size of volume group in kilobytes
-13 physical extent size
-14 total number of physical extents for this volume group
-15 allocated number of physical extents for this volume group
-16 free number of physical extents for this volume group
-17 uuid of volume group
-
-.fi
-.TP
-.BR \-s ", " \-\-short
-Give a short listing showing the existence of volume groups.
-.TP
-.BR \-v ", " \-\-verbose
-Display verbose information containing long listings of physical
-and logical volumes. If given twice, also display verbose runtime
-information of vgdisplay's activities.
-.TP
-.B \-\-version
-Display version and exit successfully.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgs (8),
-.BR pvcreate (8),
-.BR vgcreate (8),
-.BR lvcreate (8)
diff --git a/man/vgexport.8.des b/man/vgexport.8.des
new file mode 100644
index 0000000..f9fa49c
--- /dev/null
+++ b/man/vgexport.8.des
@@ -0,0 +1,8 @@
+vgexport makes inactive VGs unknown to the system. In this state, all the
+PVs in the VG can be moved to a different system, from which
+\fBvgimport\fP can then be run.
+
+Most LVM tools ignore exported VGs.
+
+vgexport clears the VG system ID, and vgimport sets the VG system ID to
+match the host running vgimport (if the host has a system ID).
diff --git a/man/vgexport.8.in b/man/vgexport.8.in
deleted file mode 100644
index 6e2ecbf..0000000
--- a/man/vgexport.8.in
+++ /dev/null
@@ -1,37 +0,0 @@
-.TH VGEXPORT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgexport \- make volume groups unknown to the system
-.SH SYNOPSIS
-.B vgexport
-.RB [ \-a | \-\-all ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-v | \-\-verbose ]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgexport allows you to make the inactive
-.IR VolumeGroupName (s)
-unknown to the system.
-You can then move all the Physical Volumes in that Volume Group to
-a different system for later
-.BR vgimport (8).
-Most LVM2 tools ignore exported Volume Groups.
-vgexport clears the VG system ID, and vgimport sets the VG system ID
-to match the host running vgimport (if the host has a system ID).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-a ", " \-\-all
-Export all inactive Volume Groups.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvscan (8),
-.BR vgimport (8),
-.BR vgscan (8),
-.BR lvmsystemid (7)
diff --git a/man/vgextend.8.des b/man/vgextend.8.des
new file mode 100644
index 0000000..85fe6fc
--- /dev/null
+++ b/man/vgextend.8.des
@@ -0,0 +1,11 @@
+vgextend adds one or more PVs to a VG. This increases the space available
+for LVs in the VG.
+
+Also, PVs that have gone missing and then returned, e.g. due to a
+transient device failure, can be added back to the VG without
+re-initializing them (see \-\-restoremissing).
+
+If the specified PVs have not yet been initialized with pvcreate, vgextend
+will initialize them. In this case pvcreate options can be used, e.g.
+\-\-labelsector, \-\-metadatasize, \-\-metadataignore,
+\-\-pvmetadatacopies, \-\-dataalignment, \-\-dataalignmentoffset.
diff --git a/man/vgextend.8.end b/man/vgextend.8.end
new file mode 100644
index 0000000..e50fcce
--- /dev/null
+++ b/man/vgextend.8.end
@@ -0,0 +1,6 @@
+.SH EXAMPLES
+
+Add two PVs to a VG.
+.br
+.B vgextend vg00 /dev/sda4 /dev/sdn1
+
diff --git a/man/vgextend.8.in b/man/vgextend.8.in
deleted file mode 100644
index 51bd615..0000000
--- a/man/vgextend.8.in
+++ /dev/null
@@ -1,71 +0,0 @@
-.TH VGEXTEND 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgextend \(em add physical volumes to a volume group
-.SH SYNOPSIS
-.B vgextend
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-restoremissing ]
-.RB [ \-f | \-\-force ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RB [ "PHYSICAL DEVICE OPTIONS" ]
-.I VolumeGroupName PhysicalDevicePath
-.RI [ PhysicalDevicePath ...]
-.SH DESCRIPTION
-vgextend allows you to add one or more initialized physical volumes
-(see \fBpvcreate\fP(8)) to an existing volume group to extend it in size. Moreover, it allows you to
-re-add a physical volume that has gone missing previously, due to a transient
-device failure, without re-initialising it. Use
-\fBvgextend \-\-restoremissing\fP to that effect.
-.sp
-If \fIPhysicalDevicePath\fP was not previously configured for LVM with
-\fBpvcreate\fP(8), the device will be initialized with the same
-default values used with \fBpvcreate\fP(8). If non-default
-\fPpvcreate\fP(8) values are desired, they may be given on the
-commandline with the same options as \fPpvcreate\fP(8). See
-.B PHYSICAL DEVICE OPTIONS
-for available options. Note that the restore-related options such as
-.BR \-\-restorefile ", " \-\-uuid " and " \-\-physicalvolumesize
-are not available. If a restore operation
-is needed, use \fBpvcreate\fP(8) and \fBvgcfgrestore\fP(8).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.SH PHYSICAL DEVICE OPTIONS
-The following options are available for initializing physical devices in the
-volume group. These options are further described in the
-\fBpvcreate\fP(8) man page.
-.TP
-.BR \-f ", " \-\-force
-.TP
-.BR \-y ", " \-\-yes
-.TP
-.BR \-Z ", " \-\-zero " {" \fIy | \fIn }
-.TP
-.B \-\-labelsector \fIsector
-.TP
-.B \-\-metadatasize \fIsize
-.TP
-.BR \-\-metadataignore " {" \fIy | \fIn }
-.TP
-.B \-\-pvmetadatacopies \fIcopies
-.TP
-.B \-\-dataalignment \fIalignment
-.TP
-.B \-\-dataalignmentoffset \fIalignment_offset
-.SH Examples
-Extends the existing volume group "vg00" by the new physical volumes
-(see \fBpvcreate\fP(8)) "/dev/sda4" and "/dev/sdn1".
-.sp
-.B vgextend vg00 /dev/sda4 /dev/sdn1
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcreate (8),
-.BR vgreduce (8),
-.BR pvcreate (8)
diff --git a/man/vgimport.8.des b/man/vgimport.8.des
new file mode 100644
index 0000000..91196b6
--- /dev/null
+++ b/man/vgimport.8.des
@@ -0,0 +1,5 @@
+vgimport makes exported VGs known to the system again, perhaps after
+moving the PVs from a different system.
+
+vgexport clears the VG system ID, and vgimport sets the VG system ID to
+match the host running vgimport (if the host has a system ID).
diff --git a/man/vgimport.8.in b/man/vgimport.8.in
deleted file mode 100644
index ba4fdf9..0000000
--- a/man/vgimport.8.in
+++ /dev/null
@@ -1,38 +0,0 @@
-.TH VGIMPORT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgimport \(em make exported volume groups known to the system
-.SH SYNOPSIS
-.B vgimport
-.RB [ \-a | \-\-all ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-v | \-\-verbose ]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgimport allows you to make a Volume Group that was previously
-exported using
-.BR vgexport (8)
-known to the system again, perhaps after moving its Physical Volumes
-from a different machine.
-vgexport clears the VG system ID, and vgimport sets the VG system ID
-to match the host running vgimport (if the host has a system ID).
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-a ", " \-\-all
-Import all exported Volume Groups.
-.TP
-.BR \-\-force
-Import exported Volume Groups even if there are missing Physical Volumes.
-This option should only be used if the missing devices are known to have
-failed and they cannot be restored.
-.SH SEE ALSO
-.BR lvm (8),
-.BR pvscan (8),
-.BR vgexport (8),
-.BR vgscan (8),
-.BR lvmsystemid (7)
diff --git a/man/vgimportclone.8.des b/man/vgimportclone.8.des
new file mode 100644
index 0000000..a5002da
--- /dev/null
+++ b/man/vgimportclone.8.des
@@ -0,0 +1,6 @@
+vgimportclone imports a VG from duplicated PVs, e.g. created by a hardware
+snapshot of existing PVs.
+
+A duplicated VG cannot used until it is made to coexist with the original
+VG. vgimportclone renames the VG associated with the specified PVs and
+changes the associated VG and PV UUIDs.
diff --git a/man/vgimportclone.8.end b/man/vgimportclone.8.end
new file mode 100644
index 0000000..83394b5
--- /dev/null
+++ b/man/vgimportclone.8.end
@@ -0,0 +1,9 @@
+.SH EXAMPLES
+
+An original VG "vg00" has PVs "/dev/sda" and "/dev/sdb".
+The corresponding PVs from a hardware snapshot are "/dev/sdc" and "/dev/sdd".
+Rename the VG associated with "/dev/sdc" and "/dev/sdd" from "vg00" to "vg00_snap"
+(and change associated UUIDs).
+.br
+.B vgimportclone \-\-basevgname vg00_snap /dev/sdc /dev/sdd
+
diff --git a/man/vgimportclone.8.in b/man/vgimportclone.8.in
deleted file mode 100644
index cdf5e68..0000000
--- a/man/vgimportclone.8.in
+++ /dev/null
@@ -1,46 +0,0 @@
-.TH VGIMPORTCLONE 8 "LVM TOOLS #VERSION#" "Red Hat, Inc." \" -*- nroff -*-
-.SH NAME
-vgimportclone \(em import and rename duplicated volume group (e.g. a hardware snapshot)
-.SH SYNOPSIS
-.B vgimportclone
-.RB [ \-n | \-\-basevgname
-.IR VolumeGroupName ]
-.RB [ \-i | \-\-import ]
-.I PhysicalVolume
-.RI [ PhysicalVolume ...]
-.SH DESCRIPTION
-vgimportclone is used to import a duplicated VG (e.g. hardware snapshot).
-Duplicate VG(s) and PV(s) are not able to be used until they are made
-to coexist with the origin VG(s) and PV(s).
-vgimportclone renames the VG associated with the specified PV(s) and
-changes the associated VG and PV UUIDs.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-n ", " \-\-basevgname " " \fIVolumeGroupName
-By default the snapshot VG will be renamed to the original name plus a
-numeric suffix to avoid duplicate naming (e.g. 'test_vg' would be renamed
-to 'test_vg1'). This option will override the base VG name that is
-used for all VG renames. If a VG already exists with the specified name
-a numeric suffix will be added (like the previous example) to make it unique.
-.TP
-.BR \-i ", " \-\-import
-Import exported Volume Groups. Otherwise VGs that have been exported
-will not be changed (nor will their associated PVs).
-.SH ENVIRONMENT VARIABLES
-.TP
-.B LVM_BINARY
-The LVM2 binary to use. Defaults to "lvm".
-.SH Examples
-The origin VG "vg00" has origin PVs "/dev/sda" and "/dev/sdb"
-and the respective snapshot PVs are "/dev/sdc" and "/dev/sdd".
-To rename the VG associated with "/dev/sdc" and "/dev/sdd"
-from "vg00" to "vg00_snap"
-(and to change associated VG and PV UUIDs) do:
-.sp
-.B vgimportclone \-\-basevgname vg00_snap /dev/sdc /dev/sdd
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgrename (8)
-
diff --git a/man/vgmerge.8.des b/man/vgmerge.8.des
new file mode 100644
index 0000000..ff7c177
--- /dev/null
+++ b/man/vgmerge.8.des
@@ -0,0 +1,3 @@
+vgmerge merges two existing VGs. The inactive source VG is merged into the
+destination VG if physical extent sizes are equal and PV and LV summaries
+of both VGs fit into the destination VG's limits.
diff --git a/man/vgmerge.8.end b/man/vgmerge.8.end
new file mode 100644
index 0000000..9787c6a
--- /dev/null
+++ b/man/vgmerge.8.end
@@ -0,0 +1,7 @@
+.SH EXAMPLES
+
+Merge an inactive VG named "vg00" into the active or inactive VG named
+"databases", giving verbose runtime information.
+.br
+.B vgmerge \-v databases vg00
+
diff --git a/man/vgmerge.8.in b/man/vgmerge.8.in
deleted file mode 100644
index bfc8c34..0000000
--- a/man/vgmerge.8.in
+++ /dev/null
@@ -1,41 +0,0 @@
-.TH VGMERGE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgmerge \(em merge two volume groups
-.SH SYNOPSIS
-.B vgmerge
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-l | \-\-list ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.I DestinationVolumeGroupName
-.I SourceVolumeGroupName
-.SH DESCRIPTION
-vgmerge merges two existing volume groups. The inactive
-\fISourceVolumeGroupName\fP will be merged into
-the \fIDestinationVolumeGroupName\fP if physical extent sizes
-are equal and physical and logical volume summaries of both volume groups
-fit into \fIDestinationVolumeGroupName\fP's limits.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-l ", " \-\-list
-Display merged \fIDestinationVolumeGroupName\fP like \fBvgdisplay \-v\fP.
-.TP
-.BR \-t ", " \-\-test
-Do a test run WITHOUT making any real changes.
-.SH Examples
-Merge the inactive volume group named "my_vg"
-into the active or inactive volume group named "databases" giving verbose
-runtime information:
-.sp
-.B vgmerge \-v databases my_vg
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcreate (8),
-.BR vgextend (8),
-.BR vgreduce (8)
diff --git a/man/vgmknodes.8.des b/man/vgmknodes.8.des
new file mode 100644
index 0000000..a93d629
--- /dev/null
+++ b/man/vgmknodes.8.des
@@ -0,0 +1,5 @@
+vgmknodes checks the LVM device nodes in /dev that are needed for active
+LVs and creates any that are missing and removes unused ones.
+
+This command should not usually be needed if all the system components are
+interoperating correctly.
diff --git a/man/vgmknodes.8.in b/man/vgmknodes.8.in
deleted file mode 100644
index c5bb5d4..0000000
--- a/man/vgmknodes.8.in
+++ /dev/null
@@ -1,30 +0,0 @@
-.TH VGMKNODES 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgmknodes \(em recreate volume group directory and logical volume special files
-.SH SYNOPSIS
-.B vgmknodes
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-\-refresh ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-v | \-\-verbose ]
-.RI [[ VolumeGroupName | LogicalVolumePath ]...]
-.SH DESCRIPTION
-Checks the LVM2 special files in /dev that are needed for active
-logical volumes and creates any missing ones and removes unused ones.
-.SH OPTIONS
-.TP
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-\-refresh
-If any logical volume in the volume group is active, reload its metadata.
-This is not necessary in normal operation, but may be useful
-if something has gone wrong or if you're doing clustering
-manually without a clustered lock manager.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgscan (8),
-.BR dmsetup (8)
diff --git a/man/vgreduce.8.des b/man/vgreduce.8.des
new file mode 100644
index 0000000..1bcdaf9
--- /dev/null
+++ b/man/vgreduce.8.des
@@ -0,0 +1 @@
+vgreduce removes one or more unused PVs from a VG.
diff --git a/man/vgreduce.8.in b/man/vgreduce.8.in
deleted file mode 100644
index cce31e8..0000000
--- a/man/vgreduce.8.in
+++ /dev/null
@@ -1,49 +0,0 @@
-.TH VGREDUCE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgreduce \(em reduce a volume group
-.SH SYNOPSIS
-.B vgreduce
-.RB [ \-a | \-\-all ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-removemissing ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.I VolumeGroupName
-.RI [ PhysicalVolumePath ...]
-.SH DESCRIPTION
-vgreduce allows you to remove one or more unused physical volumes
-from a volume group.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-a ", " \-\-all
-Removes all empty physical volumes if none are given on command line.
-.TP
-.B \-\-removemissing
-Removes all missing physical volumes from the volume group, if there are no
-logical volumes allocated on those. This resumes normal operation of the volume
-group (new logical volumes may again be created, changed and so on).
-
-If this is not possible (there are logical volumes referencing the missing
-physical volumes) and you cannot or do not want to remove them manually, you
-can run this option with \fB\-\-force\fP to have \fBvgreduce\fP
-remove any partial LVs.
-
-Any logical volumes and dependent snapshots that were partly on the
-missing disks get removed completely. This includes those parts
-that lie on disks that are still present.
-
-If your logical volumes spanned several disks including the ones that are
-lost, you might want to try to salvage data first by activating your
-logical volumes with \fB\-\-partial\fP as described in \fBlvm\fP(8).
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgextend (8)
diff --git a/man/vgremove.8.des b/man/vgremove.8.des
new file mode 100644
index 0000000..04dc0e3
--- /dev/null
+++ b/man/vgremove.8.des
@@ -0,0 +1,6 @@
+vgremove removes one or more VGs. If LVs exist in the VG, a prompt is used
+to confirm LV removal.
+
+If one or more PVs in the VG are lost, consider
+\fBvgreduce \-\-removemissing\fP to make the VG
+metadata consistent again.
diff --git a/man/vgremove.8.in b/man/vgremove.8.in
deleted file mode 100644
index 4e600ef..0000000
--- a/man/vgremove.8.in
+++ /dev/null
@@ -1,46 +0,0 @@
-.TH VGREMOVE 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgremove \(em remove a volume group
-.SH SYNOPSIS
-.B vgremove
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-f | \-\-force ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-noudevsync ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.RI [ VolumeGroupName ...]
-.SH DESCRIPTION
-vgremove allows you to remove one or more volume groups.
-If one or more physical volumes in the volume group are lost,
-consider \fBvgreduce \-\-removemissing\fP to make the volume group
-metadata consistent again.
-.sp
-If there are logical volumes that exist in the volume group,
-a prompt will be given to confirm removal. You can override
-the prompt with \fB\-f\fP.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.BR \-f ", " \-\-force
-Force the removal of any logical volumes on the volume group
-without confirmation.
-To remove also damaged pool volumes use \-ff.
-.TP
-.BR \-\-noudevsync
-Disable udev synchronisation. The
-process will not wait for notification from udev.
-It will continue irrespective of any possible udev processing
-in the background. You should only use this if udev is not running
-or has rules that ignore the devices LVM2 creates.
-.SH SEE ALSO
-.BR lvm (8),
-.BR lvremove (8),
-.BR vgcreate (8),
-.BR vgreduce (8)
diff --git a/man/vgrename.8.des b/man/vgrename.8.des
new file mode 100644
index 0000000..2384b6b
--- /dev/null
+++ b/man/vgrename.8.des
@@ -0,0 +1,9 @@
+vgrename renames a VG.
+
+All VGs visible to a system need to have different names, otherwise many
+LVM commands will refuse to run or give warning messages. VGs with the
+same name can occur when disks are moved between machines, or filters are
+changed. If a newly connected disk has a VG with the same name as the VG
+containing the root filesystem, the machine may not boot correctly. When
+two VGs have the same name, the VG UUID can be used in place of the source
+VG name.
diff --git a/man/vgrename.8.end b/man/vgrename.8.end
new file mode 100644
index 0000000..98eeb53
--- /dev/null
+++ b/man/vgrename.8.end
@@ -0,0 +1,10 @@
+.SH EXAMPLES
+
+Rename VG "vg02" to "myvg":
+.br
+.B vgrename "vg02" "myvg"
+
+Rename the VG with the specified UUID to "myvg".
+.br
+.B vgrename Zvlifi\-Ep3t\-e0Ng\-U42h\-o0ye\-KHu1\-nl7Ns4 myvg
+
diff --git a/man/vgrename.8.in b/man/vgrename.8.in
deleted file mode 100644
index 322d740..0000000
--- a/man/vgrename.8.in
+++ /dev/null
@@ -1,58 +0,0 @@
-.TH VGRENAME 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgrename \(em rename a volume group
-.SH SYNOPSIS
-.B vgrename
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.IR OldVolumeGroup { Path | Name | UUID }
-.IR NewVolumeGroup { Path | Name }
-.SH DESCRIPTION
-vgrename renames an existing (see
-.BR vgcreate (8))
-volume group from
-.IR OldVolumeGroup { Name | Path | UUID }
-to
-.IR NewVolumeGroup { Name | Path }.
-
-All the Volume Groups visible to a system need to have different
-names. Otherwise many LVM2 commands will refuse to run or give
-warning messages.
-
-This situation could arise when disks are moved between machines. If
-a disk is connected and it contains a Volume Group with the same name
-as the Volume Group containing your root filesystem the machine might
-not even boot correctly. However, the two Volume Groups should have
-different UUIDs (unless the disk was cloned) so you can rename
-one of the conflicting Volume Groups with
-\fBvgrename\fP.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.SH Examples
-Renames existing volume group vg02 to my_volume_group:
-.sp
-.B vgrename /dev/vg02 /dev/my_volume_group
-
-or
-.sp
-.B vgrename vg02 my_volume_group
-
-Changes the name of the Volume Group with UUID
-.br
-Zvlifi-Ep3t-e0Ng-U42h-o0ye-KHu1-nl7Ns4 to VolGroup00_tmp:
-.sp
-.B vgrename Zvlifi\-Ep3t\-e0Ng\-U42h\-o0ye\-KHu1\-nl7Ns4 VolGroup00_tmp
-
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgchange (8),
-.BR vgcreate (8),
-.BR lvrename (8)
diff --git a/man/vgs.8.des b/man/vgs.8.des
new file mode 100644
index 0000000..15bdb97
--- /dev/null
+++ b/man/vgs.8.des
@@ -0,0 +1 @@
+vgs produces formatted output about VGs.
diff --git a/man/vgs.8.end b/man/vgs.8.end
new file mode 100644
index 0000000..b8cda26
--- /dev/null
+++ b/man/vgs.8.end
@@ -0,0 +1,17 @@
+.SH NOTES
+.
+The vg_attr bits are:
+.IP 1 3
+Permissions: (w)riteable, (r)ead-only
+.IP 2 3
+Resi(z)eable
+.IP 3 3
+E(x)ported
+.IP 4 3
+(p)artial: one or more physical volumes belonging to the volume group
+are missing from the system
+.IP 5 3
+Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere
+.IP 6 3
+(c)lustered, (s)hared
+
diff --git a/man/vgs.8.in b/man/vgs.8.in
deleted file mode 100644
index 080086c..0000000
--- a/man/vgs.8.in
+++ /dev/null
@@ -1,161 +0,0 @@
-.TH VGS 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgs \(em report information about volume groups
-.SH SYNOPSIS
-.B vgs
-.RB [ \-a | \-\-all ]
-.RB [ \-\-aligned ]
-.RB [ \-\-binary ]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [[ \-\-configreport
-.IR ReportName ]
-.RB [ \-o | \-\-options
-.RI [ + | \- | # ] Field1 [, Field2 ...]
-.RB [ \-O | \-\-sort
-.RI [ + | \- ] Key1 [, Key2 ...]]
-.RB [ \-S | \-\-select
-.IR Selection ]
-.RB ...]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-ignoreskippedcluster ]
-.RB [ \-\-logonly ]
-.RB [ \-\-nameprefixes ]
-.RB [ \-\-noheadings ]
-.RB [ \-\-nosuffix ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-\-rows ]
-.RB [ \-\-separator
-.IR Separator ]
-.RB [ \-\-unbuffered ]
-.RB [ \-\-units
-.IR hHbBsSkKmMgGtTpPeE ]
-.RB [ \-\-unquoted ]
-.RB [ \-v | \-\-verbose ]
-.RB [ \-\-version ]
-.RI [ VolumeGroupName
-.RI [ VolumeGroupName ...]]
-.SH DESCRIPTION
-vgs produces formatted output about volume groups.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.B \-\-all
-List all volume groups. Equivalent to not specifying any volume groups.
-.TP
-.B \-\-aligned
-Use with \fB\-\-separator\fP to align the output columns.
-.TP
-.B \-\-binary
-Use binary values "0" or "1" instead of descriptive literal values
-for columns that have exactly two valid values to report (not counting
-the "unknown" value which denotes that the value could not be determined).
-.TP
-.B \-\-configreport \fI ReportName
-Make any subsequent \fB\-o, \-\-options\fP, \fB\-O, \-\-sort\fP or
-\fB\-S, \-\-select\fP to apply for \fIReportName\fP where \fIReportName\fP
-is either 'vg' for command's main report or 'log' for log report.
-If \fB\-\-configreport\fP option is not used to identify a report, then
-command's main report is assumed. The log report is available only if
-enabled by \fBlog/report_command_log\fP \fBlvm.conf\fP(5) setting or
-if \fB\-\-logonly\fP option is used.
-.TP
-.B \-\-logonly
-Suppress the vgs report itself and display only log report on output.
-.TP
-.B \-\-nameprefixes
-Add an "LVM2_" prefix plus the field name to the output. Useful
-with \fB\-\-noheadings\fP to produce a list of field=value pairs that can
-be used to set environment variables (for example, in \fBudev\fP(7) rules).
-.TP
-.B \-\-noheadings
-Suppress the headings line that is normally the first line of output.
-Useful if grepping the output.
-.TP
-.B \-\-nosuffix
-Suppress the suffix on output sizes. Use with \fB\-\-units\fP
-(except h and H) if processing the output.
-.TP
-.BR \-o ", " \-\-options
-Comma-separated ordered list of columns.
-.IP
-Precede the list with '\fI+\fP' to append to the current list
-of columns, '\fI-\fP' to remove from the current list of columns
-or '\fI#\fP' to compact given columns. The \fI\-o\fP option can
-be repeated, providing several lists. These lists are evaluated
-from left to right.
-.IP
-Use \fB\-o vg_all\fP to select all volume group columns.
-.IP
-Use \fB\-o help\fP to view the full list of columns available.
-.IP
-Column names include: vg_fmt, vg_uuid, vg_name, vg_attr, vg_size, vg_free,
-vg_sysid, vg_extent_size, vg_extent_count, vg_free_count, vg_profile, max_lv,
-max_pv, pv_count, lv_count, snap_count, vg_seqno, vg_tags, vg_mda_count,
-vg_mda_free, and vg_mda_size, vg_mda_used_count.
-.IP
-Any "vg_" prefixes are optional. Columns mentioned in either \fBpvs\fP(8)
-or \fBlvs\fP(8) can also be chosen, but columns cannot be taken from both
-at the same time.
-.IP
-The vg_attr bits are:
-.RS
-.IP 1 3
-Permissions: (w)riteable, (r)ead-only
-.IP 2 3
-Resi(z)eable
-.IP 3 3
-E(x)ported
-.IP 4 3
-(p)artial: one or more physical volumes belonging to the volume group
-are missing from the system
-.IP 5 3
-Allocation policy: (c)ontiguous, c(l)ing, (n)ormal, (a)nywhere
-.IP 6 3
-(c)lustered, (s)hared
-.RE
-.TP
-.BR \-O ", " \-\-sort
-Comma-separated ordered list of columns to sort by. Replaces the default
-selection. Precede any column with '\fI\-\fP' for a reverse sort on that
-column.
-.TP
-.B \-\-rows
-Output columns as rows.
-.TP
-.BR \-S ", " \-\-select " " \fISelection
-Display only rows that match Selection criteria. All rows are displayed with
-the additional "selected" column (\fB-o selected\fP) showing 1 if the row
-matches the Selection and 0 otherwise. The Selection criteria are defined
-by specifying column names and their valid values (that can include reserved
-values) while making use of supported comparison operators. See \fBlvm\fP(8)
-and \fB\-S\fP, \fB\-\-select\fP description for more detailed information
-about constructing the Selection criteria. As a quick help and to see full
-list of column names that can be used in Selection including the list of
-reserved values and the set of supported selection operators, check the
-output of \fBvgs -S help\fP command.
-.TP
-.B \-\-separator \fISeparator
-String to use to separate each column. Useful if grepping the output.
-.TP
-.B \-\-unbuffered
-Produce output immediately without sorting or aligning the columns properly.
-.TP
-.B \-\-units \fIhHbBsSkKmMgGtTpPeE
-All sizes are output in these units: (h)uman-readable, (b)ytes, (s)ectors,
-(k)ilobytes, (m)egabytes, (g)igabytes, (t)erabytes, (p)etabytes, (e)xabytes.
-Capitalise to use multiples of 1000 (S.I.) instead of 1024. Can also specify
-custom units e.g. \-\-units 3M
-.TP
-.B \-\-unquoted
-When used with \fB\-\-nameprefixes\fP, output values in the field=value
-pairs are not quoted.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgdisplay (8),
-.BR pvs (8),
-.BR lvs (8)
diff --git a/man/vgscan.8.des b/man/vgscan.8.des
new file mode 100644
index 0000000..e8041ed
--- /dev/null
+++ b/man/vgscan.8.des
@@ -0,0 +1 @@
+vgscan scans all supported LVM block devices in the system for VGs.
diff --git a/man/vgscan.8.in b/man/vgscan.8.in
deleted file mode 100644
index e85d817..0000000
--- a/man/vgscan.8.in
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH VGSCAN 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgscan \(em scan all disks for volume groups and rebuild caches
-.SH SYNOPSIS
-.B vgscan
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-? | \-\-help ]
-.RB [ \-\-ignorelockingfailure ]
-.RB [ \-\-mknodes ]
-.RB [ \-\-notifydbus ]
-.RB [ \-P | \-\-partial ]
-.RB [ \-\-reportformat
-.RB { basic | json }]
-.RB [ \-v | \-\-verbose ]
-.SH DESCRIPTION
-vgscan scans all SCSI, (E)IDE disks, multiple devices and a bunch
-of other disk devices in the system looking for LVM physical volumes
-and volume groups. Define a filter in \fBlvm.conf\fP(5) to restrict
-the scan to avoid a CD ROM, for example.
-.LP
-In LVM2, vgscans take place automatically; but you might still need to
-run one explicitly after changing hardware.
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.TP
-.B \-\-mknodes
-Also checks the LVM special files in /dev that are needed for active
-logical volumes and creates any missing ones and removes unused ones.
-.TP
-.B \-\-notifydbus
-Send a notification to D-Bus. The command will exit with an error
-if LVM is not built with support for D-Bus notification, or if the
-notify_dbus config setting is disabled.
-.TP
-.B \-\-cache
-Scan devices for LVM physical volumes and volume groups and instruct
-the lvmetad daemon to update its cached state accordingly.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcreate (8),
-.BR vgchange (8)
diff --git a/man/vgsplit.8.des b/man/vgsplit.8.des
new file mode 100644
index 0000000..29eb5c5
--- /dev/null
+++ b/man/vgsplit.8.des
@@ -0,0 +1,13 @@
+vgsplit moves one or more PVs from a source VG to a destination VG. The
+PVs can be specified explicitly or implicitly by naming an LV, in which
+case on PVs underlying the LV are moved.
+
+If the destination VG does not exist, a new VG is created (command options
+can be used to specify properties of the new VG, also see
+\fBvgcreate\fP(8).)
+
+LVs cannot be split between VGs; each LV must be entirely on the PVs in
+the source or destination VG.
+
+vgsplit can only move complete PVs. (See \fBpvmove\fP(8) for moving part
+of a PV.)
diff --git a/man/vgsplit.8.in b/man/vgsplit.8.in
deleted file mode 100644
index 5939ed5..0000000
--- a/man/vgsplit.8.in
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH VGSPLIT 8 "LVM TOOLS #VERSION#" "Sistina Software UK" \" -*- nroff -*-
-.SH NAME
-vgsplit \(em split a volume group into two
-.SH SYNOPSIS
-.B vgsplit
-.RB [ \-\-alloc
-.IR AllocationPolicy ]
-.RB [ \-A | \-\-autobackup
-.RI { y | n }]
-.RB [ \-c | \-\-clustered
-.RI { y | n }]
-.RB [ \-\-commandprofile
-.IR ProfileName ]
-.RB [ \-d | \-\-debug ]
-.RB [ \-h | \-\-help ]
-.RB [ \-l | \-\-maxlogicalvolumes
-.IR MaxLogicalVolumes ]
-.RB [ \-M | \-\-metadatatype
-.IR type ]
-.RB [ \-p | \-\-maxphysicalvolumes
-.IR MaxPhysicalVolumes ]
-.RB [ \-\- [ vg ] metadatacopies
-.IR NumberOfCopies | unmanaged | all ]
-.RB [ \-n | \-\-name
-.IR LogicalVolumeName ]
-.RB [ \-t | \-\-test ]
-.RB [ \-v | \-\-verbose ]
-.I SourceVolumeGroupName DestinationVolumeGroupName
-.RI [ PhysicalVolumePath ...]
-.SH DESCRIPTION
-vgsplit moves one or more physical volumes from
-\fISourceVolumeGroupName\fP into \fIDestinationVolumeGroupName\fP.
-The physical volumes moved can be specified either explicitly via
-\fIPhysicalVolumePath\fP, or implicitly by \fB\-n\fP
-\fILogicalVolumeName\fP, in which case only physical volumes
-underlying the specified logical volume will be moved.
-
-If \fIDestinationVolumeGroupName\fP does not exist, a new volume
-group will be created. The default attributes
-for the new volume group can be specified with
-.BR \-\-alloc ,
-.BR \-\-clustered ,
-.BR \-\-maxlogicalvolumes ,
-.BR \-\-metadatatype ,
-.B \-\-maxphysicalvolumes \fRand
-.BR \-\- [ vg ] metadatacopies
-(see \fBvgcreate\fP(8) for a description of these options). If any
-of these options are not given, default attribute(s) are taken from
-\fISourceVolumeGroupName\fP. If a non-LVM2 metadata type (e.g. lvm1) is
-being used, you should use the \fB\-M\fP option to specify the metadata
-type directly.
-
-If
-.I DestinationVolumeGroupName
-does exist, it will be checked for compatibility with
-.I SourceVolumeGroupName
-before the physical volumes are moved. Specifying any of the above default
-volume group attributes with an existing destination volume group is an error,
-and no split will occur.
-
-Logical volumes cannot be split between volume groups. \fBvgsplit\fP(8) only
-moves complete physical volumes: To move part of a physical volume, use
-\fBpvmove\fP(8). Each existing logical volume must be entirely on the physical
-volumes forming either the source or the destination volume group. For this
-reason, \fBvgsplit\fP(8) may fail with an error if a split would result in a
-logical volume being split across volume groups.
-
-A vgsplit into an existing volume group retains the existing volume group's
-value of \fPvgmetadatacopies\fP (see \fBvgcreate\fP(8) and \fBlvm.conf\fP(5) for further
-explanation of \fPvgmetadatacopies\fP). To change the value of
-\fBvgmetadatacopies\fP, use \fBvgchange\fP(8).
-
-.SH OPTIONS
-See \fBlvm\fP(8) for common options.
-.SH SEE ALSO
-.BR lvm (8),
-.BR vgcreate (8),
-.BR vgextend (8),
-.BR vgreduce (8),
-.BR vgmerge (8)
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 1761be4..5aaba2f 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,4 +1,3 @@
-
#
# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
# Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
7 years, 3 months
master - args: use arg parsing function for region size
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=13a6368522894e...
Commit: 13a6368522894e9d32544d8fb3d6360bbe9018d1
Parent: a1386dcca024b51019c1f3be6b153249df06dbac
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Feb 7 15:12:24 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:21:58 2017 -0600
args: use arg parsing function for region size
Consolidate the validation of the region size arg
in a new arg parsing function.
---
lib/config/config_settings.h | 9 ++++---
lib/metadata/lv_manip.c | 7 ++++++
tools/args.h | 6 +---
tools/command-lines.in | 8 +++---
tools/command.c | 1 +
tools/lvconvert.c | 43 ++---------------------------------------
tools/lvcreate.c | 14 -------------
tools/lvmcmdline.c | 39 ++++++++++++++++++++++++++++++++++++++
tools/tools.h | 1 +
tools/vals.h | 5 ++++
10 files changed, 67 insertions(+), 66 deletions(-)
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index 1d9603f..2b76526 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -1221,14 +1221,15 @@ cfg_array(activation_read_only_volume_list_CFG, "read_only_volume_list", activat
"read_only_volume_list = [ \"vg1\", \"vg2/lvol1\", \"@tag1\", \"@*\" ]\n"
"#\n")
-cfg(activation_mirror_region_size_CFG, "mirror_region_size", activation_CFG_SECTION, 0, CFG_TYPE_INT, DEFAULT_RAID_REGION_SIZE, vsn(1, 0, 0), NULL, vsn(2, 2, 99),
+ cfg(activation_mirror_region_size_CFG, "mirror_region_size", activation_CFG_SECTION, 0, CFG_TYPE_INT, DEFAULT_RAID_REGION_SIZE, vsn(1, 0, 0), NULL, vsn(2, 2, 99),
"This has been replaced by the activation/raid_region_size setting.\n",
- "Size in KiB of each copy operation when mirroring.\n")
+ "Size in KiB of each raid or mirror synchronization region.\n")
cfg(activation_raid_region_size_CFG, "raid_region_size", activation_CFG_SECTION, 0, CFG_TYPE_INT, DEFAULT_RAID_REGION_SIZE, vsn(2, 2, 99), NULL, 0, NULL,
"Size in KiB of each raid or mirror synchronization region.\n"
- "For raid or mirror segment types, this is the amount of data that is\n"
- "copied at once when initializing, or moved at once by pvmove.\n")
+ "The clean/dirty state of data is tracked for each region.\n"
+ "The value is rounded down to a power of two if necessary, and\n"
+ "is ignored if it is not a multiple of the machine memory page size.\n")
cfg(activation_error_when_full_CFG, "error_when_full", activation_CFG_SECTION, CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_ERROR_WHEN_FULL, vsn(2, 2, 115), NULL, 0, NULL,
"Return errors if a thin pool runs out of space.\n"
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index bc599de..d8f869d 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -712,6 +712,7 @@ static int _round_down_pow2(int r)
int get_default_region_size(struct cmd_context *cmd)
{
+ int pagesize = lvm_getpagesize();
int region_size = _get_default_region_size(cmd);
if (!is_power_of_2(region_size)) {
@@ -720,6 +721,12 @@ int get_default_region_size(struct cmd_context *cmd)
region_size / 2);
}
+ if (region_size % (pagesize >> SECTOR_SHIFT)) {
+ region_size = DEFAULT_RAID_REGION_SIZE * 2;
+ log_verbose("Using default region size %u kiB (multiple of page size).",
+ region_size / 2);
+ }
+
return region_size;
}
diff --git a/tools/args.h b/tools/args.h
index a481bc5..b33df9a 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -1212,10 +1212,8 @@ arg(resizefs_ARG, 'r', "resizefs", 0, 0, 0,
/* Not used */
arg(reset_ARG, 'R', "reset", 0, 0, 0, NULL)
-arg(regionsize_ARG, 'R', "regionsize", sizemb_VAL, 0, 0,
- "A mirror is divided into regions of this size, and the mirror log\n"
- "uses this granularity to track which regions are in sync.\n"
- "(This can be used with the \"mirror\" type, not the \"raid1\" type.)\n")
+arg(regionsize_ARG, 'R', "regionsize", regionsize_VAL, 0, 0,
+ "Size of each raid or mirror synchronization region.\n")
arg(physicalextentsize_ARG, 's', "physicalextentsize", sizemb_VAL, 0, 0,
"#vgcreate\n"
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 6743b79..1a9a796 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -317,7 +317,7 @@ RULE: all not LV_thinpool LV_cachepool
---
OO_LVCONVERT_RAID: --mirrors SNumber, --stripes_long Number,
---stripesize SizeKB, --regionsize SizeMB, --interval Number
+--stripesize SizeKB, --regionsize RegionSize, --interval Number
OO_LVCONVERT_POOL: --poolmetadata LV, --poolmetadatasize SizeMB,
--poolmetadataspare Bool, --readahead Readahead, --chunksize SizeKB
@@ -364,7 +364,7 @@ ID: lvconvert_raid_types
DESC: Convert LV to raid1 or mirror, or change number of mirror images.
RULE: all not lv_is_locked lv_is_pvmove
-lvconvert --regionsize SizeMB LV_raid
+lvconvert --regionsize RegionSize LV_raid
OO: OO_LVCONVERT
ID: lvconvert_change_region_size
DESC: Change the region size of an LV.
@@ -655,7 +655,7 @@ OO_LVCREATE_POOL: --poolmetadatasize SizeMB, --poolmetadataspare Bool, --chunksi
OO_LVCREATE_THIN: --discards Discards, --errorwhenfull Bool
OO_LVCREATE_RAID: --mirrors SNumber, --stripes Number, --stripesize SizeKB,
---regionsize SizeMB, --minrecoveryrate SizeKB, --maxrecoveryrate SizeKB
+--regionsize RegionSize, --minrecoveryrate SizeKB, --maxrecoveryrate SizeKB
---
@@ -712,7 +712,7 @@ DESC: Create a striped LV (infers --type striped).
---
lvcreate --type mirror --size SizeMB VG
-OO: --mirrors SNumber, --mirrorlog MirrorLog, --regionsize SizeMB, --stripes Number, OO_LVCREATE
+OO: --mirrors SNumber, --mirrorlog MirrorLog, --regionsize RegionSize, --stripes Number, OO_LVCREATE
OP: PV ...
ID: lvcreate_mirror
DESC: Create a mirror LV (also see --type raid1).
diff --git a/tools/command.c b/tools/command.c
index 59c9ea0..68566fa 100644
--- a/tools/command.c
+++ b/tools/command.c
@@ -75,6 +75,7 @@ static inline int segtype_arg(struct cmd_context *cmd, struct arg_values *av) {
static inline int alloc_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
static inline int locktype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
static inline int readahead_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int regionsize_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
static inline int vgmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
static inline int pvmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
static inline int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 4d6b1c9..502d614 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -146,8 +146,6 @@ static int _read_conversion_type(struct cmd_context *cmd,
static int _read_params(struct cmd_context *cmd, struct lvconvert_params *lp)
{
const char *vg_name = NULL;
- int region_size;
- int pagesize = lvm_getpagesize();
if (!_read_conversion_type(cmd, lp))
return_0;
@@ -249,45 +247,10 @@ static int _read_params(struct cmd_context *cmd, struct lvconvert_params *lp)
return 0;
}
- /*
- * --regionsize is only valid if converting an LV into a mirror.
- * Checked when we know the state of the LV being converted.
- */
- if (arg_is_set(cmd, regionsize_ARG)) {
- if (arg_sign_value(cmd, regionsize_ARG, SIGN_NONE) ==
- SIGN_MINUS) {
- log_error("Negative regionsize is invalid.");
- return 0;
- }
+ if (arg_is_set(cmd, regionsize_ARG))
lp->region_size = arg_uint_value(cmd, regionsize_ARG, 0);
- } else {
- region_size = get_default_region_size(cmd);
- if (region_size < 0) {
- log_error("Negative regionsize in "
- "configuration file is invalid.");
- return 0;
- }
- lp->region_size = region_size;
- }
-
- if (lp->region_size % (pagesize >> SECTOR_SHIFT)) {
- log_error("Region size (%" PRIu32 ") must be "
- "a multiple of machine memory "
- "page size (%d).",
- lp->region_size, pagesize >> SECTOR_SHIFT);
- return 0;
- }
-
- if (!is_power_of_2(lp->region_size)) {
- log_error("Region size (%" PRIu32
- ") must be a power of 2.", lp->region_size);
- return 0;
- }
-
- if (!lp->region_size) {
- log_error("Non-zero region size must be supplied.");
- return 0;
- }
+ else
+ lp->region_size = get_default_region_size(cmd);
/* FIXME man page says in one place that --type and --mirrors can't be mixed */
if (lp->mirrors_supplied && !lp->mirrors)
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index 0512585..cd31c99 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -545,7 +545,6 @@ static int _read_raid_params(struct cmd_context *cmd,
static int _read_mirror_and_raid_params(struct cmd_context *cmd,
struct lvcreate_params *lp)
{
- int pagesize = lvm_getpagesize();
unsigned max_images;
if (seg_is_raid(lp)) {
@@ -616,19 +615,6 @@ static int _read_mirror_and_raid_params(struct cmd_context *cmd,
return 0;
}
- if (!is_power_of_2(lp->region_size)) {
- log_error("Region size (%" PRIu32 ") must be a power of 2",
- lp->region_size);
- return 0;
- }
-
- if (lp->region_size % (pagesize >> SECTOR_SHIFT)) {
- log_error("Region size (%" PRIu32 ") must be a multiple of "
- "machine memory page size (%d)",
- lp->region_size, pagesize >> SECTOR_SHIFT);
- return 0;
- }
-
if (seg_is_mirror(lp) && !_read_mirror_params(cmd, lp))
return_0;
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 4fda356..58d1a44 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -797,6 +797,45 @@ int readahead_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_va
return 1;
}
+int regionsize_arg(struct cmd_context *cmd, struct arg_values *av)
+{
+ int pagesize = lvm_getpagesize();
+ uint32_t num;
+
+ if (!_size_arg(cmd, av, 2048, 0))
+ return 0;
+
+ if (av->sign == SIGN_MINUS) {
+ log_error("Region size may not be negative.");
+ return 0;
+ }
+
+ if (av->ui64_value > UINT32_MAX) {
+ log_error("Region size is too big (max %u).", UINT32_MAX);
+ return 0;
+ }
+
+ num = av->ui_value;
+
+ if (!num) {
+ log_error("Region size may not be zero.");
+ return 0;
+ }
+
+ if (num % (pagesize >> SECTOR_SHIFT)) {
+ log_error("Region size must be a multiple of machine memory page size (%d bytes).",
+ pagesize);
+ return 0;
+ }
+
+ if (!is_power_of_2(num)) {
+ log_error("Region size must be a power of 2.");
+ return 0;
+ }
+
+ return 1;
+}
+
/*
* Non-zero, positive integer, "all", or "unmanaged"
*/
diff --git a/tools/tools.h b/tools/tools.h
index 00476d1..b3858a0 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -200,6 +200,7 @@ int segtype_arg(struct cmd_context *cmd, struct arg_values *av);
int alloc_arg(struct cmd_context *cmd, struct arg_values *av);
int locktype_arg(struct cmd_context *cmd, struct arg_values *av);
int readahead_arg(struct cmd_context *cmd, struct arg_values *av);
+int regionsize_arg(struct cmd_context *cmd, struct arg_values *av);
int vgmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
int pvmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
diff --git a/tools/vals.h b/tools/vals.h
index 12d315f..38029aa 100644
--- a/tools/vals.h
+++ b/tools/vals.h
@@ -92,6 +92,10 @@
* --size and other option args treat upper/lower letters
* the same, all as 1024 SI base. For this reason, we
* should avoid suggesting the upper case letters.
+ *
+ * FIXME: negative numbers should be automatically rejected
+ * for anything but int_arg_with_sign(), e.g.
+ * size_mb_arg() should reject a negative number.
*/
val(none_VAL, NULL, "None", "ERR") /* unused, for enum value 0 */
@@ -113,6 +117,7 @@ val(discards_VAL, discards_arg, "Discards", "passdown|nopassdown|ignore")
val(mirrorlog_VAL, mirrorlog_arg, "MirrorLog", "core|disk")
val(sizekb_VAL, size_kb_arg, "SizeKB", "Number[k|unit]")
val(sizemb_VAL, size_mb_arg, "SizeMB", "Number[m|unit]")
+val(regionsize_VAL, regionsize_arg, "RegionSize", "Number[m|unit]")
val(numsigned_VAL, int_arg_with_sign, "SNumber", "[+|-]Number")
val(numsignedper_VAL, int_arg_with_sign_and_percent, "SNumberP", "[+|-]Number[%VG|%PVS|%FREE]")
val(permission_VAL, permission_arg, "Permission", "rw|r")
7 years, 3 months
master - lvconvert: remove code for changing region size
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a1386dcca024b5...
Commit: a1386dcca024b51019c1f3be6b153249df06dbac
Parent: 46abc28a480069b3e8b2c5c7c3448ffa25ec17ba
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Feb 7 15:01:30 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:21:58 2017 -0600
lvconvert: remove code for changing region size
from the generic raid type conversion code.
---
tools/lvconvert.c | 16 ++++------------
1 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 4e86698..4d6b1c9 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1402,13 +1402,13 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
return 1;
}
goto try_new_takeover_or_reshape;
- } else if (!arg_is_set(cmd, regionsize_ARG) && (!*lp->type_str || seg->segtype == lp->segtype)) {
+ } else if (!*lp->type_str || seg->segtype == lp->segtype) {
log_error("Conversion operation not yet supported.");
return 0;
}
if ((seg_is_linear(seg) || seg_is_striped(seg) || seg_is_mirrored(seg) || lv_is_raid(lv)) &&
- ((lp->type_str && lp->type_str[0]) || arg_is_set(cmd, regionsize_ARG))) {
+ (lp->type_str && lp->type_str[0])) {
/* Activation is required later which precludes existing supported raid0 segment */
if ((seg_is_any_raid0(seg) || segtype_is_any_raid0(lp->segtype)) &&
!(lp->target_attr & RAID_FEATURE_RAID0)) {
@@ -1430,12 +1430,8 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
if (!arg_is_set(cmd, stripes_long_ARG))
lp->stripes = 0;
- /*
- * FIXME: arg_is_set() workaround for region size until the cli validation patches got merged;
- * i needs "--type raid*", because lp->region_size isn't set w/o it
- */
if (!lv_raid_convert(lv, lp->segtype, lp->yes, lp->force, lp->stripes, lp->stripe_size_supplied, lp->stripe_size,
- arg_is_set(cmd, regionsize_ARG) ? lp->region_size : 0, lp->pvh))
+ lp->region_size, lp->pvh))
return_0;
log_print_unless_silent("Logical volume %s successfully converted.",
@@ -1456,12 +1452,8 @@ try_new_takeover_or_reshape:
if (lp->type_str && lp->type_str[0] && lp->segtype != seg->segtype &&
((seg_is_raid4(seg) && seg_is_striped(lp) && lp->stripes > 1) ||
(seg_is_striped(seg) && seg->area_count > 1 && seg_is_raid4(lp)))) {
- /*
- * FIXME: arg_is_set() workaround for region size until the cli validation patches got merged;
- * i needs "--type raid*", because lp->region_size isn't set w/o it
- */
if (!lv_raid_convert(lv, lp->segtype, lp->yes, lp->force, lp->stripes, lp->stripe_size_supplied, lp->stripe_size,
- arg_is_set(cmd, regionsize_ARG) ? lp->region_size : 0, lp->pvh))
+ lp->region_size, lp->pvh))
return_0;
log_print_unless_silent("Logical volume %s successfully converted.",
7 years, 3 months
master - lvconvert: add command to change region size of a raid LV
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=46abc28a480069...
Commit: 46abc28a480069b3e8b2c5c7c3448ffa25ec17ba
Parent: 8152e4a99ee075c84fab9ec46485b798a1a6525d
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Feb 7 11:52:13 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:21:58 2017 -0600
lvconvert: add command to change region size of a raid LV
---
lib/metadata/metadata-exported.h | 2 ++
lib/metadata/raid_manip.c | 6 ++++++
test/shell/lvconvert-raid-regionsize.sh | 2 +-
tools/command-lines.in | 7 +++++++
tools/lvconvert.c | 15 +++++++++++++++
tools/lvmcmdline.c | 1 +
tools/tools.h | 1 +
7 files changed, 33 insertions(+), 1 deletions(-)
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 420893c..573c09d 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -1230,6 +1230,8 @@ uint32_t raid_rmeta_extents_delta(struct cmd_context *cmd,
uint32_t raid_rimage_extents(const struct segment_type *segtype,
uint32_t extents, uint32_t stripes, uint32_t data_copies);
uint32_t raid_ensure_min_region_size(const struct logical_volume *lv, uint64_t raid_size, uint32_t region_size);
+int lv_raid_change_region_size(struct logical_volume *lv,
+ int yes, int force, uint32_t new_region_size);
/* -- metadata/raid_manip.c */
/* ++ metadata/cache_manip.c */
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index eaafd65..cdd7af8 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -4338,6 +4338,12 @@ int lv_raid_convert(struct logical_volume *lv,
region_size, allocate_pvs);
}
+int lv_raid_change_region_size(struct logical_volume *lv,
+ int yes, int force, uint32_t new_region_size)
+{
+ return _region_size_change_requested(lv, yes, new_region_size);
+}
+
static int _remove_partial_multi_segment_image(struct logical_volume *lv,
struct dm_list *remove_pvs)
{
diff --git a/test/shell/lvconvert-raid-regionsize.sh b/test/shell/lvconvert-raid-regionsize.sh
index 7a6c7f0..9baa99a 100644
--- a/test/shell/lvconvert-raid-regionsize.sh
+++ b/test/shell/lvconvert-raid-regionsize.sh
@@ -27,7 +27,7 @@ function _test_regionsize
local vg=$4
local lv=$5
- lvconvert --type $type --yes -R $regionsize $vg/$lv
+ lvconvert --yes -R $regionsize $vg/$lv
[ $? -ne 0 ] && return 1
check lv_field $vg/$lv regionsize "$regionsize_str"
fsck -fn "$DM_DEV_DIR/$vg/$lv"
diff --git a/tools/command-lines.in b/tools/command-lines.in
index ca5259f..6743b79 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -364,6 +364,13 @@ ID: lvconvert_raid_types
DESC: Convert LV to raid1 or mirror, or change number of mirror images.
RULE: all not lv_is_locked lv_is_pvmove
+lvconvert --regionsize SizeMB LV_raid
+OO: OO_LVCONVERT
+ID: lvconvert_change_region_size
+DESC: Change the region size of an LV.
+RULE: all not lv_is_locked lv_is_pvmove
+RULE: all not LV_raid0
+
---
# lvconvert raid-related utilities
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 75bdcb9..4e86698 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -4397,6 +4397,21 @@ out:
return ret;
}
+static int _lvconvert_change_region_size_single(struct cmd_context *cmd, struct logical_volume *lv,
+ struct processing_handle *handle)
+{
+ if (!lv_raid_change_region_size(lv, arg_is_set(cmd, yes_ARG), arg_count(cmd, force_ARG),
+ arg_int_value(cmd, regionsize_ARG, 0)))
+ return ECMD_FAILED;
+ return ECMD_PROCESSED;
+}
+
+int lvconvert_change_region_size_cmd(struct cmd_context * cmd, int argc, char **argv)
+{
+ return process_each_lv(cmd, 1, cmd->position_argv, NULL, NULL, READ_FOR_UPDATE,
+ NULL, &_lvconvert_visible_check, &_lvconvert_change_region_size_single);
+}
+
/*
* split mirror images
*/
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 121a9dd..4fda356 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -152,6 +152,7 @@ struct command_function command_functions[CMD_COUNT] = {
{ lvconvert_split_mirror_images_CMD, lvconvert_split_mirror_images_cmd},
{ lvconvert_change_mirrorlog_CMD, lvconvert_change_mirrorlog_cmd },
{ lvconvert_merge_mirror_images_CMD, lvconvert_merge_mirror_images_cmd },
+ { lvconvert_change_region_size_CMD, lvconvert_change_region_size_cmd },
/* redirected to merge_snapshot/merge_thin/merge_mirrors */
{ lvconvert_merge_CMD, lvconvert_merge_cmd },
diff --git a/tools/tools.h b/tools/tools.h
index 4e1d87f..00476d1 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -284,6 +284,7 @@ int lvconvert_raid_types_cmd(struct cmd_context * cmd, int argc, char **argv);
int lvconvert_split_mirror_images_cmd(struct cmd_context * cmd, int argc, char **argv);
int lvconvert_merge_mirror_images_cmd(struct cmd_context *cmd, int argc, char **argv);
int lvconvert_change_mirrorlog_cmd(struct cmd_context * cmd, int argc, char **argv);
+int lvconvert_change_region_size_cmd(struct cmd_context * cmd, int argc, char **argv);
int lvconvert_merge_cmd(struct cmd_context *cmd, int argc, char **argv);
7 years, 3 months
master - vgchange: fix uint32 parsing of logicalvolume arg
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=8152e4a99ee075...
Commit: 8152e4a99ee075c84fab9ec46485b798a1a6525d
Parent: 2224b6a70158a820de2a9f1fd961a36b0188da51
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Mon Feb 6 16:10:09 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:20:10 2017 -0600
vgchange: fix uint32 parsing of logicalvolume arg
---
tools/args.h | 4 ++--
tools/command-lines.in | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tools/args.h b/tools/args.h
index 1d7d6f7..a481bc5 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -964,10 +964,10 @@ arg(stripesize_ARG, 'I', "stripesize", sizekb_VAL, 0, 0,
"The amount of data that is written to one device before\n"
"moving to the next in a striped LV.\n")
-arg(logicalvolume_ARG, 'l', "logicalvolume", number_VAL, 0, 0,
+arg(logicalvolume_ARG, 'l', "logicalvolume", uint32_VAL, 0, 0,
"Sets the maximum number of LVs allowed in a VG.\n")
-arg(maxlogicalvolumes_ARG, 'l', "maxlogicalvolumes", number_VAL, 0, 0,
+arg(maxlogicalvolumes_ARG, 'l', "maxlogicalvolumes", uint32_VAL, 0, 0,
"Sets the maximum number of LVs allowed in a VG.\n")
arg(extents_ARG, 'l', "extents", numsignedper_VAL, 0, 0,
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 30573f4..ca5259f 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -1339,7 +1339,7 @@ OO_VGCHANGE: --autobackup Bool, --ignoremonitoring, --ignoreskippedcluster,
# because it can function as a required opt.
OO_VGCHANGE_META: --addtag Tag, --deltag Tag,
---logicalvolume Number, --maxphysicalvolumes Uint32, --alloc Alloc, --uuid,
+--logicalvolume Uint32, --maxphysicalvolumes Uint32, --alloc Alloc, --uuid,
--clustered Bool, --pvmetadatacopies MetadataCopiesPV, --vgmetadatacopies MetadataCopiesVG,
--physicalextentsize SizeMB, --resizeable Bool, --systemid String, --locktype LockType,
--profile String, --detachprofile, --metadataprofile String
@@ -1405,7 +1405,7 @@ ID: vgconvert_general
---
vgcreate VG_new PV ...
-OO: --addtag Tag, --alloc Alloc, --autobackup Bool, --clustered Bool, --maxlogicalvolumes Number,
+OO: --addtag Tag, --alloc Alloc, --autobackup Bool, --clustered Bool, --maxlogicalvolumes Uint32,
--maxphysicalvolumes Uint32, --metadataprofile String, --metadatatype MetadataType,
--physicalextentsize SizeMB, --force, --zero Bool, --labelsector Number,
--metadatasize SizeMB, --pvmetadatacopies MetadataCopiesPV, --vgmetadatacopies MetadataCopiesVG,
@@ -1539,7 +1539,7 @@ OO_VGSPLIT: --autobackup Bool
# used only when the destination VG is new
OO_VGSPLIT_NEW: --alloc Alloc, --clustered Bool,
---maxlogicalvolumes Number, --maxphysicalvolumes Uint32,
+--maxlogicalvolumes Uint32, --maxphysicalvolumes Uint32,
--metadatatype MetadataType, --vgmetadatacopies MetadataCopiesVG
vgsplit VG VG PV ...
7 years, 3 months
master - commands: recognize raid variations
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2224b6a70158a8...
Commit: 2224b6a70158a820de2a9f1fd961a36b0188da51
Parent: c3faa5816d223b0a77a248aed9a88e73461268ce
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Mon Feb 6 11:51:06 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:20:10 2017 -0600
commands: recognize raid variations
---
tools/lv_types.h | 2 +-
tools/toollib.c | 16 ++++++----------
2 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/tools/lv_types.h b/tools/lv_types.h
index 22d0522..bd4666e 100644
--- a/tools/lv_types.h
+++ b/tools/lv_types.h
@@ -21,7 +21,7 @@ lvt(thinpool_LVT, "thinpool", NULL)
lvt(cache_LVT, "cache", NULL)
lvt(cachepool_LVT, "cachepool", NULL)
lvt(mirror_LVT, "mirror", NULL)
-lvt(raid_LVT, "raid", NULL)
+lvt(raid_LVT, "raid", NULL) /* any raid type */
lvt(raid0_LVT, "raid0", NULL)
lvt(raid1_LVT, "raid1", NULL)
lvt(raid4_LVT, "raid4", NULL)
diff --git a/tools/toollib.c b/tools/toollib.c
index 3b47989..a539878 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -2515,17 +2515,15 @@ static int _lv_is_type(struct cmd_context *cmd, struct logical_volume *lv, int l
case raid_LVT:
return lv_is_raid(lv);
case raid0_LVT:
- return seg_is_raid0(seg);
+ return seg_is_any_raid0(seg);
case raid1_LVT:
return seg_is_raid1(seg);
case raid4_LVT:
return seg_is_raid4(seg);
-#if 0
case raid5_LVT:
- return seg_is_raid5(seg);
+ return seg_is_any_raid5(seg);
case raid6_LVT:
- return seg_is_raid6(seg);
-#endif
+ return seg_is_any_raid6(seg);
case raid10_LVT:
return seg_is_raid10(seg);
case error_LVT:
@@ -2566,18 +2564,16 @@ int get_lvt_enum(struct logical_volume *lv)
return mirror_LVT;
if (lv_is_raid(lv))
return raid_LVT;
- if (seg_is_raid0(seg))
+ if (seg_is_any_raid0(seg))
return raid0_LVT;
if (seg_is_raid1(seg))
return raid1_LVT;
if (seg_is_raid4(seg))
return raid4_LVT;
-#if 0
- if (seg_is_raid5(seg))
+ if (seg_is_any_raid5(seg))
return raid5_LVT;
- if (seg_is_raid6(seg))
+ if (seg_is_any_raid6(seg))
return raid6_LVT;
-#endif
if (seg_is_raid10(seg))
return raid10_LVT;
7 years, 3 months
master - commands: move command def parsing into lvm binary
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c3faa5816d223b...
Commit: c3faa5816d223b0a77a248aed9a88e73461268ce
Parent: 942dc07402747d00946c5e80d890d535c0cbd125
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Fri Feb 10 11:36:11 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:20:10 2017 -0600
commands: move command def parsing into lvm binary
It was previously done at build time by the ccmd binary.
---
tools/Makefile.in | 47 +-
tools/ccmd-main.c | 1130 --------------------
tools/ccmd-man.c | 997 ------------------
tools/ccmd-util.c | 936 -----------------
tools/ccmd.h | 144 ---
tools/command-lines.in | 17 +-
tools/command.c | 2694 ++++++++++++++++++++++++++++++++++++++++++++++++
tools/command.h | 36 +-
tools/lvchange.c | 20 +-
tools/lvconvert.c | 38 +-
tools/lvmcmdline.c | 303 +-----
tools/toollib.c | 12 +-
tools/tools.h | 8 +
13 files changed, 2847 insertions(+), 3535 deletions(-)
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 8f53851..1761be4 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -18,6 +18,7 @@ top_srcdir = @top_srcdir@
top_builddir = @top_builddir@
SOURCES =\
+ command.c \
dumpconfig.c \
formats.c \
lvchange.c \
@@ -77,7 +78,6 @@ SOURCES2 =\
TARGETS =\
.commands \
- command-lines.h \
liblvm2cmd.a \
lvm
@@ -102,7 +102,7 @@ CLEAN_TARGETS = liblvm2cmd.$(LIB_SUFFIX) $(TARGETS_DM) \
liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION) lvm-static.o \
liblvm2cmd-static.a dmsetup.static lvm.static \
$(LDDEPS) .exported_symbols_generated \
- ccmd command-lines.h command-lines-count.h
+ cmds.h command-lines-input.h command-count.h
ifeq ("@CMDLIB@", "yes")
TARGETS += liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION)
@@ -176,35 +176,40 @@ liblvm2cmd.$(LIB_SUFFIX).$(LIB_VERSION): liblvm2cmd.$(LIB_SUFFIX)
$(CC) -E -P $(srcdir)/cmdnames.h 2> /dev/null | \
egrep -v '^ *(|#.*|config|devtypes|dumpconfig|formats|fullreport|help|lastlog|lvpoll|pvdata|segtypes|systemid|tags|version) *$$' > .commands
-ccmd: $(srcdir)/ccmd-main.c $(srcdir)/ccmd-util.c $(srcdir)/ccmd-man.c
- $(CC) $(srcdir)/ccmd-main.c $(srcdir)/ccmd-util.c $(srcdir)/ccmd-man.c -o ccmd
-
.DELETE_ON_ERROR:
-command-lines.h: $(srcdir)/command-lines.in ccmd
- $(top_builddir)/tools/ccmd --output struct $(srcdir)/command-lines.in > $@
-
-command-lines-count.h: $(srcdir)/command-lines.in ccmd
- $(top_builddir)/tools/ccmd --output count $(srcdir)/command-lines.in > $@
-
# move properly to configure
WC = /usr/bin/wc
GREP = /bin/grep
SORT = /bin/sort
-CUT = /bin/cut
-SED = /bin/sed
-# FIXME Add licence text from template file
-command-lines-count-new.h: $(srcdir)/command-lines.in ccmd Makefile
+command-count.h: $(srcdir)/command-lines.in Makefile
+ set -o pipefail && \
+ ( cat $(top_srcdir)/doc/license.txt && \
+ echo "/* Do not edit. This file is generated by the Makefile. */" && \
+ echo -n "#define COMMAND_COUNT " && \
+ $(GREP) '^ID:' $(srcdir)/command-lines.in | $(WC) -l \
+ ) > $@
+
+cmds.h: $(srcdir)/command-lines.in Makefile
+ set -o pipefail && \
+ ( cat $(top_srcdir)/doc/license.txt && \
+ echo "/* Do not edit. This file is generated by the Makefile. */" && \
+ echo "cmd(CMD_NONE, none)" && \
+ $(GREP) '^ID:' $(srcdir)/command-lines.in | $(SORT) -u | $(AWK) '{print "cmd(" $$2 "_CMD, " $$2 ")"}' && \
+ echo "cmd(CMD_COUNT, count)" \
+ ) > $@
+
+command-lines-input.h: $(srcdir)/command-lines.in Makefile
set -o pipefail && \
- (echo -n "#define COMMAND_COUNT " && \
- $(GREP) '^ID:' $(srcdir)/command-lines.in | $(WC) -l && \
- echo -e "enum {\n\tno_CMD," && \
- $(GREP) '^ID:' $(srcdir)/command-lines.in | $(CUT) -d\ -f2 | $(SORT) -u | $(SED) 's/\(.*\)/\t&_CMD,/' && \
- echo -e "\tCOMMAND_ID_COUNT,\n};" \
+ ( cat $(top_srcdir)/doc/license.txt && \
+ echo "/* Do not edit. This file is generated by the Makefile. */" && \
+ echo -en "const char _command_input[] =\n\n\"" && \
+ $(GREP) -Ev '^#|\-\-\-|^$$' $(srcdir)/command-lines.in | $(AWK) 'BEGIN {ORS = "\\n\"\n\""} //' && \
+ echo "\\n\";" \
) > $@
-$(SOURCES:%.c=%.d): command-lines.h command-lines-count.h
+$(SOURCES:%.c=%.d) $(SOURCES2:%.c=%.d): command-lines-input.h command-count.h cmds.h
ifneq ("$(CFLOW_CMD)", "")
CFLOW_SOURCES = $(addprefix $(srcdir)/, $(SOURCES))
diff --git a/tools/ccmd-main.c b/tools/ccmd-main.c
deleted file mode 100644
index 85d5656..0000000
--- a/tools/ccmd-main.c
+++ /dev/null
@@ -1,1130 +0,0 @@
-#include <asm/types.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <limits.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <sched.h>
-#include <dirent.h>
-#include <ctype.h>
-#include <getopt.h>
-
-#include "ccmd.h"
-
-
-/* input util functions (in ccmd-util.c) */
-char *split_line(char *buf, int *argc, char **argv, char sep);
-int val_str_to_num(char *str);
-int opt_str_to_num(char *str);
-int lvp_name_to_enum(char *str);
-int lv_to_enum(char *name);
-uint64_t lv_to_bits(char *name);
-
-/* header output functions (in ccmd-util.c) */
-void print_header_struct(void);
-void print_header_count(void);
-void print_ambiguous(void);
-
-/* man page output (in ccmd-main.c) */
-void print_man(char *man_command_name, int include_primary, int include_secondary);
-
-
-/* create table of value names, e.g. String, and corresponding enum from vals.h */
-
-struct val_name val_names[VAL_COUNT + 1] = {
-#define val(a, b, c, d) { # a, a, b, c, d },
-#include "vals.h"
-#undef val
-};
-
-/* create table of option names, e.g. --foo, and corresponding enum from args.h */
-
-struct opt_name opt_names[ARG_COUNT + 1] = {
-#define arg(a, b, c, d, e, f, g) { # a, a, b, "", "--" c, d, e, f, g },
-#include "args.h"
-#undef arg
-};
-
-/* create table of lv property names, e.g. lv_is_foo, and corresponding enum from lv_props.h */
-
-struct lvp_name lvp_names[LVP_COUNT + 1] = {
-#define lvp(a, b, c) { # a, a, b },
-#include "lv_props.h"
-#undef lvp
-};
-
-/* create table of lv type names, e.g. linear and corresponding enum from lv_types.h */
-
-struct lvt_name lvt_names[LVT_COUNT + 1] = {
-#define lvt(a, b, c) { # a, a, b },
-#include "lv_types.h"
-#undef lvt
-};
-
-/* create table of command names, e.g. vgcreate */
-
-struct cmd_name cmd_names[MAX_CMD_NAMES] = {
-#define xx(a, b, c) { # a , b } ,
-#include "commands.h"
-#undef xx
-};
-
-/* array of pointers into opt_names[] that is sorted alphabetically (by long opt name) */
-
-struct opt_name *opt_names_alpha[ARG_COUNT + 1];
-
-/* lvm_all is for recording options that are common for all lvm commands */
-
-struct command lvm_all;
-
-/* saves OO_FOO lines (groups of optional options) to include in multiple defs */
-
-static int oo_line_count;
-#define MAX_OO_LINES 256
-
-struct oo_line {
- char *name;
- char *line;
-};
-static struct oo_line oo_lines[MAX_OO_LINES];
-
-#define REQUIRED 1 /* required option */
-#define OPTIONAL 0 /* optional option */
-#define IGNORE -1 /* ignore option */
-
-/* control man page output */
-
-static int include_man_secondary = 1; /* include SECONDARY forms in man output */
-static int include_man_primary = 1; /* include primary forms in man output */
-static char *man_command_name = NULL; /* print man page for a single command name */
-
-
-static void add_optional_opt_line(struct command *cmd, int argc, char *argv[]);
-
-/*
- * Parse command-lines.in and record those definitions
- * in an array of struct command: cmd_array[].
- */
-
-static const char *is_command_name(char *str)
-{
- int i;
-
- for (i = 0; i < MAX_CMD_NAMES; i++) {
- if (!cmd_names[i].name)
- break;
- if (!strcmp(cmd_names[i].name, str))
- return cmd_names[i].name;
- }
- return NULL;
-}
-
-struct cmd_name *find_command_name(const char *str)
-{
- int i;
-
- for (i = 0; i < MAX_CMD_NAMES; i++) {
- if (!cmd_names[i].name)
- break;
- if (!strcmp(cmd_names[i].name, str))
- return &cmd_names[i];
- }
- return NULL;
-}
-
-static int is_opt_name(char *str)
-{
- if (!strncmp(str, "--", 2))
- return 1;
-
- if ((str[0] == '-') && (str[1] != '-')) {
- printf("Options must be specified in long form: %s\n", str);
- exit(1);
- }
-
- return 0;
-}
-
-/*
- * "Select" as a pos name means that the position
- * can be empty if the --select option is used.
- */
-
-static int is_pos_name(char *str)
-{
- if (!strncmp(str, "VG", 2))
- return 1;
- if (!strncmp(str, "LV", 2))
- return 1;
- if (!strncmp(str, "PV", 2))
- return 1;
- if (!strncmp(str, "Tag", 3))
- return 1;
- if (!strncmp(str, "String", 6))
- return 1;
- if (!strncmp(str, "Select", 6))
- return 1;
- return 0;
-}
-
-static int is_oo_definition(char *str)
-{
- if (!strncmp(str, "OO_", 3) && strstr(str, ":"))
- return 1;
- return 0;
-}
-
-static int is_oo_line(char *str)
-{
- if (!strncmp(str, "OO:", 3))
- return 1;
- return 0;
-}
-
-static int is_io_line(char *str)
-{
- if (!strncmp(str, "IO:", 3))
- return 1;
- return 0;
-}
-
-static int is_op_line(char *str)
-{
- if (!strncmp(str, "OP:", 3))
- return 1;
- return 0;
-}
-
-static int is_desc_line(char *str)
-{
- if (!strncmp(str, "DESC:", 5))
- return 1;
- return 0;
-}
-
-static int is_flags_line(char *str)
-{
- if (!strncmp(str, "FLAGS:", 6))
- return 1;
- return 0;
-}
-
-static int is_rule_line(char *str)
-{
- if (!strncmp(str, "RULE:", 5))
- return 1;
- return 0;
-}
-
-static int is_id_line(char *str)
-{
- if (!strncmp(str, "ID:", 3))
- return 1;
- return 0;
-}
-
-/*
- * Save a positional arg in a struct arg_def.
- * Parse str for anything that can appear in a position,
- * like VG, VG|LV, VG|LV_linear|LV_striped, etc.
- */
-
-static void set_pos_def(struct command *cmd, char *str, struct arg_def *def)
-{
- char *argv[MAX_LINE_ARGC];
- int argc;
- char *name;
- int val_enum;
- int i;
-
- split_line(str, &argc, argv, '|');
-
- for (i = 0; i < argc; i++) {
- name = argv[i];
-
- val_enum = val_str_to_num(name);
-
- if (!val_enum) {
- printf("Unknown pos arg: %s\n", name);
- exit(1);
- }
-
- def->val_bits |= val_enum_to_bit(val_enum);
-
- if ((val_enum == lv_VAL) && strstr(name, "_"))
- def->lvt_bits = lv_to_bits(name);
-
- if (strstr(name, "_new")) {
- if (val_enum == lv_VAL)
- def->flags |= ARG_DEF_FLAG_NEW_LV;
- else if (val_enum == vg_VAL)
- def->flags |= ARG_DEF_FLAG_NEW_VG;
- }
- }
-}
-
-/*
- * Save an option arg in a struct arg_def.
- * Parse str for anything that can follow --option.
- */
-
-static void set_opt_def(struct command *cmd, char *str, struct arg_def *def)
-{
- char *argv[MAX_LINE_ARGC];
- int argc;
- char *name;
- int val_enum;
- int i, j;
-
- split_line(str, &argc, argv, '|');
-
- for (i = 0; i < argc; i++) {
- name = argv[i];
-
- val_enum = val_str_to_num(name);
-
- if (!val_enum) {
- /* a literal number or string */
-
- if (isdigit(name[0]))
- val_enum = constnum_VAL;
-
- else if (isalpha(name[0]))
- val_enum = conststr_VAL;
-
- else {
- printf("Unknown opt arg: %s\n", name);
- exit(0);
- }
- }
-
-
- def->val_bits |= val_enum_to_bit(val_enum);
-
- if (val_enum == constnum_VAL)
- def->num = (uint64_t)atoi(name);
-
- if (val_enum == conststr_VAL)
- def->str = strdup(name);
-
- if (val_enum == lv_VAL) {
- if (strstr(name, "_"))
- def->lvt_bits = lv_to_bits(name);
- }
-
- if (strstr(name, "_new")) {
- if (val_enum == lv_VAL)
- def->flags |= ARG_DEF_FLAG_NEW_LV;
- else if (val_enum == vg_VAL)
- def->flags |= ARG_DEF_FLAG_NEW_VG;
-
- }
- }
-}
-
-/*
- * Save a set of common options so they can be included in
- * multiple command defs.
- *
- * OO_FOO: --opt1 ...
- *
- * oo->name = "OO_FOO";
- * oo->line = "--opt1 ...";
- */
-
-static void add_oo_definition_line(const char *name, const char *line)
-{
- struct oo_line *oo;
- char *colon;
- char *start;
-
- oo = &oo_lines[oo_line_count++];
- oo->name = strdup(name);
-
- if ((colon = strstr(oo->name, ":")))
- *colon = '\0';
- else {
- printf("invalid OO definition\n");
- exit(1);
- }
-
- start = strstr(line, ":") + 2;
- oo->line = strdup(start);
-}
-
-/* Support OO_FOO: continuing on multiple lines. */
-
-static void append_oo_definition_line(const char *new_line)
-{
- struct oo_line *oo;
- char *old_line;
- char *line;
- int len;
-
- oo = &oo_lines[oo_line_count-1];
-
- old_line = oo->line;
-
- /* +2 = 1 space between old and new + 1 terminating \0 */
- len = strlen(old_line) + strlen(new_line) + 2;
- line = malloc(len);
- memset(line, 0, len);
-
- strcat(line, old_line);
- strcat(line, " ");
- strcat(line, new_line);
-
- free(oo->line);
- oo->line = line;
-}
-
-/* Find a saved OO_FOO definition. */
-
-char *get_oo_line(char *str)
-{
- char *name;
- char *end;
- char str2[64];
- int i;
-
- strcpy(str2, str);
- if ((end = strstr(str2, ":")))
- *end = '\0';
- if ((end = strstr(str2, ",")))
- *end = '\0';
-
- for (i = 0; i < oo_line_count; i++) {
- name = oo_lines[i].name;
- if (!strcmp(name, str2))
- return oo_lines[i].line;
- }
- return NULL;
-}
-
-/*
- * Add optional_opt_args entries when OO_FOO appears on OO: line,
- * i.e. include common options from an OO_FOO definition.
- */
-
-static void include_optional_opt_args(struct command *cmd, char *str)
-{
- char *oo_line;
- char *line;
- char *line_argv[MAX_LINE_ARGC];
- int line_argc;
-
- if (!(oo_line = get_oo_line(str))) {
- printf("No OO line found for %s\n", str);
- exit(1);
- }
-
- if (!(line = strdup(oo_line)))
- exit(1);
-
- split_line(line, &line_argc, line_argv, ' ');
- add_optional_opt_line(cmd, line_argc, line_argv);
- free(line);
-}
-
-/*
- * When an --option is seen, add a new opt_args entry for it.
- * This function sets the opt_args.opt value for it.
- */
-
-static void add_opt_arg(struct command *cmd, char *str, int *takes_arg, int required)
-{
- char *comma;
- int opt;
-
- /* opt_arg.opt set here */
- /* opt_arg.def will be set in update_prev_opt_arg() if needed */
-
- if ((comma = strstr(str, ",")))
- *comma = '\0';
-
- /*
- * Work around nasty hack where --uuid is used for both uuid_ARG
- * and uuidstr_ARG. The input uses --uuidstr, where an actual
- * command uses --uuid string.
- */
- if (!strcmp(str, "--uuidstr")) {
- opt = uuidstr_ARG;
- goto skip;
- }
-
- opt = opt_str_to_num(str);
-skip:
- if (required > 0)
- cmd->required_opt_args[cmd->ro_count++].opt = opt;
- else if (!required)
- cmd->optional_opt_args[cmd->oo_count++].opt = opt;
- else if (required < 0)
- cmd->ignore_opt_args[cmd->io_count++].opt = opt;
- else
- exit(1);
-
- *takes_arg = opt_names[opt].val_enum ? 1 : 0;
-}
-
-/*
- * After --option has been seen, this function sets opt_args.def value
- * for the value that appears after --option.
- */
-
-static void update_prev_opt_arg(struct command *cmd, char *str, int required)
-{
- struct arg_def def = { 0 };
- char *comma;
-
- if (str[0] == '-') {
- printf("Option %s must be followed by an arg.\n", str);
- exit(1);
- }
-
- /* opt_arg.def set here */
- /* opt_arg.opt was previously set in add_opt_arg() when --foo was read */
-
- if ((comma = strstr(str, ",")))
- *comma = '\0';
-
- set_opt_def(cmd, str, &def);
-
- if (required > 0)
- cmd->required_opt_args[cmd->ro_count-1].def = def;
- else if (!required)
- cmd->optional_opt_args[cmd->oo_count-1].def = def;
- else if (required < 0)
- cmd->ignore_opt_args[cmd->io_count-1].def = def;
- else
- exit(1);
-}
-
-/*
- * When an position arg is seen, add a new pos_args entry for it.
- * This function sets the pos_args.pos and pos_args.def.
- */
-
-static void add_pos_arg(struct command *cmd, char *str, int required)
-{
- struct arg_def def = { 0 };
-
- /* pos_arg.pos and pos_arg.def are set here */
-
- set_pos_def(cmd, str, &def);
-
- if (required) {
- cmd->required_pos_args[cmd->rp_count].pos = cmd->pos_count++;
- cmd->required_pos_args[cmd->rp_count].def = def;
- cmd->rp_count++;
- } else {
- cmd->optional_pos_args[cmd->op_count].pos = cmd->pos_count++;;
- cmd->optional_pos_args[cmd->op_count].def = def;
- cmd->op_count++;
- }
-}
-
-/* Process something that follows a pos arg, which is not a new pos arg. */
-
-static void update_prev_pos_arg(struct command *cmd, char *str, int required)
-{
- struct arg_def *def;
-
- /* a previous pos_arg.def is modified here */
-
- if (required)
- def = &cmd->required_pos_args[cmd->rp_count-1].def;
- else
- def = &cmd->optional_pos_args[cmd->op_count-1].def;
-
- if (!strcmp(str, "..."))
- def->flags |= ARG_DEF_FLAG_MAY_REPEAT;
- else {
- printf("Unknown pos arg: %s\n", str);
- exit(1);
- }
-}
-
-/* Process what follows OO:, which are the optional opt args for the cmd def. */
-
-static void add_optional_opt_line(struct command *cmd, int argc, char *argv[])
-{
- int takes_arg;
- int i;
-
- for (i = 0; i < argc; i++) {
- if (!i && !strncmp(argv[i], "OO:", 3))
- continue;
- if (is_opt_name(argv[i]))
- add_opt_arg(cmd, argv[i], &takes_arg, OPTIONAL);
- else if (!strncmp(argv[i], "OO_", 3))
- include_optional_opt_args(cmd, argv[i]);
- else if (takes_arg)
- update_prev_opt_arg(cmd, argv[i], OPTIONAL);
- else
- printf("Can't parse argc %d argv %s prev %s\n",
- i, argv[i], argv[i-1]);
- }
-}
-
-/* Process what follows IO:, which are the ignore options for the cmd def. */
-
-static void add_ignore_opt_line(struct command *cmd, int argc, char *argv[])
-{
- int takes_arg;
- int i;
-
- for (i = 0; i < argc; i++) {
- if (!i && !strncmp(argv[i], "IO:", 3))
- continue;
- if (is_opt_name(argv[i]))
- add_opt_arg(cmd, argv[i], &takes_arg, IGNORE);
- else if (takes_arg)
- update_prev_opt_arg(cmd, argv[i], IGNORE);
- else
- printf("Can't parse argc %d argv %s prev %s\n",
- i, argv[i], argv[i-1]);
- }
-}
-
-/* Process what follows OP:, which are optional pos args for the cmd def. */
-
-static void add_optional_pos_line(struct command *cmd, int argc, char *argv[])
-{
- int i;
-
- for (i = 0; i < argc; i++) {
- if (!i && !strncmp(argv[i], "OP:", 3))
- continue;
- if (is_pos_name(argv[i]))
- add_pos_arg(cmd, argv[i], OPTIONAL);
- else
- update_prev_pos_arg(cmd, argv[i], OPTIONAL);
- }
-}
-
-static void add_required_opt_line(struct command *cmd, int argc, char *argv[])
-{
- int takes_arg;
- int i;
-
- for (i = 0; i < argc; i++) {
- if (is_opt_name(argv[i]))
- add_opt_arg(cmd, argv[i], &takes_arg, REQUIRED);
- else if (takes_arg)
- update_prev_opt_arg(cmd, argv[i], REQUIRED);
- else
- printf("Can't parse argc %d argv %s prev %s\n",
- i, argv[i], argv[i-1]);
- }
-}
-
-/*
- * Add to required_opt_args from an OO_FOO definition.
- * (This is the special case of vgchange/lvchange where one
- * optional option is required, and others are then optional.)
- * The set of options from OO_FOO are saved in required_opt_args,
- * and flag CMD_FLAG_ONE_REQUIRED_OPT is set on the cmd indicating
- * this special case.
- */
-
-static void include_required_opt_args(struct command *cmd, char *str)
-{
- char *oo_line;
- char *line;
- char *line_argv[MAX_LINE_ARGC];
- int line_argc;
-
- if (!(oo_line = get_oo_line(str))) {
- printf("No OO line found for %s\n", str);
- exit(1);
- }
-
- if (!(line = strdup(oo_line)))
- exit(1);
-
- split_line(line, &line_argc, line_argv, ' ');
- add_required_opt_line(cmd, line_argc, line_argv);
- free(line);
-}
-
-/* Process what follows command_name, which are required opt/pos args. */
-
-static void add_required_line(struct command *cmd, int argc, char *argv[])
-{
- int i;
- int takes_arg;
- int prev_was_opt = 0, prev_was_pos = 0;
-
- /* argv[0] is command name */
-
- for (i = 1; i < argc; i++) {
-
- if (is_opt_name(argv[i])) {
- /* add new required_opt_arg */
- add_opt_arg(cmd, argv[i], &takes_arg, REQUIRED);
- prev_was_opt = 1;
- prev_was_pos = 0;
-
- } else if (prev_was_opt && takes_arg) {
- /* set value for previous required_opt_arg */
- update_prev_opt_arg(cmd, argv[i], REQUIRED);
- prev_was_opt = 0;
- prev_was_pos = 0;
-
- } else if (is_pos_name(argv[i])) {
- /* add new required_pos_arg */
- add_pos_arg(cmd, argv[i], REQUIRED);
- prev_was_opt = 0;
- prev_was_pos = 1;
-
- } else if (!strncmp(argv[i], "OO_", 3)) {
- /* one required_opt_arg is required, special case lv/vgchange */
- cmd->cmd_flags |= CMD_FLAG_ONE_REQUIRED_OPT;
- include_required_opt_args(cmd, argv[i]);
-
- } else if (prev_was_pos) {
- /* set property for previous required_pos_arg */
- update_prev_pos_arg(cmd, argv[i], REQUIRED);
- } else
- printf("Can't parse argc %d argv %s prev %s\n",
- i, argv[i], argv[i-1]);
-
- }
-}
-
-static void add_flags(struct command *cmd, char *line)
-{
- if (strstr(line, "SECONDARY_SYNTAX"))
- cmd->cmd_flags |= CMD_FLAG_SECONDARY_SYNTAX;
-}
-
-#define MAX_RULE_OPTS 64
-
-static void add_rule(struct command *cmd, char *line)
-{
- struct cmd_rule *rule;
- char *line_argv[MAX_LINE_ARGC];
- char *arg;
- int line_argc;
- int i, lvt_enum, lvp_enum;
- int check = 0;
-
- if (cmd->rule_count == CMD_MAX_RULES) {
- printf("too many rules for cmd\n");
- exit(1);
- }
-
- rule = &cmd->rules[cmd->rule_count++];
-
- split_line(line, &line_argc, line_argv, ' ');
-
- for (i = 0; i < line_argc; i++) {
- arg = line_argv[i];
-
- if (!strcmp(arg, "not")) {
- rule->rule = RULE_INVALID;
- check = 1;
- }
-
- else if (!strcmp(arg, "and")) {
- rule->rule = RULE_REQUIRE;
- check = 1;
- }
-
- else if (!strncmp(arg, "all", 3)) {
- /* opt/lvt_bits/lvp_bits all remain 0 to mean all */
- continue;
- }
-
- else if (!strncmp(arg, "--", 2)) {
- if (!rule->opts) {
- if (!(rule->opts = malloc(MAX_RULE_OPTS * sizeof(int)))) {
- printf("no mem\n");
- exit(1);
- }
- memset(rule->opts, 0, MAX_RULE_OPTS * sizeof(int));
- }
-
- if (!rule->check_opts) {
- if (!(rule->check_opts = malloc(MAX_RULE_OPTS * sizeof(int)))) {
- printf("no mem\n");
- exit(1);
- }
- memset(rule->check_opts, 0, MAX_RULE_OPTS * sizeof(int));
- }
-
- if (check)
- rule->check_opts[rule->check_opts_count++] = opt_str_to_num(arg);
- else
- rule->opts[rule->opts_count++] = opt_str_to_num(arg);
- }
-
- else if (!strncmp(arg, "LV_", 3)) {
- lvt_enum = lv_to_enum(arg);
-
- if (check)
- rule->check_lvt_bits |= lvt_enum_to_bit(lvt_enum);
- else
- rule->lvt_bits |= lvt_enum_to_bit(lvt_enum);
- }
-
- else if (!strncmp(arg, "lv_is_", 6)) {
- lvp_enum = lvp_name_to_enum(arg);
-
- if (check)
- rule->check_lvp_bits |= lvp_enum_to_bit(lvp_enum);
- else
- rule->lvp_bits |= lvp_enum_to_bit(lvp_enum);
- }
- }
-}
-
-/* The given option is common to all lvm commands (set in lvm_all). */
-
-int is_lvm_all_opt(int opt)
-{
- int oo;
-
- for (oo = 0; oo < lvm_all.oo_count; oo++) {
- if (lvm_all.optional_opt_args[oo].opt == opt)
- return 1;
- }
- return 0;
-}
-
-/* Find common options for all variants of each command name. */
-
-static void factor_common_options(void)
-{
- int cn, opt_enum, ci, oo, ro, found;
- struct command *cmd;
-
- for (cn = 0; cn < MAX_CMD_NAMES; cn++) {
- if (!cmd_names[cn].name)
- break;
-
- for (ci = 0; ci < cmd_count; ci++) {
- cmd = &cmd_array[ci];
-
- if (strcmp(cmd->name, cmd_names[cn].name))
- continue;
-
- cmd_names[cn].variants++;
- }
-
- for (opt_enum = 0; opt_enum < ARG_COUNT; opt_enum++) {
-
- for (ci = 0; ci < cmd_count; ci++) {
- cmd = &cmd_array[ci];
-
- if (strcmp(cmd->name, cmd_names[cn].name))
- continue;
-
- if (cmd->ro_count)
- cmd_names[cn].variant_has_ro = 1;
- if (cmd->rp_count)
- cmd_names[cn].variant_has_rp = 1;
- if (cmd->oo_count)
- cmd_names[cn].variant_has_oo = 1;
- if (cmd->op_count)
- cmd_names[cn].variant_has_op = 1;
-
- for (ro = 0; ro < cmd->ro_count; ro++) {
- cmd_names[cn].all_options[cmd->required_opt_args[ro].opt] = 1;
-
- if ((cmd->required_opt_args[ro].opt == size_ARG) && !strncmp(cmd->name, "lv", 2))
- cmd_names[cn].all_options[extents_ARG] = 1;
- }
- for (oo = 0; oo < cmd->oo_count; oo++)
- cmd_names[cn].all_options[cmd->optional_opt_args[oo].opt] = 1;
-
- found = 0;
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- if (cmd->optional_opt_args[oo].opt == opt_enum) {
- found = 1;
- break;
- }
- }
-
- if (!found)
- goto next_opt;
- }
-
- /* all commands starting with this name use this option */
- cmd_names[cn].common_options[opt_enum] = 1;
- next_opt:
- ;
- }
- }
-}
-
-static int long_name_compare(const void *on1, const void *on2)
-{
- struct opt_name **optname1 = (void *)on1;
- struct opt_name **optname2 = (void *)on2;
- return strcmp((*optname1)->long_opt + 2, (*optname2)->long_opt + 2);
-}
-
-/* Create list of option names for printing alphabetically. */
-
-static void create_opt_names_alpha(void)
-{
- int i;
-
- for (i = 0; i < ARG_COUNT; i++)
- opt_names_alpha[i] = &opt_names[i];
-
- qsort(opt_names_alpha, ARG_COUNT, sizeof(long), long_name_compare);
-}
-
-static void print_help(int argc, char *argv[])
-{
- printf("%s [options] --output <format> <filename>\n", argv[0]);
- printf("\n");
- printf("output formats:\n");
- printf("struct: print C structures for command-lines.h\n");
- printf("count: print defines and enums for command-lines-count.h\n");
- printf("ambiguous: print commands differing only by LV types\n");
- printf("man: print man page format.\n");
- printf("\n");
- printf("options:\n");
- printf("-c|--man-command <commandname> man output for one command name\n");
-}
-
-int main(int argc, char *argv[])
-{
- char *outputformat = NULL;
- char *inputfile = NULL;
- FILE *file;
- struct command *cmd;
- char line[MAX_LINE];
- char line_orig[MAX_LINE];
- const char *name;
- char *line_argv[MAX_LINE_ARGC];
- char *n;
- int line_argc;
- int prev_was_oo_def = 0;
- int prev_was_oo = 0;
- int prev_was_op = 0;
-
- if (argc < 2) {
- print_help(argc, argv);
- exit(EXIT_FAILURE);
- }
-
- create_opt_names_alpha();
-
- static struct option long_options[] = {
- {"help", no_argument, 0, 'h' },
- {"output", required_argument, 0, 'o' },
- {"man-primary", required_argument, 0, 'p' },
- {"man-secondary", required_argument, 0, 's' },
- {"man-command", required_argument, 0, 'c' },
- {0, 0, 0, 0 }
- };
-
- while (1) {
- int c;
- int option_index = 0;
-
- c = getopt_long(argc, argv, "ho:p:s:c:",
- long_options, &option_index);
- if (c == -1)
- break;
-
- switch (c) {
- case '0':
- break;
- case 'h':
- print_help(argc, argv);
- exit(EXIT_SUCCESS);
- case 'o':
- outputformat = strdup(optarg);
- break;
- case 'p':
- include_man_primary = atoi(optarg);
- break;
- case 's':
- include_man_secondary = atoi(optarg);
- break;
- case 'c':
- man_command_name = strdup(optarg);
- break;
- }
- }
-
- if (optind < argc)
- inputfile = argv[optind];
- else {
- printf("Missing filename.\n");
- return 0;
- }
-
- if (!(file = fopen(inputfile, "r"))) {
- printf("Cannot open %s\n", argv[1]);
- return -1;
- }
-
- /* Process each line of input file. */
-
- while (fgets(line, MAX_LINE, file)) {
- if (line[0] == '#')
- continue;
- if (line[0] == '\n')
- continue;
- if (line[0] == '-' && line[1] == '-' && line[2] == '-')
- continue;
-
- if ((n = strchr(line, '\n')))
- *n = '\0';
-
- memcpy(line_orig, line, sizeof(line));
- split_line(line, &line_argc, line_argv, ' ');
-
- if (!line_argc)
- continue;
-
- /* command ... */
- if ((name = is_command_name(line_argv[0]))) {
- if (cmd_count >= MAX_CMDS) {
- printf("MAX_CMDS too small\n");
- return -1;
- }
- cmd = &cmd_array[cmd_count++];
- cmd->name = name;
- cmd->pos_count = 1;
- add_required_line(cmd, line_argc, line_argv);
-
- /* Every cmd gets the OO_ALL options */
- include_optional_opt_args(cmd, "OO_ALL:");
- continue;
- }
-
- if (is_desc_line(line_argv[0])) {
- char *desc = strdup(line_orig);
- if (cmd->desc) {
- int newlen = strlen(cmd->desc) + strlen(desc) + 2;
- char *newdesc = malloc(newlen);
- memset(newdesc, 0, newlen);
- snprintf(newdesc, newlen, "%s %s", cmd->desc, desc);
- cmd->desc = newdesc;
- free(desc);
- } else
- cmd->desc = desc;
- continue;
- }
-
- if (is_flags_line(line_argv[0])) {
- add_flags(cmd, line_orig);
- continue;
- }
-
- if (is_rule_line(line_argv[0])) {
- add_rule(cmd, line_orig);
- continue;
- }
-
- if (is_id_line(line_argv[0])) {
- cmd->command_line_id = strdup(line_argv[1]);
- continue;
- }
-
- /* OO_FOO: ... */
- if (is_oo_definition(line_argv[0])) {
- add_oo_definition_line(line_argv[0], line_orig);
- prev_was_oo_def = 1;
- prev_was_oo = 0;
- prev_was_op = 0;
- continue;
- }
-
- /* OO: ... */
- if (is_oo_line(line_argv[0])) {
- add_optional_opt_line(cmd, line_argc, line_argv);
- prev_was_oo_def = 0;
- prev_was_oo = 1;
- prev_was_op = 0;
- continue;
- }
-
- /* OP: ... */
- if (is_op_line(line_argv[0])) {
- add_optional_pos_line(cmd, line_argc, line_argv);
- prev_was_oo_def = 0;
- prev_was_oo = 0;
- prev_was_op = 1;
- continue;
- }
-
- /* IO: ... */
- if (is_io_line(line_argv[0])) {
- add_ignore_opt_line(cmd, line_argc, line_argv);
- prev_was_oo = 0;
- prev_was_op = 0;
- continue;
- }
-
- /* handle OO_FOO:, OO:, OP: continuing on multiple lines */
-
- if (prev_was_oo_def) {
- append_oo_definition_line(line_orig);
- continue;
- }
-
- if (prev_was_oo) {
- add_optional_opt_line(cmd, line_argc, line_argv);
- continue;
- }
-
- if (prev_was_op) {
- add_optional_pos_line(cmd, line_argc, line_argv);
- continue;
- }
- }
-
- fclose(file);
-
- /*
- * Looks at all variants of each command name and figures out
- * which options are common to all variants (for compact output)
- */
- factor_common_options();
-
- /*
- * Predefined string of options common to all commands
- * (for compact output)
- */
- include_optional_opt_args(&lvm_all, "OO_USAGE_COMMON");
-
- /*
- * Print output.
- */
-
- if (!strcmp(outputformat, "struct"))
- print_header_struct();
-
- else if (!strcmp(outputformat, "count"))
- print_header_count();
-
- else if (!strcmp(outputformat, "ambiguous"))
- print_ambiguous();
-
- else if (!strcmp(outputformat, "man"))
- print_man(man_command_name, include_man_primary, include_man_secondary);
- else
- print_help(argc, argv);
-
- return 0;
-}
-
diff --git a/tools/ccmd-man.c b/tools/ccmd-man.c
deleted file mode 100644
index 34a9c38..0000000
--- a/tools/ccmd-man.c
+++ /dev/null
@@ -1,997 +0,0 @@
-#include <asm/types.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <limits.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <sched.h>
-#include <dirent.h>
-#include <ctype.h>
-
-#include "ccmd.h"
-
-char *split_line(char *buf, int *argc, char **argv, char sep);
-struct cmd_name *find_command_name(const char *str);
-int is_lvm_all_opt(int opt);
-const char *lvt_enum_to_name(int lvt_enum);
-
-extern struct val_name val_names[VAL_COUNT + 1];
-extern struct opt_name opt_names[ARG_COUNT + 1];
-extern struct lvp_name lvp_names[LVP_COUNT + 1];
-extern struct lvt_name lvt_names[LVT_COUNT + 1];
-extern struct cmd_name cmd_names[MAX_CMD_NAMES];
-extern struct opt_name *opt_names_alpha[ARG_COUNT + 1];
-extern struct command lvm_all;
-
-static const char *cmd_name_desc(const char *name)
-{
- int i;
-
- for (i = 0; i < MAX_CMD_NAMES; i++) {
- if (!cmd_names[i].name)
- break;
- if (!strcmp(cmd_names[i].name, name))
- return cmd_names[i].desc;
- }
- return NULL;
-}
-
-static void print_val_man(const char *str)
-{
- char *line;
- char *line_argv[MAX_LINE_ARGC];
- int line_argc;
- int i;
-
- if (!strcmp(str, "Number") ||
- !strcmp(str, "String") ||
- !strncmp(str, "VG", 2) ||
- !strncmp(str, "LV", 2) ||
- !strncmp(str, "PV", 2) ||
- !strcmp(str, "Tag")) {
- printf("\\fI%s\\fP", str);
- return;
- }
-
- if (strstr(str, "Number[") || strstr(str, "]Number")) {
- for (i = 0; i < strlen(str); i++) {
- if (str[i] == 'N')
- printf("\\fI");
- if (str[i] == 'r') {
- printf("%c", str[i]);
- printf("\\fP");
- continue;
- }
- printf("%c", str[i]);
- }
- return;
- }
-
- if (strstr(str, "|")) {
- int len = strlen(str);
- line = strdup(str);
- split_line(line, &line_argc, line_argv, '|');
- for (i = 0; i < line_argc; i++) {
- if (i) {
- printf("|");
-
- /* this is a hack to add a line break for
- a long string of opt values */
- if ((len > 40) && (i >= (line_argc / 2) + 1)) {
- printf("\n");
- printf(" ");
- len = 0;
- }
- }
- if (strstr(line_argv[i], "Number"))
- printf("\\fI%s\\fP", line_argv[i]);
- else
- printf("\\fB%s\\fP", line_argv[i]);
- }
- return;
- }
-
- printf("\\fB%s\\fP", str);
-}
-
-static void print_def_man(struct arg_def *def, int usage)
-{
- int val_enum;
- int lvt_enum;
- int sep = 0;
- int i;
-
- for (val_enum = 0; val_enum < VAL_COUNT; val_enum++) {
- if (def->val_bits & val_enum_to_bit(val_enum)) {
-
- if (val_enum == conststr_VAL) {
- printf("\\fB");
- printf("%s", def->str);
- printf("\\fP");
- }
-
- else if (val_enum == constnum_VAL) {
- printf("\\fB");
- printf("%llu", (unsigned long long)def->num);
- printf("\\fP");
- }
-
- else {
- if (sep) printf("|");
-
- if (!usage || !val_names[val_enum].usage) {
- printf("\\fI");
- printf("%s", val_names[val_enum].name);
- printf("\\fP");
- } else {
- print_val_man(val_names[val_enum].usage);
- }
-
- sep = 1;
- }
-
- if (val_enum == lv_VAL && def->lvt_bits) {
- printf("\\fI");
- for (lvt_enum = 1; lvt_enum < LVT_COUNT; lvt_enum++) {
- if (lvt_bit_is_set(def->lvt_bits, lvt_enum))
- printf("_%s", lvt_enum_to_name(lvt_enum));
- }
- printf("\\fP");
- }
-
- if ((val_enum == vg_VAL) && (def->flags & ARG_DEF_FLAG_NEW_VG)) {
- printf("\\fI");
- printf("_new");
- printf("\\fP");
- }
- if ((val_enum == lv_VAL) && (def->flags & ARG_DEF_FLAG_NEW_LV)) {
- printf("\\fI");
- printf("_new");
- printf("\\fP");
- }
- }
- }
-
- if (def->flags & ARG_DEF_FLAG_MAY_REPEAT)
- printf(" ...");
-}
-
-static char *man_long_opt_name(const char *cmdname, int opt_enum)
-{
- static char long_opt_name[64];
-
- memset(&long_opt_name, 0, sizeof(long_opt_name));
-
- switch (opt_enum) {
- case syncaction_ARG:
- strncpy(long_opt_name, "--[raid]syncaction", 63);
- break;
- case writemostly_ARG:
- strncpy(long_opt_name, "--[raid]writemostly", 63);
- break;
- case minrecoveryrate_ARG:
- strncpy(long_opt_name, "--[raid]minrecoveryrate", 63);
- break;
- case maxrecoveryrate_ARG:
- strncpy(long_opt_name, "--[raid]maxrecoveryrate", 63);
- break;
- case writebehind_ARG:
- strncpy(long_opt_name, "--[raid]writebehind", 63);
- break;
- case vgmetadatacopies_ARG:
- if (!strncmp(cmdname, "vg", 2))
- strncpy(long_opt_name, "--[vg]metadatacopies", 63);
- else
- strncpy(long_opt_name, "--vgmetadatacopies", 63);
- break;
- case pvmetadatacopies_ARG:
- if (!strncmp(cmdname, "pv", 2))
- strncpy(long_opt_name, "--[pv]metadatacopies", 63);
- else
- strncpy(long_opt_name, "--pvmetadatacopies", 63);
- break;
- default:
- strncpy(long_opt_name, opt_names[opt_enum].long_opt, 63);
- break;
- }
-
- return long_opt_name;
-}
-
-void print_man_usage(struct command *cmd)
-{
- struct cmd_name *cname;
- int onereq = (cmd->cmd_flags & CMD_FLAG_ONE_REQUIRED_OPT) ? 1 : 0;
- int i, sep, ro, rp, oo, op, opt_enum;
-
- if (!(cname = find_command_name(cmd->name)))
- return;
-
- printf("\\fB%s\\fP", cmd->name);
-
- if (!onereq)
- goto ro_normal;
-
- /*
- * one required option in a set, print as:
- * ( -a|--a,
- * -b|--b,
- * --c,
- * --d )
- *
- * First loop through ro prints those with short opts,
- * and the second loop prints those without short opts.
- */
-
- if (cmd->ro_count) {
- printf("\n");
- printf(".RS 4\n");
- printf("(");
-
- sep = 0;
-
- /* print required options with a short opt */
- for (ro = 0; ro < cmd->ro_count; ro++) {
- opt_enum = cmd->required_opt_args[ro].opt;
-
- if (!opt_names[opt_enum].short_opt)
- continue;
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- }
-
- if (opt_names[opt_enum].short_opt) {
- printf(" \\fB-%c\\fP|\\fB%s\\fP",
- opt_names[opt_enum].short_opt,
- man_long_opt_name(cmd->name, opt_enum));
- } else {
- printf(" ");
- printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
- }
-
- if (cmd->required_opt_args[ro].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->required_opt_args[ro].def, 1);
- }
-
- sep = 1;
- }
-
- /* print required options without a short opt */
- for (ro = 0; ro < cmd->ro_count; ro++) {
- opt_enum = cmd->required_opt_args[ro].opt;
-
- if (opt_names[opt_enum].short_opt)
- continue;
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- }
-
- printf(" ");
- printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
-
- if (cmd->required_opt_args[ro].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->required_opt_args[ro].def, 1);
- }
-
- sep = 1;
- }
-
- printf(" )\n");
- printf(".RE\n");
- }
-
- /* print required position args on a new line after the onereq set */
- if (cmd->rp_count) {
- printf(".RS 4\n");
- for (rp = 0; rp < cmd->rp_count; rp++) {
- if (cmd->required_pos_args[rp].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->required_pos_args[rp].def, 1);
- }
- }
-
- printf("\n");
- printf(".RE\n");
- } else {
- /* printf("\n"); */
- }
-
- printf(".br\n");
- goto oo_count;
-
- ro_normal:
-
- /*
- * all are required options, print as:
- * -a|--aaa <val> -b|--bbb <val>
- */
-
- if (cmd->ro_count) {
- for (ro = 0; ro < cmd->ro_count; ro++) {
- opt_enum = cmd->required_opt_args[ro].opt;
-
- if (opt_names[opt_enum].short_opt) {
- printf(" \\fB-%c\\fP|\\fB%s\\fP",
- opt_names[opt_enum].short_opt,
- man_long_opt_name(cmd->name, opt_enum));
- } else {
- printf(" \\fB%s\\fP", opt_names[cmd->required_opt_args[ro].opt].long_opt);
- }
-
- if (cmd->required_opt_args[ro].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->required_opt_args[ro].def, 1);
- }
- }
- }
-
- /* print required position args on the same line as the required options */
- if (cmd->rp_count) {
- for (rp = 0; rp < cmd->rp_count; rp++) {
- if (cmd->required_pos_args[rp].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->required_pos_args[rp].def, 1);
- }
- }
-
- printf("\n");
- } else {
- printf("\n");
- }
-
- printf(".br\n");
-
- oo_count:
- if (!cmd->oo_count)
- goto op_count;
-
- sep = 0;
-
- if (cmd->oo_count) {
- printf(".RS 4\n");
- printf("[");
-
- /* print optional options with short opts */
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- opt_enum = cmd->optional_opt_args[oo].opt;
-
- if (!opt_names[opt_enum].short_opt)
- continue;
-
- /*
- * Skip common opts which are in the usage_common string.
- * The common opts are those in lvm_all and in
- * cname->common_options.
- */
-
- if (is_lvm_all_opt(opt_enum))
- continue;
-
- if ((cname->variants > 1) && cname->common_options[opt_enum])
- continue;
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- }
-
- printf(" \\fB-%c\\fP|\\fB%s\\fP",
- opt_names[opt_enum].short_opt,
- man_long_opt_name(cmd->name, opt_enum));
-
- if (cmd->optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->optional_opt_args[oo].def, 1);
- }
- sep = 1;
- }
-
- /* print optional options without short opts */
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- opt_enum = cmd->optional_opt_args[oo].opt;
-
- if (opt_names[opt_enum].short_opt)
- continue;
-
- /*
- * Skip common opts which are in the usage_common string.
- * The common opts are those in lvm_all and in
- * cname->common_options.
- */
-
- if (is_lvm_all_opt(opt_enum))
- continue;
-
- if ((cname->variants > 1) && cname->common_options[opt_enum])
- continue;
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- }
-
- /* space alignment without short opt */
- printf(" ");
-
- printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
-
- if (cmd->optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->optional_opt_args[oo].def, 1);
- }
- sep = 1;
- }
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- /* space alignment without short opt */
- printf(" ");
- }
- printf(" COMMON_OPTIONS");
- printf(" ]\n");
- printf(".RE\n");
- printf(".br\n");
- }
-
- op_count:
- if (!cmd->op_count)
- goto done;
-
- printf(".RS 4\n");
- printf("[");
-
- if (cmd->op_count) {
- for (op = 0; op < cmd->op_count; op++) {
- if (cmd->optional_pos_args[op].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->optional_pos_args[op].def, 1);
- }
- }
- }
-
- printf(" ]\n");
- printf(".RE\n");
-
- done:
- printf("\n");
-}
-
-/*
- * common options listed in the usage section.
- *
- * For commands with only one variant, this is only
- * the options which are common to all lvm commands
- * (in lvm_all, see is_lvm_all_opt).
- *
- * For commands with more than one variant, this
- * is the set of options common to all variants
- * (in cname->common_options), (which obviously
- * includes the options common to all lvm commands.)
- *
- * List ordering:
- * options with short+long names, alphabetically,
- * then options with only long names, alphabetically
- */
-
-void print_man_usage_common(struct command *cmd)
-{
- struct cmd_name *cname;
- int i, sep, ro, rp, oo, op, opt_enum;
-
- if (!(cname = find_command_name(cmd->name)))
- return;
-
- sep = 0;
-
- printf(".RS 4\n");
- printf("[");
-
- /* print those with short opts */
- for (i = 0; i < ARG_COUNT; i++) {
- opt_enum = opt_names_alpha[i]->opt_enum;
-
- if (!cname->common_options[opt_enum])
- continue;
-
- if (!opt_names[opt_enum].short_opt)
- continue;
-
- if ((cname->variants < 2) && !is_lvm_all_opt(opt_enum))
- continue;
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- }
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- if (cmd->optional_opt_args[oo].opt != opt_enum)
- continue;
-
- printf(" \\fB-%c\\fP|\\fB%s\\fP",
- opt_names[opt_enum].short_opt,
- man_long_opt_name(cmd->name, opt_enum));
-
- if (cmd->optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->optional_opt_args[oo].def, 1);
- }
- sep = 1;
- break;
- }
-
- }
-
- /* print those without short opts */
- for (i = 0; i < ARG_COUNT; i++) {
- opt_enum = opt_names_alpha[i]->opt_enum;
-
- if (!cname->common_options[opt_enum])
- continue;
-
- if (opt_names[opt_enum].short_opt)
- continue;
-
- if ((cname->variants < 2) && !is_lvm_all_opt(opt_enum))
- continue;
-
- if (sep) {
- printf(",");
- printf("\n.br\n");
- printf(" ");
- }
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- if (cmd->optional_opt_args[oo].opt != opt_enum)
- continue;
-
- /* space alignment without short opt */
- printf(" ");
-
- printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
-
- if (cmd->optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def_man(&cmd->optional_opt_args[oo].def, 1);
- }
- sep = 1;
- break;
- }
- }
-
- printf(" ]\n");
- return;
-}
-
-/*
- * Format of description, when different command names have
- * different descriptions:
- *
- * "#cmdname1"
- * "text foo goes here"
- * "a second line of text."
- * "#cmdname2"
- * "text bar goes here"
- * "another line of text."
- *
- * When called for cmdname2, this function should just print:
- *
- * "text bar goes here"
- * "another line of text."
- */
-
-static void print_man_option_desc(struct cmd_name *cname, int opt_enum)
-{
- const char *desc = opt_names[opt_enum].desc;
- char buf[DESC_LINE];
- int started_cname = 0;
- int line_count = 0;
- int di, bi = 0;
-
- if (desc[0] != '#') {
- printf("%s", desc);
- return;
- }
-
- for (di = 0; di < strlen(desc); di++) {
- buf[bi++] = desc[di];
-
- if (bi == DESC_LINE) {
- printf("print_man_option_desc line too long\n");
- return;
- }
-
- if (buf[bi-1] != '\n')
- continue;
-
- if (buf[0] != '#') {
- if (started_cname) {
- printf("%s", buf);
- line_count++;
- }
-
- memset(buf, 0, sizeof(buf));
- bi = 0;
- continue;
- }
-
- /* Line starting with #cmdname */
-
- /*
- * Must be starting a new command name.
- * If no lines have been printed, multiple command names
- * are using the same text. If lines have been printed,
- * then the start of a new command name means the end
- * of text for the current command name.
- */
- if (line_count && started_cname)
- return;
-
- if (!strncmp(buf + 1, cname->name, strlen(cname->name))) {
- /* The start of our command name. */
- started_cname = 1;
- memset(buf, 0, sizeof(buf));
- bi = 0;
- } else {
- /* The start of another command name. */
- memset(buf, 0, sizeof(buf));
- bi = 0;
- }
- }
-
- if (bi && started_cname)
- printf("%s", buf);
-}
-
-/*
- * Print a list of all options names for a given
- * command name, listed by:
- * options with short+long names, alphabetically,
- * then options with only long names, alphabetically
- */
-
-void print_man_all_options_list(struct cmd_name *cname)
-{
- int opt_enum, val_enum;
- int sep = 0;
- int i;
-
- /* print those with both short and long opts */
- for (i = 0; i < ARG_COUNT; i++) {
- opt_enum = opt_names_alpha[i]->opt_enum;
-
-
- if (!cname->all_options[opt_enum])
- continue;
-
- if (!opt_names[opt_enum].short_opt)
- continue;
-
- if (sep)
- printf("\n.br\n");
-
- printf(" \\fB-%c\\fP|\\fB%s\\fP",
- opt_names[opt_enum].short_opt,
- man_long_opt_name(cname->name, opt_enum));
-
- val_enum = opt_names[opt_enum].val_enum;
-
- if (!val_names[val_enum].fn) {
- /* takes no arg */
- } else if (!val_names[val_enum].usage) {
- printf(" ");
- printf("\\fI");
- printf("%s", val_names[val_enum].name);
- printf("\\fP");
- } else {
- printf(" ");
- print_val_man(val_names[val_enum].usage);
- }
-
- sep = 1;
- }
-
- /* print those without short opts */
- for (i = 0; i < ARG_COUNT; i++) {
- opt_enum = opt_names_alpha[i]->opt_enum;
-
- if (!cname->all_options[opt_enum])
- continue;
-
- if (opt_names[opt_enum].short_opt)
- continue;
-
- if (sep)
- printf("\n.br\n");
-
- /* space alignment without short opt */
- printf(" ");
-
- printf(" \\fB%s\\fP", man_long_opt_name(cname->name, opt_enum));
-
- val_enum = opt_names[opt_enum].val_enum;
-
- if (!val_names[val_enum].fn) {
- /* takes no arg */
- } else if (!val_names[val_enum].usage) {
- printf(" ");
- printf("\\fI");
- printf("%s", val_names[val_enum].name);
- printf("\\fP");
- } else {
- printf(" ");
- print_val_man(val_names[val_enum].usage);
- }
-
- sep = 1;
- }
-}
-
-/*
- * All options used for a given command name, along with descriptions.
- * listed in order of:
- * 1. options that are not common to all lvm commands, alphabetically
- * 2. options common to all lvm commands, alphabetically
- */
-
-void print_man_all_options_desc(struct cmd_name *cname)
-{
- int opt_enum, val_enum;
- int print_common = 0;
- int sep = 0;
- int i;
-
- again:
- /*
- * Loop 1: print options that are not common to all lvm commands.
- * Loop 2: print options common to all lvm commands (lvm_all)
- */
-
- for (i = 0; i < ARG_COUNT; i++) {
- opt_enum = opt_names_alpha[i]->opt_enum;
-
- if (!cname->all_options[opt_enum])
- continue;
-
- if (!print_common && is_lvm_all_opt(opt_enum))
- continue;
-
- if (print_common && !is_lvm_all_opt(opt_enum))
- continue;
-
- if (sep)
- printf("\n.br\n");
-
- printf("\n.TP\n");
-
- if (opt_names[opt_enum].short_opt) {
- printf("\\fB-%c\\fP|\\fB%s\\fP",
- opt_names[opt_enum].short_opt,
- man_long_opt_name(cname->name, opt_enum));
- } else {
- printf("\\fB%s\\fP", man_long_opt_name(cname->name, opt_enum));
- }
-
- val_enum = opt_names[opt_enum].val_enum;
-
- if (!val_names[val_enum].fn) {
- /* takes no arg */
- } else if (!val_names[val_enum].usage) {
- printf(" ");
- printf("\\fI");
- printf("%s", val_names[val_enum].name);
- printf("\\fP");
- } else {
- printf(" ");
- print_val_man(val_names[val_enum].usage);
- }
-
- if (opt_names[opt_enum].desc) {
- printf("\n");
- printf(".br\n");
- print_man_option_desc(cname, opt_enum);
- }
-
- sep = 1;
- }
-
- if (!print_common) {
- print_common = 1;
- goto again;
- }
-}
-
-void print_desc_man(const char *desc)
-{
- char buf[DESC_LINE] = {0};
- int di = 0;
- int bi = 0;
-
- for (di = 0; di < strlen(desc); di++) {
- if (desc[di] == '\0')
- break;
- if (desc[di] == '\n')
- continue;
-
- if (!strncmp(&desc[di], "DESC:", 5)) {
- if (bi) {
- printf("%s\n", buf);
- printf(".br\n");
- memset(buf, 0, sizeof(buf));
- bi = 0;
- }
- di += 5;
- continue;
- }
-
- if (!bi && desc[di] == ' ')
- continue;
-
- buf[bi++] = desc[di];
-
- if (bi == (DESC_LINE - 1))
- break;
- }
-
- if (bi) {
- printf("%s\n", buf);
- printf(".br\n");
- }
-}
-
-static char *upper_command_name(char *str)
-{
- static char str_upper[32];
- int i = 0;
-
- while (*str) {
- str_upper[i++] = toupper(*str);
- str++;
- }
- str_upper[i] = '\0';
- return str_upper;
-}
-
-void print_man(char *man_command_name, int include_primary, int include_secondary)
-{
- struct cmd_name *cname;
- struct command *cmd, *prev_cmd = NULL;
- const char *desc;
- int i, j, ro, rp, oo, op;
-
- printf(".TH %s 8 \"LVM TOOLS #VERSION#\" \"Sistina Software UK\"\n",
- man_command_name ? upper_command_name(man_command_name) : "LVM_COMMANDS");
-
- for (i = 0; i < cmd_count; i++) {
-
- cmd = &cmd_array[i];
-
- if (prev_cmd && strcmp(prev_cmd->name, cmd->name)) {
- printf("Common options:\n");
- printf(".\n");
- print_man_usage_common(prev_cmd);
-
- printf("\n");
- printf(".SH OPTIONS\n");
- printf(".br\n");
- print_man_all_options_desc(cname);
-
- prev_cmd = NULL;
- }
-
- if ((cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_secondary)
- continue;
-
- if (!(cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_primary)
- continue;
-
- if (man_command_name && strcmp(man_command_name, cmd->name))
- continue;
-
- if (!prev_cmd || strcmp(prev_cmd->name, cmd->name)) {
- printf(".SH NAME\n");
- printf(".\n");
- if ((desc = cmd_name_desc(cmd->name)))
- printf("%s \\- %s\n", cmd->name, desc);
- else
- printf("%s\n", cmd->name);
- printf(".br\n");
- printf(".P\n");
- printf(".\n");
- printf(".SH SYNOPSIS\n");
- printf(".br\n");
- printf(".P\n");
- printf(".\n");
- prev_cmd = cmd;
-
- if (!(cname = find_command_name(cmd->name)))
- return;
-
- if (cname->variant_has_ro && cname->variant_has_rp)
- printf("\\fB%s\\fP \\fIrequired_option_args\\fP \\fIrequired_position_args\\fP\n", cmd->name);
- else if (cname->variant_has_ro && !cname->variant_has_rp)
- printf("\\fB%s\\fP \\fIrequired_option_args\\fP\n", cmd->name);
- else if (!cname->variant_has_ro && cname->variant_has_rp)
- printf("\\fB%s\\fP \\fIrequired_position_args\\fP\n", cmd->name);
- else if (!cname->variant_has_ro && !cname->variant_has_rp)
- printf("\\fB%s\\fP\n", cmd->name);
-
- printf(".br\n");
-
- if (cname->variant_has_oo) {
- printf(" [ \\fIoptional_option_args\\fP ]\n");
- printf(".br\n");
- }
-
- if (cname->variant_has_op) {
- printf(" [ \\fIoptional_position_args\\fP ]\n");
- printf(".br\n");
- }
-
- printf(".P\n");
- printf("\n");
-
- /* listing them all when there's only 1 or 2 is just repetative */
- if (cname->variants > 2) {
- printf(".P\n");
- print_man_all_options_list(cname);
- printf("\n");
- printf(".P\n");
- printf("\n");
- }
-
- printf(".SH USAGE\n");
- printf(".br\n");
- printf(".P\n");
- printf(".\n");
- }
-
- if (cmd->desc) {
- print_desc_man(cmd->desc);
- printf(".P\n");
- }
-
- print_man_usage(cmd);
-
- if (i == (cmd_count - 1)) {
- printf("Common options:\n");
- printf(".\n");
- print_man_usage_common(cmd);
-
- printf("\n");
- printf(".SH OPTIONS\n");
- printf(".br\n");
- print_man_all_options_desc(cname);
-
- }
-
- printf("\n");
- continue;
- }
-}
-
diff --git a/tools/ccmd-util.c b/tools/ccmd-util.c
deleted file mode 100644
index 15b2f96..0000000
--- a/tools/ccmd-util.c
+++ /dev/null
@@ -1,936 +0,0 @@
-#include <asm/types.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <limits.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <sched.h>
-#include <dirent.h>
-#include <ctype.h>
-
-#include "ccmd.h"
-
-struct cmd_name *find_command_name(const char *str);
-int is_lvm_all_opt(int opt);
-
-extern struct val_name val_names[VAL_COUNT + 1];
-extern struct opt_name opt_names[ARG_COUNT + 1];
-extern struct lvp_name lvp_names[LVP_COUNT + 1];
-extern struct lvt_name lvt_names[LVT_COUNT + 1];
-extern struct cmd_name cmd_names[MAX_CMD_NAMES];
-extern struct command lvm_all;
-
-/*
- * modifies buf, replacing the sep characters with \0
- * argv pointers point to positions in buf
- */
-
-char *split_line(char *buf, int *argc, char **argv, char sep)
-{
- char *p = buf, *rp = NULL;
- int i;
-
- argv[0] = p;
-
- for (i = 1; i < MAX_LINE_ARGC; i++) {
- p = strchr(buf, sep);
- if (!p)
- break;
- *p = '\0';
-
- argv[i] = p + 1;
- buf = p + 1;
- }
- *argc = i;
-
- /* we ended by hitting \0, return the point following that */
- if (!rp)
- rp = strchr(buf, '\0') + 1;
-
- return rp;
-}
-
-/* convert value string, e.g. Number, to foo_VAL enum */
-
-int val_str_to_num(char *str)
-{
- char name[32] = { 0 };
- char *new;
- int i;
-
- /* compare the name before any suffix like _new or _<lvtype> */
-
- strncpy(name, str, 31);
- if ((new = strstr(name, "_")))
- *new = '\0';
-
- for (i = 0; i < VAL_COUNT; i++) {
- if (!val_names[i].name)
- break;
- if (!strncmp(name, val_names[i].name, strlen(val_names[i].name)))
- return val_names[i].val_enum;
- }
-
- return 0;
-}
-
-/* convert "--option" to foo_ARG enum */
-
-int opt_str_to_num(char *str)
-{
- char long_name[32];
- char *p;
- int i;
-
- /*
- * --foo_long means there are two args entries
- * for --foo, one with a short option and one
- * without, and we want the one without the
- * short option.
- */
- if (strstr(str, "_long")) {
- strcpy(long_name, str);
- p = strstr(long_name, "_long");
- *p = '\0';
-
- for (i = 0; i < ARG_COUNT; i++) {
- if (!opt_names[i].long_opt)
- continue;
- /* skip anything with a short opt */
- if (opt_names[i].short_opt)
- continue;
- if (!strcmp(opt_names[i].long_opt, long_name))
- return opt_names[i].opt_enum;
- }
-
- printf("Unknown opt str: %s %s\n", str, long_name);
- exit(1);
- }
-
- for (i = 0; i < ARG_COUNT; i++) {
- if (!opt_names[i].long_opt)
- continue;
- /* These are only selected using --foo_long */
- if (strstr(opt_names[i].name, "_long_ARG"))
- continue;
- if (!strcmp(opt_names[i].long_opt, str))
- return opt_names[i].opt_enum;
- }
-
- printf("Unknown opt str: \"%s\"\n", str);
- exit(1);
-}
-
-/* "lv_is_prop" to is_prop_LVP */
-
-int lvp_name_to_enum(char *str)
-{
- int i;
-
- for (i = 1; i < LVP_COUNT; i++) {
- if (!strcmp(str, lvp_names[i].name))
- return lvp_names[i].lvp_enum;
- }
- printf("unknown lv property %s\n", str);
- exit(1);
-}
-
-/* type_LVT to "type" */
-
-const char *lvt_enum_to_name(int lvt_enum)
-{
- return lvt_names[lvt_enum].name;
-}
-
-/* "type" to type_LVT */
-
-static int lvt_name_to_enum(char *str)
-{
- int i;
-
- for (i = 1; i < LVT_COUNT; i++) {
- if (!strcmp(str, lvt_names[i].name))
- return lvt_names[i].lvt_enum;
- }
- printf("unknown lv type %s\n", str);
- exit(1);
-}
-
-/* LV_<type> to <type>_LVT */
-
-int lv_to_enum(char *name)
-{
- return lvt_name_to_enum(name + 3);
-}
-
-/*
- * LV_<type1>_<type2> to lvt_bits
- *
- * type1 to lvt_enum
- * lvt_bits |= lvt_enum_to_bit(lvt_enum)
- * type2 to lvt_enum
- * lvt_bits |= lvt_enum_to_bit(lvt_enum)
- */
-
-uint64_t lv_to_bits(char *name)
-{
- char buf[64];
- char *argv[MAX_LINE_ARGC];
- uint64_t lvt_bits = 0;
- int lvt_enum;
- int argc;
- int i;
-
- strcpy(buf, name);
-
- split_line(buf, &argc, argv, '_');
-
- /* 0 is "LV" */
- for (i = 1; i < argc; i++) {
- if (!strcmp(argv[i], "new"))
- continue;
- lvt_enum = lvt_name_to_enum(argv[i]);
- lvt_bits |= lvt_enum_to_bit(lvt_enum);
- }
-
- return lvt_bits;
-}
-
-/* output for struct/count */
-
-static char *val_bits_to_str(uint64_t val_bits)
-{
- static char buf[1024];
- int i;
- int or = 0;
-
- memset(buf, 0, sizeof(buf));
-
- for (i = 0; i < VAL_COUNT; i++) {
- if (val_bits & val_enum_to_bit(i)) {
- if (or) strcat(buf, " | ");
- strcat(buf, "val_enum_to_bit(");
- strcat(buf, val_names[i].enum_name);
- strcat(buf, ")");
- or = 1;
- }
- }
-
- return buf;
-}
-
-/*
- * When bits for foo_LVP and bar_LVP are both set in bits, print:
- * lvp_enum_to_bit(foo_LVP) | lvp_enum_to_bit(bar_LVP)
- */
-
-static char *lvp_bits_to_str(uint64_t bits)
-{
- static char lvp_buf[1024];
- int i;
- int or = 0;
-
- memset(lvp_buf, 0, sizeof(lvp_buf));
-
- for (i = 0; i < LVP_COUNT; i++) {
- if (bits & lvp_enum_to_bit(i)) {
- if (or) strcat(lvp_buf, " | ");
- strcat(lvp_buf, "lvp_enum_to_bit(");
- strcat(lvp_buf, lvp_names[i].enum_name);
- strcat(lvp_buf, ")");
- or = 1;
- }
- }
-
- return lvp_buf;
-}
-
-/*
- * When bits for foo_LVT and bar_LVT are both set in bits, print:
- * lvt_enum_to_bit(foo_LVT) | lvt_enum_to_bit(bar_LVT)
- */
-
-static char *lvt_bits_to_str(uint64_t bits)
-{
- static char lvt_buf[1024];
- int i;
- int or = 0;
-
- memset(lvt_buf, 0, sizeof(lvt_buf));
-
- for (i = 1; i < LVT_COUNT; i++) {
- if (bits & lvt_enum_to_bit(i)) {
- if (or) strcat(lvt_buf, " | ");
- strcat(lvt_buf, "lvt_enum_to_bit(");
- strcat(lvt_buf, lvt_names[i].enum_name);
- strcat(lvt_buf, ")");
- or = 1;
- }
- }
-
- return lvt_buf;
-}
-
-static void print_def(struct arg_def *def, int usage)
-{
- int val_enum;
- int lvt_enum;
- int sep = 0;
- int i;
-
- for (val_enum = 0; val_enum < VAL_COUNT; val_enum++) {
- if (def->val_bits & val_enum_to_bit(val_enum)) {
-
- if (val_enum == conststr_VAL)
- printf("%s", def->str);
-
- else if (val_enum == constnum_VAL)
- printf("%llu", (unsigned long long)def->num);
-
- else {
- if (sep) printf("|");
-
- if (!usage || !val_names[val_enum].usage)
- printf("%s", val_names[val_enum].name);
- else
- printf("%s", val_names[val_enum].usage);
-
- sep = 1;
- }
-
- if (val_enum == lv_VAL && def->lvt_bits) {
- for (lvt_enum = 1; lvt_enum < LVT_COUNT; lvt_enum++) {
- if (lvt_bit_is_set(def->lvt_bits, lvt_enum))
- printf("_%s", lvt_enum_to_name(lvt_enum));
- }
- }
-
- if ((val_enum == vg_VAL) && (def->flags & ARG_DEF_FLAG_NEW_VG))
- printf("_new");
- if ((val_enum == lv_VAL) && (def->flags & ARG_DEF_FLAG_NEW_LV))
- printf("_new");
- }
- }
-
- if (def->flags & ARG_DEF_FLAG_MAY_REPEAT)
- printf(" ...");
-}
-
-static int opt_arg_matches(struct opt_arg *oa1, struct opt_arg *oa2)
-{
- if (oa1->opt != oa2->opt)
- return 0;
-
- /* FIXME: some cases may need more specific val_bits checks */
- if (oa1->def.val_bits != oa2->def.val_bits)
- return 0;
-
- if (oa1->def.str && oa2->def.str && strcmp(oa1->def.str, oa2->def.str))
- return 0;
-
- if (oa1->def.num != oa2->def.num)
- return 0;
-
- /*
- * Do NOT compare lv_types because we are checking if two
- * command lines are ambiguous before the LV type is known.
- */
-
- return 1;
-}
-
-static int pos_arg_matches(struct pos_arg *pa1, struct pos_arg *pa2)
-{
- if (pa1->pos != pa2->pos)
- return 0;
-
- /* FIXME: some cases may need more specific val_bits checks */
- if (pa1->def.val_bits != pa2->def.val_bits)
- return 0;
-
- if (pa1->def.str && pa2->def.str && strcmp(pa1->def.str, pa2->def.str))
- return 0;
-
- if (pa1->def.num != pa2->def.num)
- return 0;
-
- /*
- * Do NOT compare lv_types because we are checking if two
- * command lines are ambiguous before the LV type is known.
- */
-
- return 1;
-}
-
-static const char *opt_to_enum_str(int opt)
-{
- return opt_names[opt].name;
-}
-
-static char *flags_to_str(int flags)
-{
- static char buf_flags[32];
-
- memset(buf_flags, 0, sizeof(buf_flags));
-
- if (flags & ARG_DEF_FLAG_MAY_REPEAT) {
- if (buf_flags[0])
- strcat(buf_flags, " | ");
- strcat(buf_flags, "ARG_DEF_FLAG_MAY_REPEAT");
- }
- if (flags & ARG_DEF_FLAG_NEW_VG) {
- if (buf_flags[0])
- strcat(buf_flags, " | ");
- strcat(buf_flags, "ARG_DEF_FLAG_NEW_VG");
- }
- if (flags & ARG_DEF_FLAG_NEW_LV) {
- if (buf_flags[0])
- strcat(buf_flags, " | ");
- strcat(buf_flags, "ARG_DEF_FLAG_NEW_LV");
- }
-
- return buf_flags;
-}
-
-static char *rule_to_define_str(int rule_type)
-{
- switch (rule_type) {
- case RULE_INVALID:
- return "RULE_INVALID";
- case RULE_REQUIRE:
- return "RULE_REQUIRE";
- }
-}
-
-static char *cmd_flags_to_str(uint32_t flags)
-{
- static char buf_cmd_flags[32];
-
- memset(buf_cmd_flags, 0, sizeof(buf_cmd_flags));
-
- if (flags & CMD_FLAG_SECONDARY_SYNTAX) {
- if (buf_cmd_flags[0])
- strcat(buf_cmd_flags, " | ");
- strcat(buf_cmd_flags, "CMD_FLAG_SECONDARY_SYNTAX");
- }
- if (flags & CMD_FLAG_ONE_REQUIRED_OPT) {
- if (buf_cmd_flags[0])
- strcat(buf_cmd_flags, " | ");
- strcat(buf_cmd_flags, "CMD_FLAG_ONE_REQUIRED_OPT");
- }
-
- return buf_cmd_flags;
-}
-
-static void print_usage_common(struct command *cmd)
-{
- struct cmd_name *cname;
- int i, sep, ro, rp, oo, op, opt_enum;
-
- if (!(cname = find_command_name(cmd->name)))
- return;
-
- sep = 0;
-
- /*
- * when there's more than one variant, options that
- * are common to all commands with a common name.
- */
-
- if (cname->variants < 2)
- goto all;
-
- for (opt_enum = 0; opt_enum < ARG_COUNT; opt_enum++) {
- if (!cname->common_options[opt_enum])
- continue;
-
- if (is_lvm_all_opt(opt_enum))
- continue;
-
- if (!sep) {
- printf("\n");
- printf("\" [");
- } else {
- printf(",");
- }
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- if (cmd->optional_opt_args[oo].opt != opt_enum)
- continue;
-
- printf(" %s", opt_names[opt_enum].long_opt);
- if (cmd->optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def(&cmd->optional_opt_args[oo].def, 1);
- }
- sep = 1;
- break;
- }
- }
-
- all:
- /* options that are common to all lvm commands */
-
- for (oo = 0; oo < lvm_all.oo_count; oo++) {
- opt_enum = lvm_all.optional_opt_args[oo].opt;
-
- if (!sep) {
- printf("\n");
- printf("\" [");
- } else {
- printf(",");
- }
-
- printf(" %s", opt_names[opt_enum].long_opt);
- if (lvm_all.optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def(&lvm_all.optional_opt_args[oo].def, 1);
- }
- sep = 1;
- }
-
- printf(" ]\"");
- printf(";\n");
-}
-
-static void print_usage(struct command *cmd)
-{
- struct cmd_name *cname;
- int onereq = (cmd->cmd_flags & CMD_FLAG_ONE_REQUIRED_OPT) ? 1 : 0;
- int i, sep, ro, rp, oo, op, opt_enum;
-
- if (!(cname = find_command_name(cmd->name)))
- return;
-
- printf("\"%s", cmd->name);
-
- if (cmd->ro_count) {
- if (onereq)
- printf(" (");
- for (ro = 0; ro < cmd->ro_count; ro++) {
- if (ro && onereq)
- printf(",");
- printf(" %s", opt_names[cmd->required_opt_args[ro].opt].long_opt);
-
- if (cmd->required_opt_args[ro].def.val_bits) {
- printf(" ");
- print_def(&cmd->required_opt_args[ro].def, 1);
- }
- }
- if (onereq)
- printf(" )");
- }
-
- if (cmd->rp_count) {
- for (rp = 0; rp < cmd->rp_count; rp++) {
- if (cmd->required_pos_args[rp].def.val_bits) {
- printf(" ");
- print_def(&cmd->required_pos_args[rp].def, 1);
- }
- }
- }
-
- printf("\"");
-
- oo_count:
- if (!cmd->oo_count)
- goto op_count;
-
- sep = 0;
-
- if (cmd->oo_count) {
- printf("\n");
- printf("\" [");
-
- for (oo = 0; oo < cmd->oo_count; oo++) {
- opt_enum = cmd->optional_opt_args[oo].opt;
-
- /*
- * Skip common opts which are in the usage_common string.
- * The common opts are those in lvm_all and in
- * cname->common_options.
- */
-
- if (is_lvm_all_opt(opt_enum))
- continue;
-
- if ((cname->variants > 1) && cname->common_options[opt_enum])
- continue;
-
- if (sep)
- printf(",");
-
- printf(" %s", opt_names[opt_enum].long_opt);
- if (cmd->optional_opt_args[oo].def.val_bits) {
- printf(" ");
- print_def(&cmd->optional_opt_args[oo].def, 1);
- }
- sep = 1;
- }
-
- if (sep)
- printf(",");
- printf(" COMMON_OPTIONS");
- printf(" ]\"");
- }
-
- op_count:
- if (!cmd->op_count)
- goto done;
-
- printf("\n");
- printf("\" [");
-
- if (cmd->op_count) {
- for (op = 0; op < cmd->op_count; op++) {
- if (cmd->optional_pos_args[op].def.val_bits) {
- printf(" ");
- print_def(&cmd->optional_pos_args[op].def, 1);
- }
- }
- }
-
- printf(" ]\"");
-
- done:
- printf(";\n");
-}
-
-void print_header_struct(void)
-{
- struct command *cmd;
- int i, j, ro, rp, oo, op, ru, ruo, io;
-
- printf("/* Do not edit. This file is generated by tools/create-commands */\n");
- printf("/* using command definitions from tools/command-lines.in */\n");
- printf("\n");
-
- for (i = 0; i < cmd_count; i++) {
- cmd = &cmd_array[i];
-
- printf("commands[%d].name = \"%s\";\n", i, cmd->name);
- printf("commands[%d].command_line_id = \"%s\";\n", i, cmd->command_line_id);
- printf("commands[%d].command_line_enum = %s_CMD;\n", i, cmd->command_line_id);
- printf("commands[%d].fn = %s;\n", i, cmd->name);
- printf("commands[%d].ro_count = %d;\n", i, cmd->ro_count);
- printf("commands[%d].rp_count = %d;\n", i, cmd->rp_count);
- printf("commands[%d].oo_count = %d;\n", i, cmd->oo_count);
- printf("commands[%d].op_count = %d;\n", i, cmd->op_count);
- printf("commands[%d].io_count = %d;\n", i, cmd->io_count);
- printf("commands[%d].rule_count = %d;\n", i, cmd->rule_count);
-
- if (cmd->cmd_flags)
- printf("commands[%d].cmd_flags = %s;\n", i, cmd_flags_to_str(cmd->cmd_flags));
- else
- printf("commands[%d].cmd_flags = 0;\n", i, cmd_flags_to_str(cmd->cmd_flags));
-
- printf("commands[%d].desc = \"%s\";\n", i, cmd->desc ?: "");
- printf("commands[%d].usage = ", i);
- print_usage(cmd);
-
- if (cmd->oo_count) {
- printf("commands[%d].usage_common = ", i);
- print_usage_common(cmd);
- } else {
- printf("commands[%d].usage_common = \"NULL\";\n", i);
- }
-
- if (cmd->ro_count) {
- for (ro = 0; ro < cmd->ro_count; ro++) {
- printf("commands[%d].required_opt_args[%d].opt = %s;\n",
- i, ro, opt_to_enum_str(cmd->required_opt_args[ro].opt));
-
- if (!cmd->required_opt_args[ro].def.val_bits)
- continue;
-
- printf("commands[%d].required_opt_args[%d].def.val_bits = %s;\n",
- i, ro, val_bits_to_str(cmd->required_opt_args[ro].def.val_bits));
-
- if (cmd->required_opt_args[ro].def.lvt_bits)
- printf("commands[%d].required_opt_args[%d].def.lvt_bits = %s;\n",
- i, ro, lvt_bits_to_str(cmd->required_opt_args[ro].def.lvt_bits));
-
- if (cmd->required_opt_args[ro].def.flags)
- printf("commands[%d].required_opt_args[%d].def.flags = %s;\n",
- i, ro, flags_to_str(cmd->required_opt_args[ro].def.flags));
-
- if (val_bit_is_set(cmd->required_opt_args[ro].def.val_bits, constnum_VAL))
- printf("commands[%d].required_opt_args[%d].def.num = %d;\n",
- i, ro, cmd->required_opt_args[ro].def.num);
-
- if (val_bit_is_set(cmd->required_opt_args[ro].def.val_bits, conststr_VAL))
- printf("commands[%d].required_opt_args[%d].def.str = \"%s\";\n",
- i, ro, cmd->required_opt_args[ro].def.str ?: "NULL");
- }
- }
-
- if (cmd->rp_count) {
- for (rp = 0; rp < cmd->rp_count; rp++) {
- printf("commands[%d].required_pos_args[%d].pos = %d;\n",
- i, rp, cmd->required_pos_args[rp].pos);
-
- if (!cmd->required_pos_args[rp].def.val_bits)
- continue;
-
- printf("commands[%d].required_pos_args[%d].def.val_bits = %s;\n",
- i, rp, val_bits_to_str(cmd->required_pos_args[rp].def.val_bits));
-
- if (cmd->required_pos_args[rp].def.lvt_bits)
- printf("commands[%d].required_pos_args[%d].def.lvt_bits = %s;\n",
- i, rp, lvt_bits_to_str(cmd->required_pos_args[rp].def.lvt_bits));
-
- if (cmd->required_pos_args[rp].def.flags)
- printf("commands[%d].required_pos_args[%d].def.flags = %s;\n",
- i, rp, flags_to_str(cmd->required_pos_args[rp].def.flags));
-
- if (val_bit_is_set(cmd->required_pos_args[rp].def.val_bits, constnum_VAL))
- printf("commands[%d].required_pos_args[%d].def.num = %d;\n",
- i, rp, cmd->required_pos_args[rp].def.num);
-
- if (val_bit_is_set(cmd->required_pos_args[rp].def.val_bits, conststr_VAL))
- printf("commands[%d].required_pos_args[%d].def.str = \"%s\";\n",
- i, rp, cmd->required_pos_args[rp].def.str ?: "NULL");
- }
- }
-
- if (cmd->oo_count) {
- for (oo = 0; oo < cmd->oo_count; oo++) {
- printf("commands[%d].optional_opt_args[%d].opt = %s;\n",
- i, oo, opt_to_enum_str(cmd->optional_opt_args[oo].opt));
-
- if (!cmd->optional_opt_args[oo].def.val_bits)
- continue;
-
- printf("commands[%d].optional_opt_args[%d].def.val_bits = %s;\n",
- i, oo, val_bits_to_str(cmd->optional_opt_args[oo].def.val_bits));
-
- if (cmd->optional_opt_args[oo].def.lvt_bits)
- printf("commands[%d].optional_opt_args[%d].def.lvt_bits = %s;\n",
- i, oo, lvt_bits_to_str(cmd->optional_opt_args[oo].def.lvt_bits));
-
- if (cmd->optional_opt_args[oo].def.flags)
- printf("commands[%d].optional_opt_args[%d].def.flags = %s;\n",
- i, oo, flags_to_str(cmd->optional_opt_args[oo].def.flags));
-
- if (val_bit_is_set(cmd->optional_opt_args[oo].def.val_bits, constnum_VAL))
- printf("commands[%d].optional_opt_args[%d].def.num = %d;\n",
- i, oo, cmd->optional_opt_args[oo].def.num);
-
- if (val_bit_is_set(cmd->optional_opt_args[oo].def.val_bits, conststr_VAL))
- printf("commands[%d].optional_opt_args[%d].def.str = \"%s\";\n",
- i, oo, cmd->optional_opt_args[oo].def.str ?: "NULL");
- }
- }
-
- if (cmd->io_count) {
- for (io = 0; io < cmd->io_count; io++) {
- printf("commands[%d].ignore_opt_args[%d].opt = %s;\n",
- i, io, opt_to_enum_str(cmd->ignore_opt_args[io].opt));
-
- if (!cmd->ignore_opt_args[io].def.val_bits)
- continue;
-
- printf("commands[%d].ignore_opt_args[%d].def.val_bits = %s;\n",
- i, io, val_bits_to_str(cmd->ignore_opt_args[io].def.val_bits));
-
- if (cmd->ignore_opt_args[io].def.lvt_bits)
- printf("commands[%d].ignore_opt_args[%d].def.lvt_bits = %s;\n",
- i, io, lvt_bits_to_str(cmd->ignore_opt_args[io].def.lvt_bits));
-
- if (cmd->ignore_opt_args[io].def.flags)
- printf("commands[%d].ignore_opt_args[%d].def.flags = %s;\n",
- i, io, flags_to_str(cmd->ignore_opt_args[io].def.flags));
-
- if (val_bit_is_set(cmd->ignore_opt_args[io].def.val_bits, constnum_VAL))
- printf("commands[%d].ignore_opt_args[%d].def.num = %d;\n",
- i, io, cmd->ignore_opt_args[io].def.num);
-
- if (val_bit_is_set(cmd->ignore_opt_args[io].def.val_bits, conststr_VAL))
- printf("commands[%d].ignore_opt_args[%d].def.str = \"%s\";\n",
- i, io, cmd->ignore_opt_args[io].def.str ?: "NULL");
- }
- }
-
- if (cmd->op_count) {
- for (op = 0; op < cmd->op_count; op++) {
- printf("commands[%d].optional_pos_args[%d].pos = %d;\n",
- i, op, cmd->optional_pos_args[op].pos);
-
- if (!cmd->optional_pos_args[op].def.val_bits)
- continue;
-
- printf("commands[%d].optional_pos_args[%d].def.val_bits = %s;\n",
- i, op, val_bits_to_str(cmd->optional_pos_args[op].def.val_bits));
-
- if (cmd->optional_pos_args[op].def.lvt_bits)
- printf("commands[%d].optional_pos_args[%d].def.lvt_bits = %s;\n",
- i, op, lvt_bits_to_str(cmd->optional_pos_args[op].def.lvt_bits));
-
- if (cmd->optional_pos_args[op].def.flags)
- printf("commands[%d].optional_pos_args[%d].def.flags = %s;\n",
- i, op, flags_to_str(cmd->optional_pos_args[op].def.flags));
-
- if (val_bit_is_set(cmd->optional_pos_args[op].def.val_bits, constnum_VAL))
- printf("commands[%d].optional_pos_args[%d].def.num = %d;\n",
- i, op, cmd->optional_pos_args[op].def.num);
-
- if (val_bit_is_set(cmd->optional_pos_args[op].def.val_bits, conststr_VAL))
- printf("commands[%d].optional_pos_args[%d].def.str = \"%s\";\n",
- i, op, cmd->optional_pos_args[op].def.str ?: "NULL");
- }
- }
-
- if (cmd->rule_count) {
- for (ru = 0; ru < cmd->rule_count; ru++) {
-
- printf("commands[%d].rules[%d].opts_count = %d;\n", i, ru, cmd->rules[ru].opts_count);
-
- if (cmd->rules[ru].opts_count) {
- printf("static int _command%d_rule%d_opts[] = { ", i, ru);
- for (ruo = 0; ruo < cmd->rules[ru].opts_count; ruo++) {
- if (ruo)
- printf(", ");
- printf("%s", opt_to_enum_str(cmd->rules[ru].opts[ruo]));
- }
- printf(" };\n");
- printf("commands[%d].rules[%d].opts = _command%d_rule%d_opts;\n", i, ru, i, ru);
- } else {
- printf("commands[%d].rules[%d].opts = NULL;\n", i, ru);
- }
-
- printf("commands[%d].rules[%d].check_opts_count = %d;\n", i, ru, cmd->rules[ru].check_opts_count);
-
- if (cmd->rules[ru].check_opts_count) {
- printf("static int _command%d_rule%d_check_opts[] = { ", i, ru);
- for (ruo = 0; ruo < cmd->rules[ru].check_opts_count; ruo++) {
- if (ruo)
- printf(",");
- printf("%s ", opt_to_enum_str(cmd->rules[ru].check_opts[ruo]));
- }
- printf(" };\n");
- printf("commands[%d].rules[%d].check_opts = _command%d_rule%d_check_opts;\n", i, ru, i, ru);
- } else {
- printf("commands[%d].rules[%d].check_opts = NULL;\n", i, ru);
- }
-
- printf("commands[%d].rules[%d].lvt_bits = %s;\n", i, ru,
- cmd->rules[ru].lvt_bits ? lvt_bits_to_str(cmd->rules[ru].lvt_bits) : "0");
-
- printf("commands[%d].rules[%d].lvp_bits = %s;\n", i, ru,
- cmd->rules[ru].lvp_bits ? lvp_bits_to_str(cmd->rules[ru].lvp_bits) : "0");
-
- printf("commands[%d].rules[%d].rule = %s;\n", i, ru,
- rule_to_define_str(cmd->rules[ru].rule));
-
- printf("commands[%d].rules[%d].check_lvt_bits = %s;\n", i, ru,
- cmd->rules[ru].check_lvt_bits ? lvt_bits_to_str(cmd->rules[ru].check_lvt_bits) : "0");
-
- printf("commands[%d].rules[%d].check_lvp_bits = %s;\n", i, ru,
- cmd->rules[ru].check_lvp_bits ? lvp_bits_to_str(cmd->rules[ru].check_lvp_bits) : "0");
- }
- }
-
- printf("\n");
- }
-}
-
-void print_header_count(void)
-{
- struct command *cmd;
- int i, j;
-
- printf("/* Do not edit. This file is generated by tools/create-commands */\n");
- printf("/* using command definitions from tools/command-lines.in */\n");
- printf("#define COMMAND_COUNT %d\n", cmd_count);
-
- printf("enum {\n");
- printf("\tno_CMD,\n"); /* enum value 0 is not used */
-
- for (i = 0; i < cmd_count; i++) {
- cmd = &cmd_array[i];
-
- if (!cmd->command_line_id) {
- printf("Missing ID: at %d\n", i);
- exit(1);
- }
-
- for (j = 0; j < i; j++) {
- if (!strcmp(cmd->command_line_id, cmd_array[j].command_line_id))
- goto next;
- }
-
- printf("\t%s_CMD,\n", cmd->command_line_id);
- next:
- ;
- }
- printf("\tCOMMAND_ID_COUNT,\n");
- printf("};\n");
-}
-
-struct cmd_pair {
- int i, j;
-};
-
-void print_ambiguous(void)
-{
- struct command *cmd, *dup;
- struct cmd_pair dups[64] = { 0 };
- int found = 0;
- int i, j, f, ro, rp;
-
- for (i = 0; i < cmd_count; i++) {
- cmd = &cmd_array[i];
-
- for (j = 0; j < cmd_count; j++) {
- dup = &cmd_array[j];
-
- if (i == j)
- continue;
- if (strcmp(cmd->name, dup->name))
- continue;
- if (cmd->ro_count != dup->ro_count)
- continue;
- if (cmd->rp_count != dup->rp_count)
- continue;
-
- for (ro = 0; ro < cmd->ro_count; ro++) {
- if (!opt_arg_matches(&cmd->required_opt_args[ro],
- &dup->required_opt_args[ro]))
- goto next;
- }
-
- for (rp = 0; rp < cmd->rp_count; rp++) {
- if (!pos_arg_matches(&cmd->required_pos_args[rp],
- &dup->required_pos_args[rp]))
- goto next;
- }
-
- for (f = 0; f < found; f++) {
- if ((dups[f].i == j) && (dups[f].j == i))
- goto next;
- }
-
- printf("Ambiguous commands %d and %d:\n", i, j);
- print_usage(cmd);
- print_usage(dup);
- printf("\n");
-
- dups[found].i = i;
- dups[found].j = j;
- found++;
-next:
- ;
- }
- }
-}
-
diff --git a/tools/ccmd.h b/tools/ccmd.h
deleted file mode 100644
index 1e18125..0000000
--- a/tools/ccmd.h
+++ /dev/null
@@ -1,144 +0,0 @@
-
-#ifndef __CCMD_H__
-#define __CCMD_H__
-
-/* needed to include args.h */
-#define ARG_COUNTABLE 0x00000001
-#define ARG_GROUPABLE 0x00000002
-struct cmd_context;
-struct arg_values;
-
-/* needed to include args.h */
-static inline int yes_no_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int activation_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int cachemode_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int discards_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int mirrorlog_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int size_kb_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int size_mb_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int size_mb_arg_with_percent(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int int_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int uint32_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int int_arg_with_sign(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int int_arg_with_sign_and_percent(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int major_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int minor_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int string_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int tag_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int permission_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int metadatatype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int units_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int segtype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int alloc_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int locktype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int readahead_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
-static inline int vgmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int pvmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int polloperation_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int writemostly_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int syncaction_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int reportformat_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int configreport_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-static inline int configtype_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
-
-/* also see arg_props in tools.h and args.h */
-struct opt_name {
- const char *name; /* "foo_ARG" */
- int opt_enum; /* foo_ARG */
- const char short_opt; /* -f */
- char _padding[7];
- const char *long_opt; /* --foo */
- int val_enum; /* xyz_VAL when --foo takes a val like "--foo xyz" */
- uint32_t unused1;
- uint32_t unused2;
- const char *desc;
-};
-
-/* also see val_props in tools.h and vals.h */
-struct val_name {
- const char *enum_name; /* "foo_VAL" */
- int val_enum; /* foo_VAL */
- int (*fn) (struct cmd_context *cmd, struct arg_values *av); /* foo_arg() */
- const char *name; /* FooVal */
- const char *usage;
-};
-
-/* also see lv_props in tools.h and lv_props.h */
-struct lvp_name {
- const char *enum_name; /* "is_foo_LVP" */
- int lvp_enum; /* is_foo_LVP */
- const char *name; /* "lv_is_foo" */
-};
-
-/* also see lv_types in tools.h and lv_types.h */
-struct lvt_name {
- const char *enum_name; /* "foo_LVT" */
- int lvt_enum; /* foo_LVT */
- const char *name; /* "foo" */
-};
-
-/* create foo_VAL enums for option and position values */
-
-enum {
-#define val(a, b, c, d) a ,
-#include "vals.h"
-#undef val
-};
-
-/* create foo_ARG enums for --option's */
-
-enum {
-#define arg(a, b, c, d, e, f, g) a ,
-#include "args.h"
-#undef arg
-};
-
-/* create foo_LVP enums for LV properties */
-
-enum {
-#define lvp(a, b, c) a,
-#include "lv_props.h"
-#undef lvp
-};
-
-/* create foo_LVT enums for LV types */
-
-enum {
-#define lvt(a, b, c) a,
-#include "lv_types.h"
-#undef lvt
-};
-
-/* one for each command name, see cmd_names[] */
-
-#define MAX_CMD_NAMES 128
-struct cmd_name {
- const char *name;
- const char *desc;
- int common_options[ARG_COUNT + 1]; /* options common to all defs */
- int all_options[ARG_COUNT + 1]; /* union of options from all defs */
- int variants; /* number of command defs with this command name */
- int variant_has_ro; /* do variants use required_opt_args ? */
- int variant_has_rp; /* do variants use required_pos_args ? */
- int variant_has_oo; /* do variants use optional_opt_args ? */
- int variant_has_op; /* do variants use optional_pos_args ? */
-};
-
-/* struct command */
-
-#include "command.h"
-
-/* one for each command defininition (command-lines.in as struct command) */
-
-#define MAX_CMDS 256
-int cmd_count;
-struct command cmd_array[MAX_CMDS];
-
-#define MAX_LINE 1024
-#define MAX_LINE_ARGC 256
-
-#define DESC_LINE 256
-
-#endif
-
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 4cc51fe..30573f4 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -1,12 +1,15 @@
+# Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
+# Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved.
#
-# When this file is changed, tools/command-lines.h
-# and tools/command-lines-count.h must be regenerated
-# with:
+# This file is part of LVM2.
#
-# tools/create-commands --output count tools/command-lines.in > tools/command-lines-count.h
-# tools/create-commands --output struct tools/command-lines.in > tools/command-lines.h
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU Lesser General Public License v.2.1.
#
-
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Syntax
#
@@ -261,7 +264,7 @@ RULE: --permission not lv_is_external_origin lv_is_raid_metadata lv_is_raid_imag
RULE: --alloc --contiguous --metadataprofile --permission --persistent --profile --readahead not lv_is_thick_origin
RULE: --alloc --discards --zero --cachemode --cachepolicy --cachesettings not lv_is_partial
-# It's unfortunate that acativate needs to be optionally allowed here,
+# It's unfortunate that activate needs to be optionally allowed here,
# like above, it was previouly allowed in combination.
lvchange --resync VG|LV_raid_mirror|Tag|Select ...
diff --git a/tools/command.c b/tools/command.c
new file mode 100644
index 0000000..59c9ea0
--- /dev/null
+++ b/tools/command.c
@@ -0,0 +1,2694 @@
+/*
+ * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
+ * Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved.
+ *
+ * This file is part of LVM2.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License v.2.1.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <asm/types.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <limits.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <sched.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <getopt.h>
+
+/*
+ * This file can be compiled by itself as a man page generator.
+ */
+#ifdef MAN_PAGE_GENERATOR
+
+#define log_error(fmt, args...) \
+do { \
+ printf(fmt "\n", ##args); \
+} while (0)
+
+/* needed to include args.h */
+#define ARG_COUNTABLE 0x00000001
+#define ARG_GROUPABLE 0x00000002
+struct cmd_context;
+struct arg_values;
+
+/* needed to include args.h */
+static inline int yes_no_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int activation_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int cachemode_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int discards_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int mirrorlog_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int size_kb_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int size_mb_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int size_mb_arg_with_percent(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int int_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int uint32_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int int_arg_with_sign(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int int_arg_with_sign_and_percent(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int major_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int minor_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int string_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int tag_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int permission_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int metadatatype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int units_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int segtype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int alloc_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int locktype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int readahead_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
+static inline int vgmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int pvmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int polloperation_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int writemostly_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int syncaction_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int reportformat_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int configreport_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+static inline int configtype_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
+
+/* needed to include commands.h when building man page generator */
+#define CACHE_VGMETADATA 0x00000001
+#define PERMITTED_READ_ONLY 0x00000002
+#define ALL_VGS_IS_DEFAULT 0x00000004
+#define ENABLE_ALL_DEVS 0x00000008
+#define ALLOW_UUID_AS_NAME 0x00000010
+#define LOCKD_VG_SH 0x00000020
+#define NO_METADATA_PROCESSING 0x00000040
+#define REQUIRES_FULL_LABEL_SCAN 0x00000080
+#define MUST_USE_ALL_ARGS 0x00000100
+#define NO_LVMETAD_AUTOSCAN 0x00000200
+#define ENABLE_DUPLICATE_DEVS 0x00000400
+#define DISALLOW_TAG_ARGS 0x00000800
+#define GET_VGNAME_FROM_OPTIONS 0x00001000
+
+/* create foo_CMD enums for command def ID's in command-lines.in */
+
+enum {
+#define cmd(a, b) a ,
+#include "cmds.h"
+#undef cmd
+};
+
+/* create foo_VAL enums for option and position values */
+
+enum {
+#define val(a, b, c, d) a ,
+#include "vals.h"
+#undef val
+};
+
+/* create foo_ARG enums for --option's */
+
+enum {
+#define arg(a, b, c, d, e, f, g) a ,
+#include "args.h"
+#undef arg
+};
+
+/* create foo_LVP enums for LV properties */
+
+enum {
+#define lvp(a, b, c) a,
+#include "lv_props.h"
+#undef lvp
+};
+
+/* create foo_LVT enums for LV types */
+
+enum {
+#define lvt(a, b, c) a,
+#include "lv_types.h"
+#undef lvt
+};
+
+#else
+
+#include "tools.h"
+
+#endif
+
+#include "command.h" /* defines struct command */
+#include "command-count.h" /* defines COMMAND_COUNT */
+
+
+/* see opt_names[] below, also see arg_props[] in tools.h and args.h */
+
+struct opt_name {
+ const char *name; /* "foo_ARG" */
+ int opt_enum; /* foo_ARG */
+ const char short_opt; /* -f */
+ char _padding[7];
+ const char *long_opt; /* --foo */
+ int val_enum; /* xyz_VAL when --foo takes a val like "--foo xyz" */
+ uint32_t unused1;
+ uint32_t unused2;
+ const char *desc;
+};
+
+/* see val_names[] below, also see val_props[] in tools.h and vals.h */
+
+struct val_name {
+ const char *enum_name; /* "foo_VAL" */
+ int val_enum; /* foo_VAL */
+ int (*fn) (struct cmd_context *cmd, struct arg_values *av); /* foo_arg() */
+ const char *name; /* FooVal */
+ const char *usage;
+};
+
+/* see lvp_names[] below, also see lv_props[] in tools.h and lv_props.h */
+
+struct lvp_name {
+ const char *enum_name; /* "is_foo_LVP" */
+ int lvp_enum; /* is_foo_LVP */
+ const char *name; /* "lv_is_foo" */
+};
+
+/* see lvt_names[] below, also see lv_types[] in tools.h and lv_types.h */
+
+struct lvt_name {
+ const char *enum_name; /* "foo_LVT" */
+ int lvt_enum; /* foo_LVT */
+ const char *name; /* "foo" */
+};
+
+/* see cmd_names[] below, one for each unique "ID" in command-lines.in */
+
+struct cmd_name {
+ const char *enum_name; /* "foo_CMD" */
+ int cmd_enum; /* foo_CMD */
+ const char *name; /* "foo" from string after ID: */
+};
+
+/* create table of value names, e.g. String, and corresponding enum from vals.h */
+
+struct val_name val_names[VAL_COUNT + 1] = {
+#define val(a, b, c, d) { # a, a, b, c, d },
+#include "vals.h"
+#undef val
+};
+
+/* create table of option names, e.g. --foo, and corresponding enum from args.h */
+
+struct opt_name opt_names[ARG_COUNT + 1] = {
+#define arg(a, b, c, d, e, f, g) { # a, a, b, "", "--" c, d, e, f, g },
+#include "args.h"
+#undef arg
+};
+
+/* create table of lv property names, e.g. lv_is_foo, and corresponding enum from lv_props.h */
+
+struct lvp_name lvp_names[LVP_COUNT + 1] = {
+#define lvp(a, b, c) { # a, a, b },
+#include "lv_props.h"
+#undef lvp
+};
+
+/* create table of lv type names, e.g. linear and corresponding enum from lv_types.h */
+
+struct lvt_name lvt_names[LVT_COUNT + 1] = {
+#define lvt(a, b, c) { # a, a, b },
+#include "lv_types.h"
+#undef lvt
+};
+
+/* create table of command IDs */
+
+struct cmd_name cmd_names[CMD_COUNT + 1] = {
+#define cmd(a, b) { # a, a, # b },
+#include "cmds.h"
+#undef cmd
+};
+
+/*
+ * command_names[] and commands[] are defined in lvmcmdline.c when building lvm,
+ * but need to be defined here when building the stand-alone man page generator.
+ */
+
+#ifdef MAN_PAGE_GENERATOR
+struct command_name command_names[MAX_COMMAND_NAMES] = {
+#define xx(a, b, c...) { # a, b, c },
+#include "commands.h"
+#undef xx
+};
+struct command commands[COMMAND_COUNT];
+#else
+extern struct command_name command_names[MAX_COMMAND_NAMES]; /* defined in lvmcmdline.c */
+extern struct command commands[COMMAND_COUNT]; /* defined in lvmcmdline.c */
+#endif
+
+/* array of pointers into opt_names[] that is sorted alphabetically (by long opt name) */
+
+struct opt_name *opt_names_alpha[ARG_COUNT + 1];
+
+/* lvm_all is for recording options that are common for all lvm commands */
+
+struct command lvm_all;
+
+/* saves OO_FOO lines (groups of optional options) to include in multiple defs */
+
+static int oo_line_count;
+#define MAX_OO_LINES 256
+
+struct oo_line {
+ char *name;
+ char *line;
+};
+static struct oo_line oo_lines[MAX_OO_LINES];
+
+#define REQUIRED 1 /* required option */
+#define OPTIONAL 0 /* optional option */
+#define IGNORE -1 /* ignore option */
+
+#define MAX_LINE 1024
+#define MAX_LINE_ARGC 256
+#define DESC_LINE 1024
+
+/*
+ * Contains _command_input[] which is command-lines.in with comments
+ * removed and wrapped as a string. The _command_input[] string is
+ * used to populate commands[].
+ */
+#include "command-lines-input.h"
+
+static void add_optional_opt_line(struct command *cmd, int argc, char *argv[]);
+
+/*
+ * modifies buf, replacing the sep characters with \0
+ * argv pointers point to positions in buf
+ */
+
+static char *split_line(char *buf, int *argc, char **argv, char sep)
+{
+ char *p = buf, *rp = NULL;
+ int i;
+
+ argv[0] = p;
+
+ for (i = 1; i < MAX_LINE_ARGC; i++) {
+ p = strchr(buf, sep);
+ if (!p)
+ break;
+ *p = '\0';
+
+ argv[i] = p + 1;
+ buf = p + 1;
+ }
+ *argc = i;
+
+ /* we ended by hitting \0, return the point following that */
+ if (!rp)
+ rp = strchr(buf, '\0') + 1;
+
+ return rp;
+}
+
+/* convert value string, e.g. Number, to foo_VAL enum */
+
+static int val_str_to_num(char *str)
+{
+ char name[32] = { 0 };
+ char *new;
+ int i;
+
+ /* compare the name before any suffix like _new or _<lvtype> */
+
+ strncpy(name, str, 31);
+ if ((new = strstr(name, "_")))
+ *new = '\0';
+
+ for (i = 0; i < VAL_COUNT; i++) {
+ if (!val_names[i].name)
+ break;
+ if (!strncmp(name, val_names[i].name, strlen(val_names[i].name)))
+ return val_names[i].val_enum;
+ }
+
+ return 0;
+}
+
+/* convert "--option" to foo_ARG enum */
+
+static int opt_str_to_num(char *str)
+{
+ char long_name[32];
+ char *p;
+ int i;
+
+ /*
+ * --foo_long means there are two args entries
+ * for --foo, one with a short option and one
+ * without, and we want the one without the
+ * short option.
+ */
+ if (strstr(str, "_long")) {
+ strcpy(long_name, str);
+ p = strstr(long_name, "_long");
+ *p = '\0';
+
+ for (i = 0; i < ARG_COUNT; i++) {
+ if (!opt_names[i].long_opt)
+ continue;
+ /* skip anything with a short opt */
+ if (opt_names[i].short_opt)
+ continue;
+ if (!strcmp(opt_names[i].long_opt, long_name))
+ return opt_names[i].opt_enum;
+ }
+
+ log_error("Parsing command defs: unknown opt str: %s %s", str, long_name);
+ exit(EXIT_FAILURE);
+ }
+
+ for (i = 0; i < ARG_COUNT; i++) {
+ if (!opt_names[i].long_opt)
+ continue;
+ /* These are only selected using --foo_long */
+ if (strstr(opt_names[i].name, "_long_ARG"))
+ continue;
+ if (!strcmp(opt_names[i].long_opt, str))
+ return opt_names[i].opt_enum;
+ }
+
+ log_error("Parsing command defs: unknown opt str: \"%s\"", str);
+ exit(EXIT_FAILURE);
+}
+
+/* "foo" string to foo_CMD int */
+
+int command_id_to_enum(const char *str)
+{
+ int i;
+
+ for (i = 1; i < CMD_COUNT; i++) {
+ if (!strcmp(str, cmd_names[i].name))
+ return cmd_names[i].cmd_enum;
+ }
+ log_error("Parsing command defs: unknown cmd name %s", str);
+ exit(EXIT_FAILURE);
+}
+
+/* "lv_is_prop" to is_prop_LVP */
+
+static int lvp_name_to_enum(char *str)
+{
+ int i;
+
+ for (i = 1; i < LVP_COUNT; i++) {
+ if (!strcmp(str, lvp_names[i].name))
+ return lvp_names[i].lvp_enum;
+ }
+ log_error("Parsing command defs: unknown lv property %s", str);
+ exit(EXIT_FAILURE);
+}
+
+/* "type" to type_LVT */
+
+static int lvt_name_to_enum(char *str)
+{
+ int i;
+
+ for (i = 1; i < LVT_COUNT; i++) {
+ if (!strcmp(str, lvt_names[i].name))
+ return lvt_names[i].lvt_enum;
+ }
+ log_error("Parsing command defs: unknown lv type %s", str);
+ exit(EXIT_FAILURE);
+}
+
+/* LV_<type> to <type>_LVT */
+
+static int lv_to_enum(char *name)
+{
+ return lvt_name_to_enum(name + 3);
+}
+
+/*
+ * LV_<type1>_<type2> to lvt_bits
+ *
+ * type1 to lvt_enum
+ * lvt_bits |= lvt_enum_to_bit(lvt_enum)
+ * type2 to lvt_enum
+ * lvt_bits |= lvt_enum_to_bit(lvt_enum)
+ */
+
+static uint64_t lv_to_bits(char *name)
+{
+ char buf[64];
+ char *argv[MAX_LINE_ARGC];
+ uint64_t lvt_bits = 0;
+ int lvt_enum;
+ int argc;
+ int i;
+
+ strcpy(buf, name);
+
+ split_line(buf, &argc, argv, '_');
+
+ /* 0 is "LV" */
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "new"))
+ continue;
+ lvt_enum = lvt_name_to_enum(argv[i]);
+ lvt_bits |= lvt_enum_to_bit(lvt_enum);
+ }
+
+ return lvt_bits;
+}
+
+static struct command_name *find_command_name(const char *name)
+{
+ int i;
+
+ for (i = 0; i < MAX_COMMAND_NAMES; i++) {
+ if (!command_names[i].name)
+ break;
+ if (!strcmp(command_names[i].name, name))
+ return &command_names[i];
+ }
+ return NULL;
+}
+
+static const char *is_command_name(char *str)
+{
+ int i;
+
+ for (i = 0; i < MAX_COMMAND_NAMES; i++) {
+ if (!command_names[i].name)
+ break;
+ if (!strcmp(command_names[i].name, str))
+ return command_names[i].name;
+ }
+ return NULL;
+}
+
+static int is_opt_name(char *str)
+{
+ if (!strncmp(str, "--", 2))
+ return 1;
+
+ if ((str[0] == '-') && (str[1] != '-')) {
+ log_error("Parsing command defs: options must be specified in long form: %s", str);
+ exit(EXIT_FAILURE);
+ }
+
+ return 0;
+}
+
+/*
+ * "Select" as a pos name means that the position
+ * can be empty if the --select option is used.
+ */
+
+static int is_pos_name(char *str)
+{
+ if (!strncmp(str, "VG", 2))
+ return 1;
+ if (!strncmp(str, "LV", 2))
+ return 1;
+ if (!strncmp(str, "PV", 2))
+ return 1;
+ if (!strncmp(str, "Tag", 3))
+ return 1;
+ if (!strncmp(str, "String", 6))
+ return 1;
+ if (!strncmp(str, "Select", 6))
+ return 1;
+ return 0;
+}
+
+static int is_oo_definition(char *str)
+{
+ if (!strncmp(str, "OO_", 3) && strstr(str, ":"))
+ return 1;
+ return 0;
+}
+
+static int is_oo_line(char *str)
+{
+ if (!strncmp(str, "OO:", 3))
+ return 1;
+ return 0;
+}
+
+static int is_io_line(char *str)
+{
+ if (!strncmp(str, "IO:", 3))
+ return 1;
+ return 0;
+}
+
+static int is_op_line(char *str)
+{
+ if (!strncmp(str, "OP:", 3))
+ return 1;
+ return 0;
+}
+
+static int is_desc_line(char *str)
+{
+ if (!strncmp(str, "DESC:", 5))
+ return 1;
+ return 0;
+}
+
+static int is_flags_line(char *str)
+{
+ if (!strncmp(str, "FLAGS:", 6))
+ return 1;
+ return 0;
+}
+
+static int is_rule_line(char *str)
+{
+ if (!strncmp(str, "RULE:", 5))
+ return 1;
+ return 0;
+}
+
+static int is_id_line(char *str)
+{
+ if (!strncmp(str, "ID:", 3))
+ return 1;
+ return 0;
+}
+
+/*
+ * Save a positional arg in a struct arg_def.
+ * Parse str for anything that can appear in a position,
+ * like VG, VG|LV, VG|LV_linear|LV_striped, etc.
+ */
+
+static void set_pos_def(struct command *cmd, char *str, struct arg_def *def)
+{
+ char *argv[MAX_LINE_ARGC];
+ int argc;
+ char *name;
+ int val_enum;
+ int i;
+
+ split_line(str, &argc, argv, '|');
+
+ for (i = 0; i < argc; i++) {
+ name = argv[i];
+
+ val_enum = val_str_to_num(name);
+
+ if (!val_enum) {
+ log_error("Parsing command defs: unknown pos arg: %s", name);
+ exit(EXIT_FAILURE);
+ }
+
+ def->val_bits |= val_enum_to_bit(val_enum);
+
+ if ((val_enum == lv_VAL) && strstr(name, "_"))
+ def->lvt_bits = lv_to_bits(name);
+
+ if (strstr(name, "_new")) {
+ if (val_enum == lv_VAL)
+ def->flags |= ARG_DEF_FLAG_NEW_LV;
+ else if (val_enum == vg_VAL)
+ def->flags |= ARG_DEF_FLAG_NEW_VG;
+ }
+ }
+}
+
+/*
+ * Save an option arg in a struct arg_def.
+ * Parse str for anything that can follow --option.
+ */
+
+static void set_opt_def(struct command *cmd, char *str, struct arg_def *def)
+{
+ char *argv[MAX_LINE_ARGC];
+ int argc;
+ char *name;
+ int val_enum;
+ int i;
+
+ split_line(str, &argc, argv, '|');
+
+ for (i = 0; i < argc; i++) {
+ name = argv[i];
+
+ val_enum = val_str_to_num(name);
+
+ if (!val_enum) {
+ /* a literal number or string */
+
+ if (isdigit(name[0]))
+ val_enum = constnum_VAL;
+
+ else if (isalpha(name[0]))
+ val_enum = conststr_VAL;
+
+ else {
+ log_error("Parsing command defs: unknown opt arg: %s", name);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+
+ def->val_bits |= val_enum_to_bit(val_enum);
+
+ if (val_enum == constnum_VAL)
+ def->num = (uint64_t)atoi(name);
+
+ if (val_enum == conststr_VAL)
+ def->str = strdup(name);
+
+ if (val_enum == lv_VAL) {
+ if (strstr(name, "_"))
+ def->lvt_bits = lv_to_bits(name);
+ }
+
+ if (strstr(name, "_new")) {
+ if (val_enum == lv_VAL)
+ def->flags |= ARG_DEF_FLAG_NEW_LV;
+ else if (val_enum == vg_VAL)
+ def->flags |= ARG_DEF_FLAG_NEW_VG;
+
+ }
+ }
+}
+
+/*
+ * Save a set of common options so they can be included in
+ * multiple command defs.
+ *
+ * OO_FOO: --opt1 ...
+ *
+ * oo->name = "OO_FOO";
+ * oo->line = "--opt1 ...";
+ */
+
+static void add_oo_definition_line(const char *name, const char *line)
+{
+ struct oo_line *oo;
+ char *colon;
+ char *start;
+
+ oo = &oo_lines[oo_line_count++];
+ oo->name = strdup(name);
+
+ if ((colon = strstr(oo->name, ":")))
+ *colon = '\0';
+ else {
+ log_error("Parsing command defs: invalid OO definition");
+ exit(EXIT_FAILURE);
+ }
+
+ start = strstr(line, ":") + 2;
+ oo->line = strdup(start);
+}
+
+/* Support OO_FOO: continuing on multiple lines. */
+
+static void append_oo_definition_line(const char *new_line)
+{
+ struct oo_line *oo;
+ char *old_line;
+ char *line;
+ int len;
+
+ oo = &oo_lines[oo_line_count-1];
+
+ old_line = oo->line;
+
+ /* +2 = 1 space between old and new + 1 terminating \0 */
+ len = strlen(old_line) + strlen(new_line) + 2;
+ line = malloc(len);
+ memset(line, 0, len);
+
+ strcat(line, old_line);
+ strcat(line, " ");
+ strcat(line, new_line);
+
+ free(oo->line);
+ oo->line = line;
+}
+
+/* Find a saved OO_FOO definition. */
+
+static char *get_oo_line(const char *str)
+{
+ char *name;
+ char *end;
+ char str2[64];
+ int i;
+
+ strcpy(str2, str);
+ if ((end = strstr(str2, ":")))
+ *end = '\0';
+ if ((end = strstr(str2, ",")))
+ *end = '\0';
+
+ for (i = 0; i < oo_line_count; i++) {
+ name = oo_lines[i].name;
+ if (!strcmp(name, str2))
+ return oo_lines[i].line;
+ }
+ return NULL;
+}
+
+/*
+ * Add optional_opt_args entries when OO_FOO appears on OO: line,
+ * i.e. include common options from an OO_FOO definition.
+ */
+
+static void include_optional_opt_args(struct command *cmd, const char *str)
+{
+ char *oo_line;
+ char *line;
+ char *line_argv[MAX_LINE_ARGC];
+ int line_argc;
+
+ if (!(oo_line = get_oo_line(str))) {
+ log_error("Parsing command defs: no OO line found for %s", str);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!(line = strdup(oo_line)))
+ exit(EXIT_FAILURE);
+
+ split_line(line, &line_argc, line_argv, ' ');
+ add_optional_opt_line(cmd, line_argc, line_argv);
+ free(line);
+}
+
+/*
+ * When an --option is seen, add a new opt_args entry for it.
+ * This function sets the opt_args.opt value for it.
+ */
+
+static void add_opt_arg(struct command *cmd, char *str, int *takes_arg, int required)
+{
+ char *comma;
+ int opt;
+
+ /* opt_arg.opt set here */
+ /* opt_arg.def will be set in update_prev_opt_arg() if needed */
+
+ if ((comma = strstr(str, ",")))
+ *comma = '\0';
+
+ /*
+ * Work around nasty hack where --uuid is used for both uuid_ARG
+ * and uuidstr_ARG. The input uses --uuidstr, where an actual
+ * command uses --uuid string.
+ */
+ if (!strcmp(str, "--uuidstr")) {
+ opt = uuidstr_ARG;
+ goto skip;
+ }
+
+ opt = opt_str_to_num(str);
+skip:
+ if (required > 0)
+ cmd->required_opt_args[cmd->ro_count++].opt = opt;
+ else if (!required)
+ cmd->optional_opt_args[cmd->oo_count++].opt = opt;
+ else if (required < 0)
+ cmd->ignore_opt_args[cmd->io_count++].opt = opt;
+ else
+ exit(EXIT_FAILURE);
+
+ *takes_arg = opt_names[opt].val_enum ? 1 : 0;
+}
+
+/*
+ * After --option has been seen, this function sets opt_args.def value
+ * for the value that appears after --option.
+ */
+
+static void update_prev_opt_arg(struct command *cmd, char *str, int required)
+{
+ struct arg_def def = { 0 };
+ char *comma;
+
+ if (str[0] == '-') {
+ log_error("Parsing command defs: option %s must be followed by an arg.", str);
+ exit(EXIT_FAILURE);
+ }
+
+ /* opt_arg.def set here */
+ /* opt_arg.opt was previously set in add_opt_arg() when --foo was read */
+
+ if ((comma = strstr(str, ",")))
+ *comma = '\0';
+
+ set_opt_def(cmd, str, &def);
+
+ if (required > 0)
+ cmd->required_opt_args[cmd->ro_count-1].def = def;
+ else if (!required)
+ cmd->optional_opt_args[cmd->oo_count-1].def = def;
+ else if (required < 0)
+ cmd->ignore_opt_args[cmd->io_count-1].def = def;
+ else
+ exit(EXIT_FAILURE);
+}
+
+/*
+ * When an position arg is seen, add a new pos_args entry for it.
+ * This function sets the pos_args.pos and pos_args.def.
+ */
+
+static void add_pos_arg(struct command *cmd, char *str, int required)
+{
+ struct arg_def def = { 0 };
+
+ /* pos_arg.pos and pos_arg.def are set here */
+
+ set_pos_def(cmd, str, &def);
+
+ if (required) {
+ cmd->required_pos_args[cmd->rp_count].pos = cmd->pos_count++;
+ cmd->required_pos_args[cmd->rp_count].def = def;
+ cmd->rp_count++;
+ } else {
+ cmd->optional_pos_args[cmd->op_count].pos = cmd->pos_count++;;
+ cmd->optional_pos_args[cmd->op_count].def = def;
+ cmd->op_count++;
+ }
+}
+
+/* Process something that follows a pos arg, which is not a new pos arg. */
+
+static void update_prev_pos_arg(struct command *cmd, char *str, int required)
+{
+ struct arg_def *def;
+
+ /* a previous pos_arg.def is modified here */
+
+ if (required)
+ def = &cmd->required_pos_args[cmd->rp_count-1].def;
+ else
+ def = &cmd->optional_pos_args[cmd->op_count-1].def;
+
+ if (!strcmp(str, "..."))
+ def->flags |= ARG_DEF_FLAG_MAY_REPEAT;
+ else {
+ log_error("Parsing command defs: unknown pos arg: %s", str);
+ exit(EXIT_FAILURE);
+ }
+}
+
+/* Process what follows OO:, which are the optional opt args for the cmd def. */
+
+static void add_optional_opt_line(struct command *cmd, int argc, char *argv[])
+{
+ int takes_arg;
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (!i && !strncmp(argv[i], "OO:", 3))
+ continue;
+ if (is_opt_name(argv[i]))
+ add_opt_arg(cmd, argv[i], &takes_arg, OPTIONAL);
+ else if (!strncmp(argv[i], "OO_", 3))
+ include_optional_opt_args(cmd, argv[i]);
+ else if (takes_arg)
+ update_prev_opt_arg(cmd, argv[i], OPTIONAL);
+ else {
+ log_error("Parsing command defs: can't parse argc %d argv %s prev %s",
+ i, argv[i], argv[i-1]);
+ exit(EXIT_FAILURE);
+ }
+ }
+}
+
+/* Process what follows IO:, which are the ignore options for the cmd def. */
+
+static void add_ignore_opt_line(struct command *cmd, int argc, char *argv[])
+{
+ int takes_arg;
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (!i && !strncmp(argv[i], "IO:", 3))
+ continue;
+ if (is_opt_name(argv[i]))
+ add_opt_arg(cmd, argv[i], &takes_arg, IGNORE);
+ else if (takes_arg)
+ update_prev_opt_arg(cmd, argv[i], IGNORE);
+ else {
+ log_error("Parsing command defs: can't parse argc %d argv %s prev %s",
+ i, argv[i], argv[i-1]);
+ exit(EXIT_FAILURE);
+ }
+ }
+}
+
+/* Process what follows OP:, which are optional pos args for the cmd def. */
+
+static void add_optional_pos_line(struct command *cmd, int argc, char *argv[])
+{
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (!i && !strncmp(argv[i], "OP:", 3))
+ continue;
+ if (is_pos_name(argv[i]))
+ add_pos_arg(cmd, argv[i], OPTIONAL);
+ else
+ update_prev_pos_arg(cmd, argv[i], OPTIONAL);
+ }
+}
+
+static void add_required_opt_line(struct command *cmd, int argc, char *argv[])
+{
+ int takes_arg;
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (is_opt_name(argv[i]))
+ add_opt_arg(cmd, argv[i], &takes_arg, REQUIRED);
+ else if (takes_arg)
+ update_prev_opt_arg(cmd, argv[i], REQUIRED);
+ else {
+ log_error("Parsing command defs: can't parse argc %d argv %s prev %s",
+ i, argv[i], argv[i-1]);
+ exit(EXIT_FAILURE);
+ }
+ }
+}
+
+/*
+ * Add to required_opt_args from an OO_FOO definition.
+ * (This is the special case of vgchange/lvchange where one
+ * optional option is required, and others are then optional.)
+ * The set of options from OO_FOO are saved in required_opt_args,
+ * and flag CMD_FLAG_ONE_REQUIRED_OPT is set on the cmd indicating
+ * this special case.
+ */
+
+static void include_required_opt_args(struct command *cmd, char *str)
+{
+ char *oo_line;
+ char *line;
+ char *line_argv[MAX_LINE_ARGC];
+ int line_argc;
+
+ if (!(oo_line = get_oo_line(str))) {
+ log_error("Parsing command defs: no OO line found for %s", str);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!(line = strdup(oo_line)))
+ exit(EXIT_FAILURE);
+
+ split_line(line, &line_argc, line_argv, ' ');
+ add_required_opt_line(cmd, line_argc, line_argv);
+ free(line);
+}
+
+/* Process what follows command_name, which are required opt/pos args. */
+
+static void add_required_line(struct command *cmd, int argc, char *argv[])
+{
+ int i;
+ int takes_arg;
+ int prev_was_opt = 0, prev_was_pos = 0;
+
+ /* argv[0] is command name */
+
+ for (i = 1; i < argc; i++) {
+
+ if (is_opt_name(argv[i])) {
+ /* add new required_opt_arg */
+ add_opt_arg(cmd, argv[i], &takes_arg, REQUIRED);
+ prev_was_opt = 1;
+ prev_was_pos = 0;
+
+ } else if (prev_was_opt && takes_arg) {
+ /* set value for previous required_opt_arg */
+ update_prev_opt_arg(cmd, argv[i], REQUIRED);
+ prev_was_opt = 0;
+ prev_was_pos = 0;
+
+ } else if (is_pos_name(argv[i])) {
+ /* add new required_pos_arg */
+ add_pos_arg(cmd, argv[i], REQUIRED);
+ prev_was_opt = 0;
+ prev_was_pos = 1;
+
+ } else if (!strncmp(argv[i], "OO_", 3)) {
+ /* one required_opt_arg is required, special case lv/vgchange */
+ cmd->cmd_flags |= CMD_FLAG_ONE_REQUIRED_OPT;
+ include_required_opt_args(cmd, argv[i]);
+
+ } else if (prev_was_pos) {
+ /* set property for previous required_pos_arg */
+ update_prev_pos_arg(cmd, argv[i], REQUIRED);
+ } else {
+ log_error("Parsing command defs: can't parse argc %d argv %s prev %s",
+ i, argv[i], argv[i-1]);
+ exit(EXIT_FAILURE);
+ }
+
+ }
+}
+
+static void add_flags(struct command *cmd, char *line)
+{
+ if (strstr(line, "SECONDARY_SYNTAX"))
+ cmd->cmd_flags |= CMD_FLAG_SECONDARY_SYNTAX;
+}
+
+#define MAX_RULE_OPTS 64
+
+static void add_rule(struct command *cmd, char *line)
+{
+ struct cmd_rule *rule;
+ char *line_argv[MAX_LINE_ARGC];
+ char *arg;
+ int line_argc;
+ int i, lvt_enum, lvp_enum;
+ int check = 0;
+
+ if (cmd->rule_count == CMD_MAX_RULES) {
+ log_error("Parsing command defs: too many rules for cmd");
+ exit(EXIT_FAILURE);
+ }
+
+ rule = &cmd->rules[cmd->rule_count++];
+
+ split_line(line, &line_argc, line_argv, ' ');
+
+ for (i = 0; i < line_argc; i++) {
+ arg = line_argv[i];
+
+ if (!strcmp(arg, "not")) {
+ rule->rule = RULE_INVALID;
+ check = 1;
+ }
+
+ else if (!strcmp(arg, "and")) {
+ rule->rule = RULE_REQUIRE;
+ check = 1;
+ }
+
+ else if (!strncmp(arg, "all", 3)) {
+ /* opt/lvt_bits/lvp_bits all remain 0 to mean all */
+ continue;
+ }
+
+ else if (!strncmp(arg, "--", 2)) {
+ if (!rule->opts) {
+ if (!(rule->opts = malloc(MAX_RULE_OPTS * sizeof(int)))) {
+ log_error("Parsing command defs: no mem");
+ exit(EXIT_FAILURE);
+ }
+ memset(rule->opts, 0, MAX_RULE_OPTS * sizeof(int));
+ }
+
+ if (!rule->check_opts) {
+ if (!(rule->check_opts = malloc(MAX_RULE_OPTS * sizeof(int)))) {
+ log_error("Parsing command defs: no mem");
+ exit(EXIT_FAILURE);
+ }
+ memset(rule->check_opts, 0, MAX_RULE_OPTS * sizeof(int));
+ }
+
+ if (check)
+ rule->check_opts[rule->check_opts_count++] = opt_str_to_num(arg);
+ else
+ rule->opts[rule->opts_count++] = opt_str_to_num(arg);
+ }
+
+ else if (!strncmp(arg, "LV_", 3)) {
+ lvt_enum = lv_to_enum(arg);
+
+ if (check)
+ rule->check_lvt_bits |= lvt_enum_to_bit(lvt_enum);
+ else
+ rule->lvt_bits |= lvt_enum_to_bit(lvt_enum);
+ }
+
+ else if (!strncmp(arg, "lv_is_", 6)) {
+ lvp_enum = lvp_name_to_enum(arg);
+
+ if (check)
+ rule->check_lvp_bits |= lvp_enum_to_bit(lvp_enum);
+ else
+ rule->lvp_bits |= lvp_enum_to_bit(lvp_enum);
+ }
+ }
+}
+
+/* The given option is common to all lvm commands (set in lvm_all). */
+
+static int is_lvm_all_opt(int opt)
+{
+ int oo;
+
+ for (oo = 0; oo < lvm_all.oo_count; oo++) {
+ if (lvm_all.optional_opt_args[oo].opt == opt)
+ return 1;
+ }
+ return 0;
+}
+
+/* Find common options for all variants of each command name. */
+
+static void factor_common_options(void)
+{
+ int cn, opt_enum, ci, oo, ro, found;
+ struct command *cmd;
+
+ for (cn = 0; cn < MAX_COMMAND_NAMES; cn++) {
+ if (!command_names[cn].name)
+ break;
+
+ for (ci = 0; ci < COMMAND_COUNT; ci++) {
+ cmd = &commands[ci];
+
+ if (strcmp(cmd->name, command_names[cn].name))
+ continue;
+
+ command_names[cn].variants++;
+ }
+
+ for (opt_enum = 0; opt_enum < ARG_COUNT; opt_enum++) {
+
+ for (ci = 0; ci < COMMAND_COUNT; ci++) {
+ cmd = &commands[ci];
+
+ if (strcmp(cmd->name, command_names[cn].name))
+ continue;
+
+ if (cmd->ro_count)
+ command_names[cn].variant_has_ro = 1;
+ if (cmd->rp_count)
+ command_names[cn].variant_has_rp = 1;
+ if (cmd->oo_count)
+ command_names[cn].variant_has_oo = 1;
+ if (cmd->op_count)
+ command_names[cn].variant_has_op = 1;
+
+ for (ro = 0; ro < cmd->ro_count; ro++) {
+ command_names[cn].all_options[cmd->required_opt_args[ro].opt] = 1;
+
+ if ((cmd->required_opt_args[ro].opt == size_ARG) && !strncmp(cmd->name, "lv", 2))
+ command_names[cn].all_options[extents_ARG] = 1;
+ }
+ for (oo = 0; oo < cmd->oo_count; oo++)
+ command_names[cn].all_options[cmd->optional_opt_args[oo].opt] = 1;
+
+ found = 0;
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ if (cmd->optional_opt_args[oo].opt == opt_enum) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found)
+ goto next_opt;
+ }
+
+ /* all commands starting with this name use this option */
+ command_names[cn].common_options[opt_enum] = 1;
+ next_opt:
+ ;
+ }
+ }
+}
+
+static int long_name_compare(const void *on1, const void *on2)
+{
+ struct opt_name **optname1 = (void *)on1;
+ struct opt_name **optname2 = (void *)on2;
+ return strcmp((*optname1)->long_opt + 2, (*optname2)->long_opt + 2);
+}
+
+/* Create list of option names for printing alphabetically. */
+
+static void create_opt_names_alpha(void)
+{
+ int i;
+
+ for (i = 0; i < ARG_COUNT; i++)
+ opt_names_alpha[i] = &opt_names[i];
+
+ qsort(opt_names_alpha, ARG_COUNT, sizeof(long), long_name_compare);
+}
+
+static int copy_line(char *line, int max_line, int *position)
+{
+ int p = *position;
+ int i = 0;
+
+ memset(line, 0, max_line);
+
+ while (1) {
+ line[i] = _command_input[p];
+ i++;
+ p++;
+
+ if (_command_input[p] == '\n') {
+ p++;
+ break;
+ }
+
+ if (i == (max_line - 1))
+ break;
+ }
+ *position = p;
+ return 1;
+}
+
+int define_commands(void)
+{
+ struct command *cmd;
+ char line[MAX_LINE];
+ char line_orig[MAX_LINE];
+ char *line_argv[MAX_LINE_ARGC];
+ const char *name;
+ char *n;
+ int line_argc;
+ int cmd_count = 0;
+ int prev_was_oo_def = 0;
+ int prev_was_oo = 0;
+ int prev_was_op = 0;
+ int copy_pos = 0;
+
+ create_opt_names_alpha();
+
+ /* Process each line of command-lines-input.h (from command-lines.in) */
+
+ while (copy_line(line, MAX_LINE, ©_pos)) {
+ if (line[0] == '\n')
+ break;
+
+ if ((n = strchr(line, '\n')))
+ *n = '\0';
+
+ memcpy(line_orig, line, sizeof(line));
+ split_line(line, &line_argc, line_argv, ' ');
+
+ if (!line_argc)
+ continue;
+
+ /* New cmd def begins: command_name <required opt/pos args> */
+ if ((name = is_command_name(line_argv[0]))) {
+ if (cmd_count >= COMMAND_COUNT) {
+ return 0;
+ }
+
+ /*
+ * FIXME: when running one specific command name,
+ * we can optimize by not parsing command defs
+ * that don't start with that command name.
+ */
+
+ cmd = &commands[cmd_count];
+ cmd->command_index = cmd_count;
+ cmd_count++;
+ cmd->name = strdup(name);
+ cmd->pos_count = 1;
+ add_required_line(cmd, line_argc, line_argv);
+
+ /* Every cmd gets the OO_ALL options */
+ include_optional_opt_args(cmd, "OO_ALL:");
+ continue;
+ }
+
+ /*
+ * All other kinds of lines are processed in the
+ * context of the existing command[].
+ */
+
+ if (is_desc_line(line_argv[0])) {
+ char *desc = strdup(line_orig);
+ if (cmd->desc) {
+ int newlen = strlen(cmd->desc) + strlen(desc) + 2;
+ char *newdesc = malloc(newlen);
+ memset(newdesc, 0, newlen);
+ snprintf(newdesc, newlen, "%s %s", cmd->desc, desc);
+ cmd->desc = newdesc;
+ free(desc);
+ } else
+ cmd->desc = desc;
+ continue;
+ }
+
+ if (is_flags_line(line_argv[0])) {
+ add_flags(cmd, line_orig);
+ continue;
+ }
+
+ if (is_rule_line(line_argv[0])) {
+ add_rule(cmd, line_orig);
+ continue;
+ }
+
+ if (is_id_line(line_argv[0])) {
+ cmd->command_id = strdup(line_argv[1]);
+ continue;
+ }
+
+ /* OO_FOO: ... */
+ if (is_oo_definition(line_argv[0])) {
+ add_oo_definition_line(line_argv[0], line_orig);
+ prev_was_oo_def = 1;
+ prev_was_oo = 0;
+ prev_was_op = 0;
+ continue;
+ }
+
+ /* OO: ... */
+ if (is_oo_line(line_argv[0])) {
+ add_optional_opt_line(cmd, line_argc, line_argv);
+ prev_was_oo_def = 0;
+ prev_was_oo = 1;
+ prev_was_op = 0;
+ continue;
+ }
+
+ /* OP: ... */
+ if (is_op_line(line_argv[0])) {
+ add_optional_pos_line(cmd, line_argc, line_argv);
+ prev_was_oo_def = 0;
+ prev_was_oo = 0;
+ prev_was_op = 1;
+ continue;
+ }
+
+ /* IO: ... */
+ if (is_io_line(line_argv[0])) {
+ add_ignore_opt_line(cmd, line_argc, line_argv);
+ prev_was_oo = 0;
+ prev_was_op = 0;
+ continue;
+ }
+
+ /* handle OO_FOO:, OO:, OP: continuing on multiple lines */
+
+ if (prev_was_oo_def) {
+ append_oo_definition_line(line_orig);
+ continue;
+ }
+
+ if (prev_was_oo) {
+ add_optional_opt_line(cmd, line_argc, line_argv);
+ continue;
+ }
+
+ if (prev_was_op) {
+ add_optional_pos_line(cmd, line_argc, line_argv);
+ continue;
+ }
+ }
+
+ /*
+ * For usage.
+ * Looks at all variants of each command name and figures out
+ * which options are common to all variants (for compact output)
+ */
+ factor_common_options();
+
+ /*
+ * For usage.
+ * Predefined string of options common to all commands
+ * (for compact output)
+ */
+ include_optional_opt_args(&lvm_all, "OO_USAGE_COMMON");
+
+ return 1;
+}
+
+/* type_LVT to "type" */
+
+static const char *lvt_enum_to_name(int lvt_enum)
+{
+ return lvt_names[lvt_enum].name;
+}
+
+static void _print_usage_description(struct command *cmd)
+{
+ const char *desc = cmd->desc;
+ char buf[MAX_LINE] = {0};
+ int di = 0;
+ int bi = 0;
+
+ for (di = 0; di < strlen(desc); di++) {
+ if (!strncmp(&desc[di], "DESC:", 5)) {
+ if (bi) {
+ buf[bi] = '\0';
+ printf(" %s\n", buf);
+ memset(buf, 0, sizeof(buf));
+ bi = 0;
+ }
+ /* skip DESC: */
+ di += 5;
+ continue;
+ }
+
+ if (!bi && desc[di] == ' ')
+ continue;
+
+ buf[bi++] = desc[di];
+
+ if (bi == (MAX_LINE - 1))
+ break;
+ }
+
+ if (bi) {
+ buf[bi] = '\0';
+ printf(" %s\n", buf);
+ }
+}
+
+static void print_usage_def(struct arg_def *def)
+{
+ int val_enum;
+ int lvt_enum;
+ int sep = 0;
+
+ for (val_enum = 0; val_enum < VAL_COUNT; val_enum++) {
+ if (def->val_bits & val_enum_to_bit(val_enum)) {
+
+ if (val_enum == conststr_VAL)
+ printf("%s", def->str);
+
+ else if (val_enum == constnum_VAL)
+ printf("%llu", (unsigned long long)def->num);
+
+ else {
+ if (sep) printf("|");
+
+ if (!val_names[val_enum].usage)
+ printf("%s", val_names[val_enum].name);
+ else
+ printf("%s", val_names[val_enum].usage);
+
+ sep = 1;
+ }
+
+ if (val_enum == lv_VAL && def->lvt_bits) {
+ for (lvt_enum = 1; lvt_enum < LVT_COUNT; lvt_enum++) {
+ if (lvt_bit_is_set(def->lvt_bits, lvt_enum))
+ printf("_%s", lvt_enum_to_name(lvt_enum));
+ }
+ }
+
+ if ((val_enum == vg_VAL) && (def->flags & ARG_DEF_FLAG_NEW_VG))
+ printf("_new");
+ if ((val_enum == lv_VAL) && (def->flags & ARG_DEF_FLAG_NEW_LV))
+ printf("_new");
+ }
+ }
+
+ if (def->flags & ARG_DEF_FLAG_MAY_REPEAT)
+ printf(" ...");
+}
+
+void print_usage(struct command *cmd)
+{
+ struct command_name *cname = find_command_name(cmd->name);
+ int onereq = (cmd->cmd_flags & CMD_FLAG_ONE_REQUIRED_OPT) ? 1 : 0;
+ int ro, rp, oo, op, opt_enum, first;
+
+ if (cmd->desc)
+ _print_usage_description(cmd);
+
+ printf(" %s", cmd->name);
+
+ if (cmd->ro_count) {
+ first = 1;
+
+ for (ro = 0; ro < cmd->ro_count; ro++) {
+ if (onereq) {
+ if (first)
+ printf("\n\t(");
+ else
+ printf(",\n\t ");
+ first = 0;
+ }
+
+ printf(" %s", opt_names[cmd->required_opt_args[ro].opt].long_opt);
+ if (cmd->required_opt_args[ro].def.val_bits) {
+ printf(" ");
+ print_usage_def(&cmd->required_opt_args[ro].def);
+ }
+ }
+ if (onereq)
+ printf(" )\n");
+ }
+
+ if (cmd->rp_count) {
+ if (onereq)
+ printf("\t");
+ for (rp = 0; rp < cmd->rp_count; rp++) {
+ if (cmd->required_pos_args[rp].def.val_bits) {
+ printf(" ");
+ print_usage_def(&cmd->required_pos_args[rp].def);
+ }
+ }
+ }
+
+ if (!cmd->oo_count)
+ goto op_count;
+
+ if (cmd->oo_count) {
+ first = 1;
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ opt_enum = cmd->optional_opt_args[oo].opt;
+
+ /*
+ * Skip common opts in lvm_all and cname->common_options.
+ */
+
+ if (is_lvm_all_opt(opt_enum))
+ continue;
+
+ if ((cname->variants > 1) && cname->common_options[opt_enum])
+ continue;
+
+ if (first)
+ printf("\n\t[");
+ else
+ printf(",\n\t ");
+ first = 0;
+
+ printf(" %s", opt_names[opt_enum].long_opt);
+ if (cmd->optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_usage_def(&cmd->optional_opt_args[oo].def);
+ }
+ }
+
+ if (first)
+ printf("\n\t[");
+ else
+ printf(",\n\t ");
+ printf(" COMMON_OPTIONS ]");
+ }
+
+ op_count:
+ if (!cmd->op_count)
+ goto done;
+
+ printf("\n\t[");
+
+ if (cmd->op_count) {
+ for (op = 0; op < cmd->op_count; op++) {
+ if (cmd->optional_pos_args[op].def.val_bits) {
+ printf(" ");
+ print_usage_def(&cmd->optional_pos_args[op].def);
+ }
+ }
+ }
+
+ printf(" ]");
+ done:
+ printf("\n");
+ return;
+}
+
+
+void print_usage_common(struct command_name *cname, struct command *cmd)
+{
+ int oo, opt_enum, first;
+
+ printf(" Common options:");
+
+ /*
+ * when there's more than one variant, options that
+ * are common to all commands with a common name.
+ */
+
+ if (cname->variants < 2)
+ goto all;
+
+ first = 1;
+
+ for (opt_enum = 0; opt_enum < ARG_COUNT; opt_enum++) {
+ if (!cname->common_options[opt_enum])
+ continue;
+
+ if (is_lvm_all_opt(opt_enum))
+ continue;
+
+ if (first)
+ printf("\n\t[");
+ else
+ printf(",\n\t ");
+ first = 0;
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ if (cmd->optional_opt_args[oo].opt != opt_enum)
+ continue;
+
+ printf(" %s", opt_names[opt_enum].long_opt);
+ if (cmd->optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_usage_def(&cmd->optional_opt_args[oo].def);
+ }
+ break;
+ }
+ }
+
+ all:
+ /* options that are common to all lvm commands */
+
+ for (oo = 0; oo < lvm_all.oo_count; oo++) {
+ opt_enum = lvm_all.optional_opt_args[oo].opt;
+
+ if (first)
+ printf("\n\t[");
+ else
+ printf(",\n\t ");
+ first = 0;
+
+ printf(" %s", opt_names[opt_enum].long_opt);
+ if (lvm_all.optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_usage_def(&lvm_all.optional_opt_args[oo].def);
+ }
+ }
+
+ printf(" ]\n");
+}
+
+#ifdef MAN_PAGE_GENERATOR
+
+static void print_val_man(const char *str)
+{
+ char *line;
+ char *line_argv[MAX_LINE_ARGC];
+ int line_argc;
+ int i;
+
+ if (!strcmp(str, "Number") ||
+ !strcmp(str, "String") ||
+ !strncmp(str, "VG", 2) ||
+ !strncmp(str, "LV", 2) ||
+ !strncmp(str, "PV", 2) ||
+ !strcmp(str, "Tag")) {
+ printf("\\fI%s\\fP", str);
+ return;
+ }
+
+ if (strstr(str, "Number[") || strstr(str, "]Number")) {
+ for (i = 0; i < strlen(str); i++) {
+ if (str[i] == 'N')
+ printf("\\fI");
+ if (str[i] == 'r') {
+ printf("%c", str[i]);
+ printf("\\fP");
+ continue;
+ }
+ printf("%c", str[i]);
+ }
+ return;
+ }
+
+ if (strstr(str, "|")) {
+ int len = strlen(str);
+ line = strdup(str);
+ split_line(line, &line_argc, line_argv, '|');
+ for (i = 0; i < line_argc; i++) {
+ if (i) {
+ printf("|");
+
+ /* this is a hack to add a line break for
+ a long string of opt values */
+ if ((len > 40) && (i >= (line_argc / 2) + 1)) {
+ printf("\n");
+ printf(" ");
+ len = 0;
+ }
+ }
+ if (strstr(line_argv[i], "Number"))
+ printf("\\fI%s\\fP", line_argv[i]);
+ else
+ printf("\\fB%s\\fP", line_argv[i]);
+ }
+ return;
+ }
+
+ printf("\\fB%s\\fP", str);
+}
+
+static void print_def_man(struct arg_def *def, int usage)
+{
+ int val_enum;
+ int lvt_enum;
+ int sep = 0;
+ int i;
+
+ for (val_enum = 0; val_enum < VAL_COUNT; val_enum++) {
+ if (def->val_bits & val_enum_to_bit(val_enum)) {
+
+ if (val_enum == conststr_VAL) {
+ printf("\\fB");
+ printf("%s", def->str);
+ printf("\\fP");
+ }
+
+ else if (val_enum == constnum_VAL) {
+ printf("\\fB");
+ printf("%llu", (unsigned long long)def->num);
+ printf("\\fP");
+ }
+
+ else {
+ if (sep) printf("|");
+
+ if (!usage || !val_names[val_enum].usage) {
+ printf("\\fI");
+ printf("%s", val_names[val_enum].name);
+ printf("\\fP");
+ } else {
+ print_val_man(val_names[val_enum].usage);
+ }
+
+ sep = 1;
+ }
+
+ if (val_enum == lv_VAL && def->lvt_bits) {
+ printf("\\fI");
+ for (lvt_enum = 1; lvt_enum < LVT_COUNT; lvt_enum++) {
+ if (lvt_bit_is_set(def->lvt_bits, lvt_enum))
+ printf("_%s", lvt_enum_to_name(lvt_enum));
+ }
+ printf("\\fP");
+ }
+
+ if ((val_enum == vg_VAL) && (def->flags & ARG_DEF_FLAG_NEW_VG)) {
+ printf("\\fI");
+ printf("_new");
+ printf("\\fP");
+ }
+ if ((val_enum == lv_VAL) && (def->flags & ARG_DEF_FLAG_NEW_LV)) {
+ printf("\\fI");
+ printf("_new");
+ printf("\\fP");
+ }
+ }
+ }
+
+ if (def->flags & ARG_DEF_FLAG_MAY_REPEAT)
+ printf(" ...");
+}
+
+static char *man_long_opt_name(const char *cmdname, int opt_enum)
+{
+ static char long_opt_name[64];
+
+ memset(&long_opt_name, 0, sizeof(long_opt_name));
+
+ switch (opt_enum) {
+ case syncaction_ARG:
+ strncpy(long_opt_name, "--[raid]syncaction", 63);
+ break;
+ case writemostly_ARG:
+ strncpy(long_opt_name, "--[raid]writemostly", 63);
+ break;
+ case minrecoveryrate_ARG:
+ strncpy(long_opt_name, "--[raid]minrecoveryrate", 63);
+ break;
+ case maxrecoveryrate_ARG:
+ strncpy(long_opt_name, "--[raid]maxrecoveryrate", 63);
+ break;
+ case writebehind_ARG:
+ strncpy(long_opt_name, "--[raid]writebehind", 63);
+ break;
+ case vgmetadatacopies_ARG:
+ if (!strncmp(cmdname, "vg", 2))
+ strncpy(long_opt_name, "--[vg]metadatacopies", 63);
+ else
+ strncpy(long_opt_name, "--vgmetadatacopies", 63);
+ break;
+ case pvmetadatacopies_ARG:
+ if (!strncmp(cmdname, "pv", 2))
+ strncpy(long_opt_name, "--[pv]metadatacopies", 63);
+ else
+ strncpy(long_opt_name, "--pvmetadatacopies", 63);
+ break;
+ default:
+ strncpy(long_opt_name, opt_names[opt_enum].long_opt, 63);
+ break;
+ }
+
+ return long_opt_name;
+}
+
+void print_man_usage(char *lvmname, struct command *cmd)
+{
+ struct command_name *cname;
+ int onereq = (cmd->cmd_flags & CMD_FLAG_ONE_REQUIRED_OPT) ? 1 : 0;
+ int i, sep, ro, rp, oo, op, opt_enum;
+ int need_ro_indent_end = 0;
+
+ if (!(cname = find_command_name(cmd->name)))
+ return;
+
+ printf("\\fB%s\\fP", lvmname);
+
+ if (!onereq)
+ goto ro_normal;
+
+ /*
+ * one required option in a set, print as:
+ * ( -a|--a,
+ * -b|--b,
+ * --c,
+ * --d )
+ *
+ * First loop through ro prints those with short opts,
+ * and the second loop prints those without short opts.
+ */
+
+ if (cmd->ro_count) {
+ printf("\n");
+ printf(".RS 4\n");
+ printf("(");
+
+ sep = 0;
+
+ /* print required options with a short opt */
+ for (ro = 0; ro < cmd->ro_count; ro++) {
+ opt_enum = cmd->required_opt_args[ro].opt;
+
+ if (!opt_names[opt_enum].short_opt)
+ continue;
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ }
+
+ if (opt_names[opt_enum].short_opt) {
+ printf(" \\fB-%c\\fP|\\fB%s\\fP",
+ opt_names[opt_enum].short_opt,
+ man_long_opt_name(cmd->name, opt_enum));
+ } else {
+ printf(" ");
+ printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
+ }
+
+ if (cmd->required_opt_args[ro].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->required_opt_args[ro].def, 1);
+ }
+
+ sep++;
+ }
+
+ /* print required options without a short opt */
+ for (ro = 0; ro < cmd->ro_count; ro++) {
+ opt_enum = cmd->required_opt_args[ro].opt;
+
+ if (opt_names[opt_enum].short_opt)
+ continue;
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ }
+
+ printf(" ");
+ printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
+
+ if (cmd->required_opt_args[ro].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->required_opt_args[ro].def, 1);
+ }
+
+ sep++;
+ }
+
+ printf(" )\n");
+ printf(".RE\n");
+ }
+
+ /* print required position args on a new line after the onereq set */
+ if (cmd->rp_count) {
+ printf(".RS 4\n");
+ for (rp = 0; rp < cmd->rp_count; rp++) {
+ if (cmd->required_pos_args[rp].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->required_pos_args[rp].def, 1);
+ }
+ }
+
+ printf("\n");
+ printf(".RE\n");
+ } else {
+ /* printf("\n"); */
+ }
+
+ printf(".br\n");
+ goto oo_count;
+
+ ro_normal:
+
+ /*
+ * all are required options, print as:
+ * -a|--aaa <val> -b|--bbb <val>
+ */
+
+ if (cmd->ro_count) {
+ sep = 0;
+
+ for (ro = 0; ro < cmd->ro_count; ro++) {
+
+ /* avoid long line wrapping */
+ if ((cmd->ro_count > 2) && (sep == 2)) {
+ printf("\n.RS 5\n");
+ need_ro_indent_end = 1;
+ }
+
+ opt_enum = cmd->required_opt_args[ro].opt;
+
+ if (opt_names[opt_enum].short_opt) {
+ printf(" \\fB-%c\\fP|\\fB%s\\fP",
+ opt_names[opt_enum].short_opt,
+ man_long_opt_name(cmd->name, opt_enum));
+ } else {
+ printf(" \\fB%s\\fP", opt_names[cmd->required_opt_args[ro].opt].long_opt);
+ }
+
+ if (cmd->required_opt_args[ro].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->required_opt_args[ro].def, 1);
+ }
+
+ sep++;
+ }
+ }
+
+ /* print required position args on the same line as the required options */
+ if (cmd->rp_count) {
+ for (rp = 0; rp < cmd->rp_count; rp++) {
+ if (cmd->required_pos_args[rp].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->required_pos_args[rp].def, 1);
+ }
+ }
+
+ printf("\n");
+ } else {
+ printf("\n");
+ }
+
+ if (need_ro_indent_end)
+ printf(".RE\n");
+
+ printf(".br\n");
+
+ oo_count:
+ if (!cmd->oo_count)
+ goto op_count;
+
+ sep = 0;
+
+ if (cmd->oo_count) {
+ printf(".RS 4\n");
+ printf("[");
+
+ /* print optional options with short opts */
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ opt_enum = cmd->optional_opt_args[oo].opt;
+
+ if (!opt_names[opt_enum].short_opt)
+ continue;
+
+ if (is_lvm_all_opt(opt_enum))
+ continue;
+
+ if ((cname->variants > 1) && cname->common_options[opt_enum])
+ continue;
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ }
+
+ printf(" \\fB-%c\\fP|\\fB%s\\fP",
+ opt_names[opt_enum].short_opt,
+ man_long_opt_name(cmd->name, opt_enum));
+
+ if (cmd->optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->optional_opt_args[oo].def, 1);
+ }
+ sep = 1;
+ }
+
+ /* print optional options without short opts */
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ opt_enum = cmd->optional_opt_args[oo].opt;
+
+ if (opt_names[opt_enum].short_opt)
+ continue;
+
+ if (is_lvm_all_opt(opt_enum))
+ continue;
+
+ if ((cname->variants > 1) && cname->common_options[opt_enum])
+ continue;
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ }
+
+ /* space alignment without short opt */
+ printf(" ");
+
+ printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
+
+ if (cmd->optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->optional_opt_args[oo].def, 1);
+ }
+ sep = 1;
+ }
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ /* space alignment without short opt */
+ printf(" ");
+ }
+ printf(" COMMON_OPTIONS");
+ printf(" ]\n");
+ printf(".RE\n");
+ printf(".br\n");
+ }
+
+ op_count:
+ if (!cmd->op_count)
+ goto done;
+
+ printf(".RS 4\n");
+ printf("[");
+
+ if (cmd->op_count) {
+ for (op = 0; op < cmd->op_count; op++) {
+ if (cmd->optional_pos_args[op].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->optional_pos_args[op].def, 1);
+ }
+ }
+ }
+
+ printf(" ]\n");
+ printf(".RE\n");
+
+ done:
+ printf("\n");
+}
+
+/*
+ * common options listed in the usage section.
+ *
+ * For commands with only one variant, this is only
+ * the options which are common to all lvm commands
+ * (in lvm_all, see is_lvm_all_opt).
+ *
+ * For commands with more than one variant, this
+ * is the set of options common to all variants
+ * (in cname->common_options), (which obviously
+ * includes the options common to all lvm commands.)
+ *
+ * List ordering:
+ * options with short+long names, alphabetically,
+ * then options with only long names, alphabetically
+ */
+
+void print_man_usage_common(struct command *cmd)
+{
+ struct command_name *cname;
+ int i, sep, ro, rp, oo, op, opt_enum;
+
+ if (!(cname = find_command_name(cmd->name)))
+ return;
+
+ sep = 0;
+
+ printf(".RS 4\n");
+ printf("[");
+
+ /* print those with short opts */
+ for (i = 0; i < ARG_COUNT; i++) {
+ opt_enum = opt_names_alpha[i]->opt_enum;
+
+ if (!cname->common_options[opt_enum])
+ continue;
+
+ if (!opt_names[opt_enum].short_opt)
+ continue;
+
+ if ((cname->variants < 2) && !is_lvm_all_opt(opt_enum))
+ continue;
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ }
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ if (cmd->optional_opt_args[oo].opt != opt_enum)
+ continue;
+
+ printf(" \\fB-%c\\fP|\\fB%s\\fP",
+ opt_names[opt_enum].short_opt,
+ man_long_opt_name(cmd->name, opt_enum));
+
+ if (cmd->optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->optional_opt_args[oo].def, 1);
+ }
+ sep = 1;
+ break;
+ }
+
+ }
+
+ /* print those without short opts */
+ for (i = 0; i < ARG_COUNT; i++) {
+ opt_enum = opt_names_alpha[i]->opt_enum;
+
+ if (!cname->common_options[opt_enum])
+ continue;
+
+ if (opt_names[opt_enum].short_opt)
+ continue;
+
+ if ((cname->variants < 2) && !is_lvm_all_opt(opt_enum))
+ continue;
+
+ if (sep) {
+ printf(",");
+ printf("\n.br\n");
+ printf(" ");
+ }
+
+ for (oo = 0; oo < cmd->oo_count; oo++) {
+ if (cmd->optional_opt_args[oo].opt != opt_enum)
+ continue;
+
+ /* space alignment without short opt */
+ printf(" ");
+
+ printf(" \\fB%s\\fP", man_long_opt_name(cmd->name, opt_enum));
+
+ if (cmd->optional_opt_args[oo].def.val_bits) {
+ printf(" ");
+ print_def_man(&cmd->optional_opt_args[oo].def, 1);
+ }
+ sep = 1;
+ break;
+ }
+ }
+
+ printf(" ]\n");
+ return;
+}
+
+/*
+ * Format of description, when different command names have
+ * different descriptions:
+ *
+ * "#cmdname1"
+ * "text foo goes here"
+ * "a second line of text."
+ * "#cmdname2"
+ * "text bar goes here"
+ * "another line of text."
+ *
+ * When called for cmdname2, this function should just print:
+ *
+ * "text bar goes here"
+ * "another line of text."
+ */
+
+static void print_man_option_desc(struct command_name *cname, int opt_enum)
+{
+ const char *desc = opt_names[opt_enum].desc;
+ char buf[DESC_LINE];
+ int started_cname = 0;
+ int line_count = 0;
+ int di, bi = 0;
+
+ if (desc[0] != '#') {
+ printf("%s", desc);
+ return;
+ }
+
+ for (di = 0; di < strlen(desc); di++) {
+ buf[bi++] = desc[di];
+
+ if (bi == DESC_LINE) {
+ log_error("Parsing command defs: print_man_option_desc line too long");
+ exit(EXIT_FAILURE);
+ }
+
+ if (buf[bi-1] != '\n')
+ continue;
+
+ if (buf[0] != '#') {
+ if (started_cname) {
+ printf("%s", buf);
+ line_count++;
+ }
+
+ memset(buf, 0, sizeof(buf));
+ bi = 0;
+ continue;
+ }
+
+ /* Line starting with #cmdname */
+
+ /*
+ * Must be starting a new command name.
+ * If no lines have been printed, multiple command names
+ * are using the same text. If lines have been printed,
+ * then the start of a new command name means the end
+ * of text for the current command name.
+ */
+ if (line_count && started_cname)
+ return;
+
+ if (!strncmp(buf + 1, cname->name, strlen(cname->name))) {
+ /* The start of our command name. */
+ started_cname = 1;
+ memset(buf, 0, sizeof(buf));
+ bi = 0;
+ } else {
+ /* The start of another command name. */
+ memset(buf, 0, sizeof(buf));
+ bi = 0;
+ }
+ }
+
+ if (bi && started_cname)
+ printf("%s", buf);
+}
+
+/*
+ * Print a list of all options names for a given
+ * command name, listed by:
+ * options with short+long names, alphabetically,
+ * then options with only long names, alphabetically
+ */
+
+void print_man_all_options_list(struct command_name *cname)
+{
+ int opt_enum, val_enum;
+ int sep = 0;
+ int i;
+
+ /* print those with both short and long opts */
+ for (i = 0; i < ARG_COUNT; i++) {
+ opt_enum = opt_names_alpha[i]->opt_enum;
+
+
+ if (!cname->all_options[opt_enum])
+ continue;
+
+ if (!opt_names[opt_enum].short_opt)
+ continue;
+
+ if (sep)
+ printf("\n.br\n");
+
+ printf(" \\fB-%c\\fP|\\fB%s\\fP",
+ opt_names[opt_enum].short_opt,
+ man_long_opt_name(cname->name, opt_enum));
+
+ val_enum = opt_names[opt_enum].val_enum;
+
+ if (!val_names[val_enum].fn) {
+ /* takes no arg */
+ } else if (!val_names[val_enum].usage) {
+ printf(" ");
+ printf("\\fI");
+ printf("%s", val_names[val_enum].name);
+ printf("\\fP");
+ } else {
+ printf(" ");
+ print_val_man(val_names[val_enum].usage);
+ }
+
+ sep = 1;
+ }
+
+ /* print those without short opts */
+ for (i = 0; i < ARG_COUNT; i++) {
+ opt_enum = opt_names_alpha[i]->opt_enum;
+
+ if (!cname->all_options[opt_enum])
+ continue;
+
+ if (opt_names[opt_enum].short_opt)
+ continue;
+
+ if (sep)
+ printf("\n.br\n");
+
+ /* space alignment without short opt */
+ printf(" ");
+
+ printf(" \\fB%s\\fP", man_long_opt_name(cname->name, opt_enum));
+
+ val_enum = opt_names[opt_enum].val_enum;
+
+ if (!val_names[val_enum].fn) {
+ /* takes no arg */
+ } else if (!val_names[val_enum].usage) {
+ printf(" ");
+ printf("\\fI");
+ printf("%s", val_names[val_enum].name);
+ printf("\\fP");
+ } else {
+ printf(" ");
+ print_val_man(val_names[val_enum].usage);
+ }
+
+ sep = 1;
+ }
+}
+
+/*
+ * All options used for a given command name, along with descriptions.
+ * listed in order of:
+ * 1. options that are not common to all lvm commands, alphabetically
+ * 2. options common to all lvm commands, alphabetically
+ */
+
+void print_man_all_options_desc(struct command_name *cname)
+{
+ int opt_enum, val_enum;
+ int print_common = 0;
+ int sep = 0;
+ int i;
+
+ again:
+ /*
+ * Loop 1: print options that are not common to all lvm commands.
+ * Loop 2: print options common to all lvm commands (lvm_all)
+ */
+
+ for (i = 0; i < ARG_COUNT; i++) {
+ opt_enum = opt_names_alpha[i]->opt_enum;
+
+ if (!cname->all_options[opt_enum])
+ continue;
+
+ if (!print_common && is_lvm_all_opt(opt_enum))
+ continue;
+
+ if (print_common && !is_lvm_all_opt(opt_enum))
+ continue;
+
+ printf("\n.TP\n");
+
+ if (opt_names[opt_enum].short_opt) {
+ printf("\\fB-%c\\fP|\\fB%s\\fP",
+ opt_names[opt_enum].short_opt,
+ man_long_opt_name(cname->name, opt_enum));
+ } else {
+ printf("\\fB%s\\fP", man_long_opt_name(cname->name, opt_enum));
+ }
+
+ val_enum = opt_names[opt_enum].val_enum;
+
+ if (!val_names[val_enum].fn) {
+ /* takes no arg */
+ } else if (!val_names[val_enum].usage) {
+ printf(" ");
+ printf("\\fI");
+ printf("%s", val_names[val_enum].name);
+ printf("\\fP");
+ } else {
+ printf(" ");
+ print_val_man(val_names[val_enum].usage);
+ }
+
+ if (opt_names[opt_enum].desc) {
+ printf("\n");
+ printf(".br\n");
+ print_man_option_desc(cname, opt_enum);
+ }
+
+ sep = 1;
+ }
+
+ if (!print_common) {
+ print_common = 1;
+ goto again;
+ }
+}
+
+void print_desc_man(const char *desc)
+{
+ char buf[DESC_LINE] = {0};
+ int di = 0;
+ int bi = 0;
+
+ for (di = 0; di < strlen(desc); di++) {
+ if (desc[di] == '\0')
+ break;
+ if (desc[di] == '\n')
+ continue;
+
+ if (!strncmp(&desc[di], "DESC:", 5)) {
+ if (bi) {
+ printf("%s\n", buf);
+ printf(".br\n");
+ memset(buf, 0, sizeof(buf));
+ bi = 0;
+ }
+ di += 5;
+ continue;
+ }
+
+ if (!bi && desc[di] == ' ')
+ continue;
+
+ buf[bi++] = desc[di];
+
+ if (bi == (DESC_LINE - 1))
+ break;
+ }
+
+ if (bi) {
+ printf("%s\n", buf);
+ printf(".br\n");
+ }
+}
+
+static char *upper_command_name(char *str)
+{
+ static char str_upper[32];
+ int i = 0;
+
+ while (*str) {
+ str_upper[i++] = toupper(*str);
+ str++;
+ }
+ str_upper[i] = '\0';
+ return str_upper;
+}
+
+static void include_description_file(char *name, char *des_file)
+{
+ char buf[1024 * 1024];
+ int fd;
+
+ memset(buf, 0, sizeof(buf));
+
+ fd = open(des_file, O_RDONLY);
+
+ if (fd < 0)
+ return;
+
+ read(fd, buf, sizeof(buf) - 1);
+
+ printf(".SH DESCRIPTION\n");
+ printf("%s\n", buf);
+
+ close(fd);
+}
+
+void print_man(char *name, char *des_file, int include_primary, int include_secondary)
+{
+ struct command_name *cname;
+ struct command *cmd, *prev_cmd = NULL;
+ char *lvmname = name;
+ const char *desc;
+ int i, j, ro, rp, oo, op;
+
+ if (!strncmp(name, "lvm-", 4))
+ name += 4;
+
+ cname = find_command_name(name);
+
+ printf(".TH %s 8 \"LVM TOOLS #VERSION#\" \"Sistina Software UK\"\n",
+ upper_command_name(lvmname));
+
+ for (i = 0; i < COMMAND_COUNT; i++) {
+
+ cmd = &commands[i];
+
+ if (prev_cmd && strcmp(prev_cmd->name, cmd->name)) {
+ printf("Common options:\n");
+ printf(".\n");
+ print_man_usage_common(prev_cmd);
+
+ printf("\n");
+ printf(".SH OPTIONS\n");
+ printf(".br\n");
+ print_man_all_options_desc(cname);
+
+ prev_cmd = NULL;
+ }
+
+ if ((cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_secondary)
+ continue;
+
+ if (!(cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_primary)
+ continue;
+
+ if (name && strcmp(name, cmd->name))
+ continue;
+
+ if (!prev_cmd || strcmp(prev_cmd->name, cmd->name)) {
+ printf(".SH NAME\n");
+ printf(".\n");
+ if (cname->desc)
+ printf("%s \\- %s\n", lvmname, cname->desc);
+ else
+ printf("%s\n", lvmname);
+ printf(".P\n");
+
+ printf(".\n");
+ printf(".SH SYNOPSIS\n");
+ printf(".br\n");
+ printf(".P\n");
+ printf(".\n");
+ prev_cmd = cmd;
+
+ if (!(cname = find_command_name(cmd->name)))
+ return;
+
+ if (cname->variant_has_ro && cname->variant_has_rp)
+ printf("\\fB%s\\fP \\fIrequired_option_args\\fP \\fIrequired_position_args\\fP\n", lvmname);
+ else if (cname->variant_has_ro && !cname->variant_has_rp)
+ printf("\\fB%s\\fP \\fIrequired_option_args\\fP\n", lvmname);
+ else if (!cname->variant_has_ro && cname->variant_has_rp)
+ printf("\\fB%s\\fP \\fIrequired_position_args\\fP\n", lvmname);
+ else if (!cname->variant_has_ro && !cname->variant_has_rp)
+ printf("\\fB%s\\fP\n", lvmname);
+
+ printf(".br\n");
+
+ if (cname->variant_has_oo) {
+ printf(" [ \\fIoptional_option_args\\fP ]\n");
+ printf(".br\n");
+ }
+
+ if (cname->variant_has_op) {
+ printf(" [ \\fIoptional_position_args\\fP ]\n");
+ printf(".br\n");
+ }
+
+ printf(".P\n");
+ printf("\n");
+
+ /* listing them all when there's only 1 or 2 is just repetative */
+ if (cname->variants > 2) {
+ printf(".P\n");
+ print_man_all_options_list(cname);
+ printf("\n");
+ printf(".P\n");
+ printf("\n");
+ }
+
+ if (des_file) {
+ include_description_file(lvmname, des_file);
+ printf(".P\n");
+ }
+
+ printf(".SH USAGE\n");
+ printf(".br\n");
+ printf(".P\n");
+ printf(".\n");
+ }
+
+ if (cmd->desc) {
+ print_desc_man(cmd->desc);
+ printf(".P\n");
+ }
+
+ print_man_usage(lvmname, cmd);
+
+ if (i == (COMMAND_COUNT - 1)) {
+ printf("Common options:\n");
+ printf(".\n");
+ print_man_usage_common(cmd);
+
+ printf("\n");
+ printf(".SH OPTIONS\n");
+ printf(".br\n");
+ print_man_all_options_desc(cname);
+
+ }
+
+ printf("\n");
+ continue;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ memset(&commands, 0, sizeof(commands));
+
+ if (argc < 2) {
+ log_error("Usage: %s <command> [/path/to/description-file]", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ define_commands();
+
+ print_man(argv[1], (argc > 2) ? argv[2] : NULL, 1, 1);
+
+ return 0;
+}
+
+#endif
diff --git a/tools/command.h b/tools/command.h
index c9be260..b3fae03 100644
--- a/tools/command.h
+++ b/tools/command.h
@@ -22,21 +22,33 @@ struct cmd_context;
typedef int (*command_fn) (struct cmd_context *cmd, int argc, char **argv);
/* new per-command-line-id functions */
-typedef int (*command_line_fn) (struct cmd_context *cmd, int argc, char **argv);
+typedef int (*command_id_fn) (struct cmd_context *cmd, int argc, char **argv);
struct command_function {
- int command_line_enum;
- command_line_fn fn;
+ int command_enum;
+ command_id_fn fn;
};
+#define MAX_COMMAND_NAMES 64
+
struct command_name {
const char *name;
const char *desc; /* general command description from commands.h */
unsigned int flags;
+ command_fn fn; /* old style */
/* union of {required,optional}_opt_args for all commands with this name */
- int valid_args[ARG_COUNT];
+ int valid_args[ARG_COUNT]; /* used for getopt */
int num_args;
+
+ /* the following are for generating help and man page output */
+ int common_options[ARG_COUNT]; /* options common to all defs */
+ int all_options[ARG_COUNT]; /* union of options from all defs */
+ int variants; /* number of command defs with this command name */
+ int variant_has_ro; /* do variants use required_opt_args ? */
+ int variant_has_rp; /* do variants use required_pos_args ? */
+ int variant_has_oo; /* do variants use optional_opt_args ? */
+ int variant_has_op; /* do variants use optional_pos_args ? */
};
/*
@@ -158,14 +170,13 @@ struct cmd_rule {
/* a register of the lvm commands */
struct command {
const char *name;
- const char *desc; /* specific command description from command-lines.h */
- const char *usage; /* excludes common options like --help, --debug */
- const char *usage_common; /* includes commmon options like --help, --debug */
- const char *command_line_id;
- int command_line_enum; /* <command_line_id>_CMD */
+ const char *desc; /* specific command description from command-lines.in */
+ const char *command_id; /* ID string in command-lines.in */
+ int command_enum; /* <command_id>_CMD */
+ int command_index; /* position in commands[] */
- command_fn fn; /* old style */
struct command_function *functions; /* new style */
+ command_fn fn; /* old style */
unsigned int cmd_flags; /* CMD_FLAG_ */
@@ -198,4 +209,9 @@ struct command {
int pos_count; /* temp counter used by create-command */
};
+int define_commands(void);
+int command_id_to_enum(const char *str);
+void print_usage(struct command *cmd);
+void print_usage_common(struct command_name *cname, struct command *cmd);
+
#endif
diff --git a/tools/lvchange.c b/tools/lvchange.c
index b75d058..1c00b76 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -1016,9 +1016,7 @@ static int _lvchange_properties_check(struct cmd_context *cmd,
{
if (!lv_is_visible(lv)) {
if (lv_is_named_arg)
- log_error("Operation not permitted (%s %d) on hidden LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lv));
+ log_error("Operation not permitted on hidden LV %s.", display_lvname(lv));
return 0;
}
@@ -1129,9 +1127,7 @@ static int _lvchange_activate_check(struct cmd_context *cmd,
{
if (!lv_is_visible(lv)) {
if (lv_is_named_arg)
- log_error("Operation not permitted (%s %d) on hidden LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lv));
+ log_error("Operation not permitted on hidden LV %s.", display_lvname(lv));
return 0;
}
@@ -1185,9 +1181,7 @@ static int _lvchange_refresh_check(struct cmd_context *cmd,
{
if (!lv_is_visible(lv)) {
if (lv_is_named_arg)
- log_error("Operation not permitted (%s %d) on hidden LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lv));
+ log_error("Operation not permitted on hidden LV %s.", display_lvname(lv));
return 0;
}
@@ -1367,9 +1361,7 @@ static int _lvchange_persistent_check(struct cmd_context *cmd,
{
if (!lv_is_visible(lv)) {
if (lv_is_named_arg)
- log_error("Operation not permitted (%s %d) on hidden LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lv));
+ log_error("Operation not permitted on hidden LV %s.", display_lvname(lv));
return 0;
}
@@ -1385,8 +1377,8 @@ int lvchange_persistent_cmd(struct cmd_context *cmd, int argc, char **argv)
int lvchange(struct cmd_context *cmd, int argc, char **argv)
{
- log_error(INTERNAL_ERROR "Missing function for command definition %s.",
- cmd->command->command_line_id);
+ log_error(INTERNAL_ERROR "Missing function for command definition %d:%s.",
+ cmd->command->command_index, cmd->command->command_id);
return ECMD_FAILED;
}
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 2ccf264..75bdcb9 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -17,7 +17,6 @@
#include "polldaemon.h"
#include "lv_alloc.h"
#include "lvconvert_poll.h"
-#include "command-lines-count.h"
typedef enum {
/* Split:
@@ -3764,7 +3763,7 @@ static int _lvconvert_to_pool_single(struct cmd_context *cmd,
int to_thinpool = 0;
int to_cachepool = 0;
- switch (cmd->command->command_line_enum) {
+ switch (cmd->command->command_enum) {
case lvconvert_to_thinpool_CMD:
to_thinpool = 1;
break;
@@ -3813,7 +3812,7 @@ int lvconvert_to_pool_noarg_cmd(struct cmd_context *cmd, int argc, char **argv)
char *pool_data_name;
int i, p;
- switch (cmd->command->command_line_enum) {
+ switch (cmd->command->command_enum) {
case lvconvert_to_thinpool_noarg_CMD:
pool_data_name = (char *)arg_str_value(cmd, thinpool_ARG, NULL);
new_command = get_command(lvconvert_to_thinpool_CMD);
@@ -3827,9 +3826,9 @@ int lvconvert_to_pool_noarg_cmd(struct cmd_context *cmd, int argc, char **argv)
return 0;
};
- log_debug("Changing command line id %s %d to standard form %s %d",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- new_command->command_line_id, new_command->command_line_enum);
+ log_debug("Changing command %d:%s to standard form %d:%s",
+ cmd->command->command_index, cmd->command->command_id,
+ new_command->command_index, new_command->command_id);
/* Make the LV the first position arg. */
@@ -4092,7 +4091,7 @@ int lvconvert_swap_pool_metadata_noarg_cmd(struct cmd_context *cmd, int argc, ch
struct command *new_command;
char *pool_name;
- switch (cmd->command->command_line_enum) {
+ switch (cmd->command->command_enum) {
case lvconvert_swap_thinpool_metadata_CMD:
pool_name = (char *)arg_str_value(cmd, thinpool_ARG, NULL);
break;
@@ -4106,9 +4105,9 @@ int lvconvert_swap_pool_metadata_noarg_cmd(struct cmd_context *cmd, int argc, ch
new_command = get_command(lvconvert_swap_pool_metadata_CMD);
- log_debug("Changing command line id %s %d to standard form %s %d",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- new_command->command_line_id, new_command->command_line_enum);
+ log_debug("Changing command %d:%s to standard form %d:%s",
+ cmd->command->command_index, cmd->command->command_id,
+ new_command->command_index, new_command->command_id);
/* Make the LV the first position arg. */
@@ -4172,7 +4171,7 @@ static int _lvconvert_split_cachepool_single(struct cmd_context *cmd,
return ECMD_FAILED;
}
- switch (cmd->command->command_line_enum) {
+ switch (cmd->command->command_enum) {
case lvconvert_split_and_keep_cachepool_CMD:
ret = _lvconvert_split_and_keep_cachepool(cmd, cache_lv, cachepool_lv);
break;
@@ -4193,7 +4192,7 @@ static int _lvconvert_split_cachepool_single(struct cmd_context *cmd,
int lvconvert_split_cachepool_cmd(struct cmd_context *cmd, int argc, char **argv)
{
- if (cmd->command->command_line_enum == lvconvert_split_and_remove_cachepool_CMD) {
+ if (cmd->command->command_enum == lvconvert_split_and_remove_cachepool_CMD) {
cmd->handles_missing_pvs = 1;
cmd->partial_activation = 1;
}
@@ -4272,8 +4271,7 @@ static int _lvconvert_raid_types_check(struct cmd_context *cmd, struct logical_v
case thinpool_LVT:
case cachepool_LVT:
case snapshot_LVT:
- log_error("Operation not permitted (%s %d) on LV %s type %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
+ log_error("Operation not permitted on LV %s type %s.",
display_lvname(lv), lvtype ? lvtype->name : "unknown");
return 0;
}
@@ -4281,9 +4279,7 @@ static int _lvconvert_raid_types_check(struct cmd_context *cmd, struct logical_v
return 1;
fail_hidden:
- log_error("Operation not permitted (%s %d) on hidden LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lv));
+ log_error("Operation not permitted on hidden LV %s.", display_lvname(lv));
return 0;
}
@@ -4342,9 +4338,7 @@ static int _lvconvert_visible_check(struct cmd_context *cmd, struct logical_volu
int lv_is_named_arg)
{
if (!lv_is_visible(lv)) {
- log_error("Operation not permitted (%s %d) on hidden LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lv));
+ log_error("Operation not permitted on hidden LV %s.", display_lvname(lv));
return 0;
}
@@ -4547,8 +4541,8 @@ int lvconvert_merge_cmd(struct cmd_context *cmd, int argc, char **argv)
int lvconvert(struct cmd_context *cmd, int argc, char **argv)
{
- log_error(INTERNAL_ERROR "Missing function for command definition %s.",
- cmd->command->command_line_id);
+ log_error(INTERNAL_ERROR "Missing function for command definition %d:%s.",
+ cmd->command->command_index, cmd->command->command_id);
return ECMD_FAILED;
}
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 4039dd9..121a9dd 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -49,7 +49,6 @@ extern char *optarg;
# define OPTIND_INIT 1
#endif
-#include "command-lines-count.h"
/*
* Table of valid --option values.
@@ -70,16 +69,6 @@ static struct arg_props _arg_props[ARG_COUNT + 1] = {
};
/*
- * Table of valid command names
- */
-#define MAX_COMMAND_NAMES 64
-struct command_name command_names[MAX_COMMAND_NAMES] = {
-#define xx(a, b, c...) { # a, b, c },
-#include "commands.h"
-#undef xx
-};
-
-/*
* Table of LV properties
*/
static struct lv_props _lv_props[LVP_COUNT + 1] = {
@@ -97,11 +86,20 @@ static struct lv_types _lv_types[LVT_COUNT + 1] = {
#undef lvt
};
+/*
+ * Table of command names
+ */
+struct command_name command_names[MAX_COMMAND_NAMES] = {
+#define xx(a, b, c...) { # a, b, c, a},
+#include "commands.h"
+#undef xx
+};
/*
- * Table of valid command lines
+ * Table of commands (as defined in command-lines.in)
*/
-static struct command commands[COMMAND_COUNT];
+struct command commands[COMMAND_COUNT];
+
static struct cmdline_context _cmdline;
/*
@@ -111,7 +109,7 @@ static struct cmdline_context _cmdline;
* to use these functions instead of the old per-command-name function.
* For now, any command id not included here uses the old command fn.
*/
-struct command_function command_functions[COMMAND_ID_COUNT] = {
+struct command_function command_functions[CMD_COUNT] = {
{ lvmconfig_general_CMD, lvmconfig },
{ lvchange_properties_CMD, lvchange_properties_cmd },
{ lvchange_resync_CMD, lvchange_resync_cmd },
@@ -1061,7 +1059,7 @@ static void _set_valid_args_for_command_name(int ci)
command_names[ci].num_args = num_args;
}
-static struct command_name *_find_command_name(const char *name)
+static struct command_name *find_command_name(const char *name)
{
int i;
@@ -1074,39 +1072,50 @@ static struct command_name *_find_command_name(const char *name)
return NULL;
}
-static struct command_function *_find_command_function(int command_line_enum)
+static struct command_function *_find_command_id_function(int command_enum)
{
int i;
- if (!command_line_enum)
+ if (!command_enum)
return NULL;
- for (i = 0; i < COMMAND_ID_COUNT; i++) {
- if (command_functions[i].command_line_enum == command_line_enum)
+ for (i = 0; i < CMD_COUNT; i++) {
+ if (command_functions[i].command_enum == command_enum)
return &command_functions[i];
}
return NULL;
}
-static void _define_commands(void)
-{
-/* command-lines.h defines command[] structs, generated from command-lines.in */
-#include "command-lines.h" /* generated from command-lines.in */
-}
-
void lvm_register_commands(void)
{
int i;
memset(&commands, 0, sizeof(commands));
- _define_commands();
+ /*
+ * populate commands[] array with command definitions
+ * by parsing command-lines.in/command-lines-input.h
+ */
+ if (!define_commands()) {
+ log_error("Failed to parse command definitions.");
+ return;
+ }
_cmdline.commands = commands;
_cmdline.num_commands = COMMAND_COUNT;
- for (i = 0; i < COMMAND_COUNT; i++)
- commands[i].functions = _find_command_function(commands[i].command_line_enum);
+ for (i = 0; i < COMMAND_COUNT; i++) {
+ commands[i].command_enum = command_id_to_enum(commands[i].command_id);
+
+ /* new style */
+ commands[i].functions = _find_command_id_function(commands[i].command_enum);
+
+ /* old style */
+ if (!commands[i].functions) {
+ struct command_name *cname = find_command_name(commands[i].name);
+ commands[i].fn = cname->fn;
+ }
+ }
_cmdline.command_names = command_names;
@@ -1139,7 +1148,7 @@ struct command *get_command(int cmd_enum)
int i;
for (i = 0; i < COMMAND_COUNT; i++) {
- if (commands[i].command_line_enum == cmd_enum)
+ if (commands[i].command_enum == cmd_enum)
return &commands[i];
}
@@ -1283,194 +1292,6 @@ static int _command_required_pos_matches(struct cmd_context *cmd, int ci, int rp
return 0;
}
-
-#define HELP_LINE_SIZE 1024
-
-static void _print_usage(const char *usage_str, int only_required)
-{
- char buf[HELP_LINE_SIZE];
- int optional_ui = 0;
- int optional_pos_ui = 0;
- int ui;
- int bi;
-
- if (!usage_str || !strlen(usage_str))
- return;
-
- /*
- * copy the required opt_args/pos_args
- *
- * The optional portions of the usage string are enclosed
- * in [] and follow the required portions.
- *
- * The optional portion begins with [ followed by a space,
- * i.e. "[ " to distinguish the option usage which may
- * include [ in cases like --option Number[units].
- */
-
- memset(buf, 0, sizeof(buf));
- bi = 0;
-
- for (ui = 0; ui < strlen(usage_str); ui++) {
- if (!bi && ((usage_str[ui] == ' ') || (usage_str[ui] == '\n')))
- continue;
-
- /* The first "[ " indicates the start of the optional opt_args. */
- if ((usage_str[ui] == '[') && (usage_str[ui+1] == ' ')) {
- optional_ui = ui;
- break;
- }
-
- if (usage_str[ui] == '\0')
- break;
-
- if (usage_str[ui] == '(') {
- buf[bi++] = '\n';
- buf[bi++] = '\t';
- }
-
- buf[bi++] = usage_str[ui];
-
- if (usage_str[ui] == ')') {
- buf[bi++] = '\n';
- buf[bi++] = '\t';
- }
-
- if (usage_str[ui] == ',') {
- buf[bi++] = '\n';
- buf[bi++] = '\t';
- buf[bi++] = ' ';
- }
-
- if (bi == (HELP_LINE_SIZE - 1))
- break;
- }
-
- /*
- * print the required opt_args/pos_args
- */
-
- if (bi)
- log_print("%s", buf);
-
- if (only_required)
- return;
-
- /*
- * copy the optional opt_args
- */
-
- if (!optional_ui)
- goto out;
-
- memset(buf, 0, sizeof(buf));
- bi = 0;
-
- for (ui = optional_ui; ui < strlen(usage_str); ui++) {
-
- /* The second "[ " indicates the start of the optional pos_args. */
- if ((ui > optional_ui) && (usage_str[ui] == '[') && (usage_str[ui+1] == ' ')) {
- optional_pos_ui = ui;
- break;
- }
-
- if (usage_str[ui] == '\0')
- break;
- if (usage_str[ui] == '\n')
- break;
-
- if (!bi)
- buf[bi++] = '\t';
-
- buf[bi++] = usage_str[ui];
-
- if (usage_str[ui] == ',') {
- buf[bi++] = '\n';
- buf[bi++] = '\t';
- buf[bi++] = ' ';
- }
-
- if (bi == (HELP_LINE_SIZE - 1))
- break;
- }
-
- /*
- * print the optional opt_args
- */
-
- if (bi)
- log_print("%s", buf);
-
- /*
- * copy the optional pos_args
- */
-
- if (!optional_pos_ui)
- goto out;
-
- memset(buf, 0, sizeof(buf));
- bi = 0;
-
- for (ui = optional_pos_ui; ui < strlen(usage_str); ui++) {
- if (usage_str[ui] == '\0')
- break;
- if (usage_str[ui] == '\n')
- break;
-
- if (!bi)
- buf[bi++] = '\t';
-
- buf[bi++] = usage_str[ui];
-
- if (bi == (HELP_LINE_SIZE - 1))
- break;
- }
-
- /*
- * print the optional pos_args
- */
-
- if (bi)
- log_print("%s", buf);
- out:
- return;
-}
-
-static void _print_description(int ci)
-{
- const char *desc = _cmdline.commands[ci].desc;
- char buf[HELP_LINE_SIZE] = {0};
- int di = 0;
- int bi = 0;
-
- for (di = 0; di < strlen(desc); di++) {
- if (!strncmp(&desc[di], "DESC:", 5)) {
- if (bi) {
- buf[bi] = '\0';
- log_print("%s", buf);
- memset(buf, 0, sizeof(buf));
- bi = 0;
- }
- /* skip DESC: */
- di += 5;
- continue;
- }
-
- if (!bi && desc[di] == ' ')
- continue;
-
- buf[bi++] = desc[di];
-
- if (bi == (HELP_LINE_SIZE - 1))
- break;
- }
-
- if (bi) {
- buf[bi] = '\0';
- log_print("%s", buf);
- }
-}
-
/*
* Match what the user typed with a one specific command definition/prototype
* from commands[]. If nothing matches, it's not a valid command. The match
@@ -1683,7 +1504,7 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
log_error("Failed to find a matching command definition.");
if (close_ro) {
log_warn("Closest command usage is:");
- _print_usage(_cmdline.commands[close_i].usage, 1);
+ print_usage(&_cmdline.commands[close_i]);
}
return NULL;
}
@@ -1698,8 +1519,7 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
if (best_unused_count) {
for (i = 0; i < best_unused_count; i++) {
- log_error("Invalid option for command (%s %d): %s.",
- commands[best_i].command_line_id, best_i,
+ log_error("Invalid option for command: %s.",
arg_long_option_name(best_unused_options[i]));
}
return NULL;
@@ -1729,8 +1549,7 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
break;
if (count >= (commands[best_i].rp_count + commands[best_i].op_count)) {
- log_error("Invalid positional argument for command (%s %d): %s.",
- commands[best_i].command_line_id, best_i, argv[count]);
+ log_error("Invalid positional argument for command: %s.", argv[count]);
/* FIXME: to warn/ignore, clear so it can't be used when processing. */
/*
@@ -1774,22 +1593,21 @@ out:
if (opts_match_count && (rule->rule == RULE_INVALID)) {
memset(buf, 0, sizeof(buf));
opt_array_to_str(cmd, rule->check_opts, rule->check_opts_count, buf, sizeof(buf));
- log_error("Invalid options for command (%s %d): %s",
- commands[best_i].command_line_id, best_i, buf);
+ log_error("Invalid options for command: %s", buf);
return NULL;
}
if (opts_unmatch_count && (rule->rule == RULE_REQUIRE)) {
memset(buf, 0, sizeof(buf));
opt_array_to_str(cmd, rule->check_opts, rule->check_opts_count, buf, sizeof(buf));
- log_error("Required options for command (%s %d): %s",
- commands[best_i].command_line_id, best_i, buf);
+ log_error("Required options for command: %s", buf);
return NULL;
}
}
}
- log_debug("command line id: %s %d", commands[best_i].command_line_id, best_i);
+ log_debug("Using command index %d id %s enum %d.",
+ best_i, commands[best_i].command_id, commands[best_i].command_enum);
return &commands[best_i];
}
@@ -1801,8 +1619,8 @@ static void _short_usage(const char *name)
static int _usage(const char *name, int help_count)
{
- struct command_name *cname = _find_command_name(name);
- const char *usage_common = NULL;
+ struct command_name *cname = find_command_name(name);
+ struct command *cmd;
int i;
if (!cname) {
@@ -1812,28 +1630,20 @@ static int _usage(const char *name, int help_count)
log_print("%s - %s\n", name, cname->desc);
- for (i = 0; i < _cmdline.num_commands; i++) {
+ for (i = 0; i < COMMAND_COUNT; i++) {
if (strcmp(_cmdline.commands[i].name, name))
continue;
if ((_cmdline.commands[i].cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && (help_count < 3))
continue;
- if (strlen(_cmdline.commands[i].desc))
- _print_description(i);
-
- usage_common = _cmdline.commands[i].usage_common;
-
- _print_usage(_cmdline.commands[i].usage, 0);
- log_print(" "); /* for built-in \n */
+ print_usage(&_cmdline.commands[i]);
+ cmd = &_cmdline.commands[i];
+ printf("\n");
}
/* Common options are printed once for all variants of a command name. */
- if (usage_common) {
- log_print("Common options:");
- _print_usage(usage_common, 0);
- log_print(" "); /* for built-in \n */
- }
+ print_usage_common(cname, cmd);
if (help_count > 1) {
/*
@@ -1957,7 +1767,7 @@ static int _find_arg(const char *cmd_name, int goval)
int arg_enum;
int i;
- if (!(cname = _find_command_name(cmd_name)))
+ if (!(cname = find_command_name(cmd_name)))
return -1;
for (i = 0; i < cname->num_args; i++) {
@@ -1989,7 +1799,7 @@ static int _process_command_line(struct cmd_context *cmd, int *argc, char ***arg
int goval; /* the number returned from getopt_long identifying what it found */
int i;
- if (!(cname = _find_command_name(cmd->name)))
+ if (!(cname = find_command_name(cmd->name)))
return_0;
if (!(cmd->opt_arg_values = dm_pool_zalloc(cmd->mem, sizeof(*cmd->opt_arg_values) * ARG_COUNT))) {
@@ -2686,7 +2496,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
log_debug("Parsing: %s", cmd->cmd_line);
- if (!(cmd->cname = _find_command_name(cmd->name))) {
+ if (!(cmd->cname = find_command_name(cmd->name))) {
log_error("Command name not found.\n");
return EINVALID_CMD_LINE;
}
@@ -2857,7 +2667,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
}
if (cmd->command->functions)
- /* A command-line--specific function is used */
+ /* A command-line-specific function is used */
ret = cmd->command->functions->fn(cmd, argc, argv);
else
/* The old style command-name function is used */
@@ -3388,3 +3198,4 @@ int lvm2_main(int argc, char **argv)
lvm_fin(cmd);
return lvm_return_code(ret);
}
+
diff --git a/tools/toollib.c b/tools/toollib.c
index 2c0096f..3b47989 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -2692,8 +2692,8 @@ static int _check_lv_types(struct cmd_context *cmd, struct logical_volume *lv, i
return 1;
if (!val_bit_is_set(cmd->command->required_pos_args[pos-1].def.val_bits, lv_VAL)) {
- log_error(INTERNAL_ERROR "Command (%s %d) arg position %d does not permit an LV (%llx)",
- cmd->command->command_line_id, cmd->command->command_line_enum,
+ log_error(INTERNAL_ERROR "Command %d:%s arg position %d does not permit an LV (%llx)",
+ cmd->command->command_index, cmd->command->command_id,
pos, (unsigned long long)cmd->command->required_pos_args[pos-1].def.val_bits);
return 0;
}
@@ -3109,9 +3109,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
if (!_check_lv_types(cmd, lvl->lv, lv_arg_pos)) {
/* FIXME: include this result in report log? */
if (lv_is_named_arg) {
- log_error("Operation not permitted (%s %d) on LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lvl->lv));
+ log_error("Operation not permitted on LV %s.", display_lvname(lvl->lv));
ret_max = ECMD_FAILED;
}
continue;
@@ -3120,9 +3118,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
if (!_check_lv_rules(cmd, lvl->lv)) {
/* FIXME: include this result in report log? */
if (lv_is_named_arg) {
- log_error("Operation not permitted (%s %d) on LV %s.",
- cmd->command->command_line_id, cmd->command->command_line_enum,
- display_lvname(lvl->lv));
+ log_error("Operation not permitted on LV %s.", display_lvname(lvl->lv));
ret_max = ECMD_FAILED;
}
continue;
diff --git a/tools/tools.h b/tools/tools.h
index 392490f..4e1d87f 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -50,6 +50,13 @@
#define CMD_LEN 256
#define MAX_ARGS 64
+/* define the enums for each unique ID in command defs in command-lines.in */
+enum {
+#define cmd(a, b) a ,
+#include "cmds.h"
+#undef cmd
+};
+
/* define the enums for the values accepted by command line --options, foo_VAL */
enum {
#define val(a, b, c, d) a ,
@@ -84,6 +91,7 @@ enum {
};
#include "command.h"
+#include "command-count.h"
#define ARG_COUNTABLE 0x00000001 /* E.g. -vvvv */
#define ARG_GROUPABLE 0x00000002 /* E.g. --addtag */
7 years, 3 months
master - lvconvert: remove unused code
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=942dc07402747d...
Commit: 942dc07402747d00946c5e80d890d535c0cbd125
Parent: f067c0ad78cc894a2d620c38af4d74b679d5c316
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Fri Feb 10 11:34:12 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:20:10 2017 -0600
lvconvert: remove unused code
For "split" which is not an alias for splitmirrors.
---
tools/lvconvert.c | 46 +++++++---------------------------------------
1 files changed, 7 insertions(+), 39 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 1d7dc1b..2ccf264 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -24,7 +24,6 @@ typedef enum {
* For a mirrored or raid LV, split mirror into two mirrors, optionally tracking
* future changes to the main mirror to allow future recombination.
*/
- CONV_SPLIT = 1,
CONV_SPLIT_MIRRORS = 2,
/* Every other segment type or mirror log conversion we haven't separated out */
@@ -33,7 +32,6 @@ typedef enum {
struct lvconvert_params {
/* Exactly one of these 12 command categories is determined */
- int split; /* 1 */
int keep_mimages; /* 2 */ /* --splitmirrors */
/* other */ /* 3 */
@@ -169,34 +167,21 @@ static int _read_params(struct cmd_context *cmd, struct lvconvert_params *lp)
lp->mirrorlog = 1;
}
- if (arg_is_set(cmd, split_ARG)) {
- if (arg_outside_list_is_set(cmd, "cannot be used with --split",
- split_ARG,
- name_ARG,
- force_ARG, noudevsync_ARG, test_ARG,
- -1))
- return_0;
- lp->split = 1;
- _set_conv_type(lp, CONV_SPLIT);
- }
-
if (arg_is_set(cmd, trackchanges_ARG))
lp->track_changes = 1;
- if (lp->split) {
- if ((lp->lv_split_name = arg_str_value(cmd, name_ARG, NULL))) {
- if (!validate_restricted_lvname_param(cmd, &vg_name, &lp->lv_split_name))
- return_0;
- }
-
-
/*
* The '--splitmirrors n' argument is equivalent to '--mirrors -n'
* (note the minus sign), except that it signifies the additional
* intent to keep the mimage that is detached, rather than
* discarding it.
*/
- } else if (arg_is_set(cmd, splitmirrors_ARG)) {
+ if (arg_is_set(cmd, splitmirrors_ARG)) {
+ if ((lp->lv_split_name = arg_str_value(cmd, name_ARG, NULL))) {
+ if (!validate_restricted_lvname_param(cmd, &vg_name, &lp->lv_split_name))
+ return_0;
+ }
+
if (_mirror_or_raid_type_requested(cmd, lp->type_str)) {
log_error("--mirrors/--type mirror/--type raid* and --splitmirrors are "
"mutually exclusive.");
@@ -217,20 +202,11 @@ static int _read_params(struct cmd_context *cmd, struct lvconvert_params *lp)
_set_conv_type(lp, CONV_SPLIT_MIRRORS);
lp->mirrors = arg_uint_value(cmd, splitmirrors_ARG, 0);
lp->mirrors_sign = SIGN_MINUS;
- } else {
- if (lp->track_changes) {
- log_error("--trackchanges is only valid with --splitmirrors.");
- return 0;
- }
- if (arg_is_set(cmd, name_ARG)) {
- log_error("The 'name' argument is only valid with --splitmirrors");
- return 0;
- }
}
/* If no other case was identified, then use of --stripes means --type striped */
if (!arg_is_set(cmd, type_ARG) && !*lp->type_str &&
- !lp->split && !lp->mirrorlog && !lp->corelog &&
+ !lp->mirrorlog && !lp->corelog &&
(arg_is_set(cmd, stripes_long_ARG) || arg_is_set(cmd, stripesize_ARG)))
lp->type_str = SEG_TYPE_NAME_STRIPED;
@@ -251,21 +227,13 @@ static int _read_params(struct cmd_context *cmd, struct lvconvert_params *lp)
lp->alloc = (alloc_policy_t) arg_uint_value(cmd, alloc_ARG, ALLOC_INHERIT);
- /* We should have caught all these cases already. */
- if (lp->split + lp->keep_mimages > 1) {
- log_error(INTERNAL_ERROR "Unexpected combination of incompatible options selected.");
- return 0;
- }
-
/*
* Final checking of each case:
- * lp->split
* lp->keep_mimages
* --type mirror|raid lp->mirrorlog lp->corelog
* --type raid0|striped
*/
switch(lp->conv_type) {
- case CONV_SPLIT:
case CONV_SPLIT_MIRRORS:
break;
7 years, 3 months
master - args: split is a synonym for splitcache
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f067c0ad78cc89...
Commit: f067c0ad78cc894a2d620c38af4d74b679d5c316
Parent: c3e1838382122e254aaf9bda6159bc5e95303309
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Thu Jan 19 13:47:24 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:20:10 2017 -0600
args: split is a synonym for splitcache
also tidy the other synonyms
---
tools/args.h | 59 +++++++++++++++++++++--------------------------
tools/command-lines.in | 1 +
tools/lvmcmdline.c | 4 +++
3 files changed, 31 insertions(+), 33 deletions(-)
diff --git a/tools/args.h b/tools/args.h
index 8802cd7..1d7d6f7 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -133,9 +133,6 @@ arg(configreport_ARG, '\0', "configreport", configreport_VAL, ARG_GROUPABLE, 1,
arg(configtype_ARG, '\0', "typeconfig", configtype_VAL, 0, 0,
"See lvmreport(7).\n")
-arg(corelog_ARG, '\0', "corelog", 0, 0, 0,
- "An alias for --mirrorlog core.\n")
-
arg(dataalignment_ARG, '\0', "dataalignment", sizekb_VAL, 0, 0,
"Align the start of the data to a multiple of this number.\n"
"Also specify an appropriate Physical Extent size when creating a VG.\n"
@@ -288,10 +285,6 @@ arg(mergedconfig_ARG, '\0', "mergedconfig", 0, 0, 0,
"cascade is displayed.\n"
"See lvm.conf(5) for more information about config.\n")
-arg(metadatacopies_ARG, '\0', "metadatacopies", metadatacopies_VAL, 0, 0,
- "For commands starting with 'pv', this is an alias for --pvmetadatacopies.\n"
- "For commands starting with 'vg', this is an alias for --vgmetadatacopies.\n")
-
arg(metadataignore_ARG, '\0', "metadataignore", bool_VAL, 0, 0,
"Specifies the metadataignore property of a PV.\n"
"If yes, metadata areas on the PV are ignored, and lvm will\n"
@@ -440,24 +433,6 @@ arg(pvmetadatacopies_ARG, '\0', "pvmetadatacopies", pvmetadatacopies_VAL, 0, 0,
"This may be useful in VGs containing many PVs (this places limitations\n"
"on the ability to use vgsplit later.)\n")
-arg(raidrebuild_ARG, '\0', "raidrebuild", pv_VAL, ARG_GROUPABLE, 0,
- "An alias for --rebuild.\n")
-
-arg(raidmaxrecoveryrate_ARG, '\0', "raidmaxrecoveryrate", sizekb_VAL, 0, 0,
- "An alias for --maxrecoveryrate.\n")
-
-arg(raidminrecoveryrate_ARG, '\0', "raidminrecoveryrate", sizekb_VAL, 0, 0,
- "An alias for --minrecoveryrate.\n")
-
-arg(raidsyncaction_ARG, '\0', "raidsyncaction", syncaction_VAL, 0, 0,
- "An alias for --syncaction.\n")
-
-arg(raidwritebehind_ARG, '\0', "raidwritebehind", number_VAL, 0, 0,
- "An alias for --writebehind.\n")
-
-arg(raidwritemostly_ARG, '\0', "raidwritemostly", writemostly_VAL, ARG_GROUPABLE, 0,
- "An alias for --writemostly.\n")
-
arg(readonly_ARG, '\0', "readonly", 0, 0, 0,
"Run the command in a special read-only mode which will read on-disk\n"
"metadata without needing to take any locks. This can be used to peek\n"
@@ -571,9 +546,6 @@ arg(sinceversion_ARG, '\0', "sinceversion", string_VAL, 0, 0,
"This option is currently applicable only with --type new\n"
"to display all configuration settings introduced since given version.\n")
-/* Not used */
-arg(split_ARG, '\0', "split", 0, 0, 0, NULL)
-
arg(splitcache_ARG, '\0', "splitcache", 0, 0, 0,
"Separates a cache pool from a cache LV, and keeps the unused cache pool LV.\n"
"Before the separation, the cache is flushed. Also see --uncache.\n")
@@ -732,9 +704,6 @@ arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", vgmetadatacopies_VAL, 0, 0,
"\\fBall\\fP causes LVM to first clear the metadataignore flags on\n"
"all PVs, and then to become unmanaged.\n")
-arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", sizemb_VAL, 0, 0,
- "An alias for --virtualsize.\n")
-
arg(withsummary_ARG, '\0', "withsummary", 0, 0, 0,
"Display a one line comment for each configuration node.\n")
@@ -768,10 +737,34 @@ arg(writemostly_ARG, '\0', "writemostly", writemostly_VAL, ARG_GROUPABLE, 0,
"the suffix \\fB:t\\fP. Repeat this option to change the attribute on\n"
"multiple PVs.\n")
-/* Allow some variations */
+/*
+ * Synonyms of other options.
+ *
+ * Only the standard option names are used in command definitions.
+ *
+ * If used on the command line, lvm automatically translates them
+ * to the standard option name.
+ *
+ * The generated help and man output does not include
+ * these variants. The description of the standard option names
+ * can mention a synonym, or in some cases the man page generation
+ * recognizes some of these and prints the option name to include
+ * the variant, e.g. man page generation prints --[raid]writebehind.
+ */
+arg(corelog_ARG, '\0', "corelog", 0, 0, 0, NULL)
+arg(resizable_ARG, '\0', "resizable", bool_VAL, 0, 0, NULL)
arg(allocation_ARG, '\0', "allocation", bool_VAL, 0, 0, NULL)
arg(available_ARG, '\0', "available", activation_VAL, 0, 0, NULL)
-arg(resizable_ARG, '\0', "resizable", bool_VAL, 0, 0, NULL)
+arg(raidrebuild_ARG, '\0', "raidrebuild", pv_VAL, ARG_GROUPABLE, 0, NULL)
+arg(raidsyncaction_ARG, '\0', "raidsyncaction", syncaction_VAL, 0, 0, NULL)
+arg(raidwritemostly_ARG, '\0', "raidwritemostly", writemostly_VAL, ARG_GROUPABLE, 0, NULL)
+arg(raidminrecoveryrate_ARG, '\0', "raidminrecoveryrate", sizekb_VAL, 0, 0, NULL)
+arg(raidmaxrecoveryrate_ARG, '\0', "raidmaxrecoveryrate", sizekb_VAL, 0, 0, NULL)
+arg(raidwritebehind_ARG, '\0', "raidwritebehind", number_VAL, 0, 0, NULL)
+arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", sizemb_VAL, 0, 0, NULL)
+arg(split_ARG, '\0', "split", 0, 0, 0, NULL)
+arg(metadatacopies_ARG, '\0', "metadatacopies", metadatacopies_VAL, 0, 0, NULL)
+
/*
* ... and now the short args.
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 81c70ba..4cc51fe 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -106,6 +106,7 @@
# maxrecoveryrate (raidmaxrecoveryrate)
# writebehind (raidwritebehind)
# virtualsize (virtualoriginsize)
+# splitcache (split)
# vgmetadatacopies (metadatacopies)
# pvmetadatacopies (metadatacopies)
#
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index dda4b16..4039dd9 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -940,6 +940,8 @@ static int _opt_standard_to_synonym(const char *cmd_name, int opt)
return raidwritebehind_ARG;
case virtualsize_ARG:
return virtualoriginsize_ARG;
+ case splitcache_ARG:
+ return split_ARG;
case pvmetadatacopies_ARG:
if (!strncmp(cmd_name, "pv", 2))
return metadatacopies_ARG;
@@ -977,6 +979,8 @@ static int _opt_synonym_to_standard(const char *cmd_name, int opt)
return writebehind_ARG;
case virtualoriginsize_ARG:
return virtualsize_ARG;
+ case split_ARG:
+ return splitcache_ARG;
case metadatacopies_ARG:
if (!strncmp(cmd_name, "pv", 2))
return pvmetadatacopies_ARG;
7 years, 3 months
master - man: lvmthin updates
by David Teigland
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c3e1838382122e...
Commit: c3e1838382122e254aaf9bda6159bc5e95303309
Parent: 15d9f2850e60a44cfc55d48ce108b4a82aecd9ae
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Mon Jan 16 16:26:14 2017 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Mon Feb 13 08:20:10 2017 -0600
man: lvmthin updates
Some minor changes to some of the command syntaxes
to use more standard forms.
---
man/lvmthin.7.in | 21 +++++++++------------
1 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/man/lvmthin.7.in b/man/lvmthin.7.in
index ce86974..714233e 100644
--- a/man/lvmthin.7.in
+++ b/man/lvmthin.7.in
@@ -157,17 +157,17 @@ The --thinpool argument specifies which thin pool will
contain the ThinLV.
.fi
-.B lvcreate \-n ThinLV \-V VirtualSize \-\-thinpool VG/ThinPoolLV
+.B lvcreate \-n ThinLV \-V VirtualSize \-\-thinpool ThinPoolLV VG
.I Example
.br
Create a thin LV in a thin pool:
.br
-# lvcreate \-n thin1 \-V 1T \-\-thinpool vg/pool0
+# lvcreate \-n thin1 \-V 1T \-\-thinpool pool0 vg
Create another thin LV in the same thin pool:
.br
-# lvcreate \-n thin2 \-V 1T \-\-thinpool vg/pool0
+# lvcreate \-n thin2 \-V 1T \-\-thinpool pool0 vg
# lvs vg/thin1 vg/thin2
LV VG Attr LSize Pool Origin Data%
@@ -184,9 +184,9 @@ when creating a thin snapshot.
.br
A size argument will cause an old COW snapshot to be created.
-.B lvcreate \-n SnapLV \-s VG/ThinLV
+.B lvcreate \-n SnapLV \-\-snapshot VG/ThinLV
.br
-.B lvcreate \-n SnapLV \-s VG/PrevSnapLV
+.B lvcreate \-n SnapLV \-\-snapshot VG/PrevSnapLV
.I Example
.br
@@ -286,15 +286,12 @@ The fully specified syntax for creating a thin pool LV shown above is:
.B lvconvert \-\-type thin-pool \-\-poolmetadata VG/ThinMetaLV VG/ThinDataLV
-An existing LV is converted to a thin pool by changing its type to
-thin-pool. An alternate syntax may be used for the same operation:
+An alternate syntax may be used for the same operation:
.B lvconvert \-\-thinpool VG/ThinDataLV \-\-poolmetadata VG/ThinMetaLV
-The thin-pool type is inferred by lvm; the --thinpool option is not an
-alias for --type thin-pool. The use of the --thinpool option here is
-different from the use of the --thinpool option when creating a thin LV,
-where it specifies the pool in which the thin LV is created.
+The thin-pool type is inferred by lvm; the \-\-thinpool option is not an
+alias for \-\-type thin\-pool.
.SS Automatic pool metadata LV
@@ -1234,7 +1231,7 @@ and creates a thin LV in the new pool.
.br
\-V VirtualSize specifies the virtual size of the thin LV.
-.B lvcreate \-V VirtualSize \-L LargeSize
+.B lvcreate \-\-type thin \-V VirtualSize \-L LargeSize
.RS
.B \-n ThinLV \-\-thinpool VG/ThinPoolLV
.RE
7 years, 3 months