diff --git a/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch b/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch new file mode 100644 index 0000000..2250e1c --- /dev/null +++ b/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch @@ -0,0 +1,1137 @@ + WHATS_NEW | 4 + + configure | 6 +- + configure.ac | 8 +- + include/configure.h.in | 2 +- + man/Makefile.in | 2 +- + man/lvm_import_vdo.8_main | 92 ++++++++++++ + man/vdoimport.8_main | 92 ------------ + scripts/Makefile.in | 2 +- + scripts/lvm_import_vdo.sh | 376 ++++++++++++++++++++++++++++++++++++++++++++++ + scripts/vdoimport.sh | 376 ---------------------------------------------- + test/Makefile.in | 2 +- + test/shell/vdo-convert.sh | 12 +- + 12 files changed, 489 insertions(+), 485 deletions(-) + create mode 100644 man/lvm_import_vdo.8_main + delete mode 100644 man/vdoimport.8_main + create mode 100755 scripts/lvm_import_vdo.sh + delete mode 100755 scripts/vdoimport.sh + +diff --git a/WHATS_NEW b/WHATS_NEW +index 5556789..3637e31 100644 +--- a/WHATS_NEW ++++ b/WHATS_NEW +@@ -1,3 +1,7 @@ ++Version 2.03.14 - ++================================== ++ Rename vdoimport to lvm_import_vdo. ++ + Version 2.03.13 - + =============================== + Support --poolmetadataspare with vgsplit and vgmerge. +diff --git a/configure b/configure +index 661702d..897a810 100755 +--- a/configure ++++ b/configure +@@ -12379,8 +12379,8 @@ $as_echo "$FSADM" >&6; } + + + ################################################################################ +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install vdoimport" >&5 +-$as_echo_n "checking whether to install vdoimport... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install lvm_import_vdo" >&5 ++$as_echo_n "checking whether to install lvm_import_vdo... " >&6; } + # Check whether --enable-vdoimport was given. + if test "${enable_vdoimport+set}" = set; then : + enableval=$enable_vdoimport; VDOIMPORT=$enableval +@@ -13875,7 +13875,7 @@ cat >>confdefs.h <<_ACEOF + _ACEOF + + +-VDOIMPORT_PATH="$SBINDIR/vdoimport" ++VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo" + + cat >>confdefs.h <<_ACEOF + #define VDOIMPORT_PATH "$VDOIMPORT_PATH" +diff --git a/configure.ac b/configure.ac +index 5a8b486..f769a63 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1295,8 +1295,8 @@ AC_MSG_RESULT($FSADM) + + + ################################################################################ +-dnl -- Enable vdoimport +-AC_MSG_CHECKING(whether to install vdoimport) ++dnl -- Enable lvm_import_vdo ++AC_MSG_CHECKING(whether to install lvm_import_vdo) + AC_ARG_ENABLE(vdoimport, AC_HELP_STRING([--disable-vdoimport], [disable vdoimport]), + VDOIMPORT=$enableval) + AC_MSG_RESULT($VDOIMPORT) +@@ -1656,8 +1656,8 @@ USRSBINDIR="$(eval echo $(eval echo $usrsbindir))" + FSADM_PATH="$SBINDIR/fsadm" + AC_DEFINE_UNQUOTED(FSADM_PATH, ["$FSADM_PATH"], [Path to fsadm binary.]) + +-VDOIMPORT_PATH="$SBINDIR/vdoimport" +-AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to vdoimport binary.]) ++VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo" ++AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to lvm_import_vdo binary.]) + + ################################################################################ + dnl -- dmeventd pidfile and executable path +diff --git a/include/configure.h.in b/include/configure.h.in +index 6df8d89..028ae48 100644 +--- a/include/configure.h.in ++++ b/include/configure.h.in +@@ -684,7 +684,7 @@ + /* Enable a valgrind aware build of pool */ + #undef VALGRIND_POOL + +-/* Path to vdoimport binary. */ ++/* Path to lvm_import_vdo binary. */ + #undef VDOIMPORT_PATH + + /* The path to 'vdoformat', if available. */ +diff --git a/man/Makefile.in b/man/Makefile.in +index d60a92c..45ebf54 100644 +--- a/man/Makefile.in ++++ b/man/Makefile.in +@@ -23,7 +23,7 @@ else + endif + + FSADMMAN = fsadm.8 +-VDOIMPORTMAN = vdoimport.8 ++VDOIMPORTMAN = lvm_import_vdo.8 + BLKDEACTIVATEMAN = blkdeactivate.8 + DMEVENTDMAN = dmeventd.8 + DMFILEMAPDMAN = dmfilemapd.8 +diff --git a/man/lvm_import_vdo.8_main b/man/lvm_import_vdo.8_main +new file mode 100644 +index 0000000..ee817a0 +--- /dev/null ++++ b/man/lvm_import_vdo.8_main +@@ -0,0 +1,92 @@ ++.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" ++. ++.SH "NAME" ++. ++lvm_import_vdo \(em utility to import VDO volumes into a new volume group. ++. ++.SH SYNOPSIS ++. ++.PD 0 ++.ad l ++.TP 10 ++.B lvm_import_vdo ++.RI [ options ] ++.IR device ++. ++.PD ++. ++.SH DESCRIPTION ++. ++lvm_import_vdo utility imports VDO volumes created and managed by ++.BR vdo (8) ++manager into ++.BR lvm2 (8) ++managed VDO LV. This is realized by moving VDO superblock by 2MiB ++and creating lvm2 metadata at the front of this device. The operation is not reversible, ++thus after conversion to lvm2 the access to VDO data is only possible with ++.BR lvm2 (8) ++commands, ++.BR vdo (8) ++manager no longer control such volume. ++. ++.SH OPTIONS ++. ++.TP ++.BR -f | --force ++Bypass some sanity checks. ++. ++.TP ++.BR -h | --help ++Display the help text. ++. ++.TP ++.BR -n | --name ++Specifies the name of converted VDO LV. When the name is not specified, ++some automatic name is selected. In case the converted VDO volume is ++already using LV a backend device, the name of this LV is used for VDO LV. ++In this case also the of volume group must stay same. ++. ++.TP ++.BR -v | --verbose ++Be more verbose. ++. ++.TP ++.BR -y | --yes ++Answer "yes" at any prompts. ++. ++.TP ++.BR --dry-run ++Print commands without running them. ++. ++. ++.SH DIAGNOSTICS ++. ++On successful completion, the status code is 0. ++A status code of 1 is used for failure. ++. ++.SH EXAMPLES ++. ++Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. ++.P ++# ++.B lvm_import_vdo --name VG1/LV1 /dev/mapper/vdo-volume ++. ++.SH ENVIRONMENT VARIABLES ++. ++.TP ++.B TMPDIR ++The temporary directory name for mount points. Defaults to "\fI/tmp\fP". ++.TP ++.B DM_DEV_DIR ++The device directory name. ++Defaults to "\fI/dev\fP" and must be an absolute path. ++. ++.SH SEE ALSO ++. ++.nh ++.ad l ++.BR lvm (8), ++.BR lvm.conf (5), ++.P ++.BR vdo (8), ++.BR vdo2lvm (8), +diff --git a/man/vdoimport.8_main b/man/vdoimport.8_main +deleted file mode 100644 +index 1f32909..0000000 +--- a/man/vdoimport.8_main ++++ /dev/null +@@ -1,92 +0,0 @@ +-.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" +-. +-.SH "NAME" +-. +-vdoimport \(em utility to import VDO volumes into a new volume group. +-. +-.SH SYNOPSIS +-. +-.PD 0 +-.ad l +-.TP 10 +-.B vdoimport +-.RI [ options ] +-.IR device +-. +-.PD +-. +-.SH DESCRIPTION +-. +-vdoimport utility imports VDO volumes created and managed by +-.BR vdo (8) +-manager into +-.BR lvm2 (8) +-managed VDO LV. This is realized by moving VDO superblock by 2MiB +-and creating lvm2 metadata at the front of this device. The operation is not reversible, +-thus after conversion to lvm2 the access to VDO data is only possible with +-.BR lvm2 (8) +-commands, +-.BR vdo (8) +-manager no longer control such volume. +-. +-.SH OPTIONS +-. +-.TP +-.BR -f | --force +-Bypass some sanity checks. +-. +-.TP +-.BR -h | --help +-Display the help text. +-. +-.TP +-.BR -n | --name +-Specifies the name of converted VDO LV. When the name is not specified, +-some automatic name is selected. In case the converted VDO volume is +-already using LV a backend device, the name of this LV is used for VDO LV. +-In this case also the of volume group must stay same. +-. +-.TP +-.BR -v | --verbose +-Be more verbose. +-. +-.TP +-.BR -y | --yes +-Answer "yes" at any prompts. +-. +-.TP +-.BR --dry-run +-Print commands without running them. +-. +-. +-.SH DIAGNOSTICS +-. +-On successful completion, the status code is 0. +-A status code of 1 is used for failure. +-. +-.SH EXAMPLES +-. +-Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. +-.P +-# +-.B vdoimport --name VG1/LV1 /dev/mapper/vdo-volume +-. +-.SH ENVIRONMENT VARIABLES +-. +-.TP +-.B TMPDIR +-The temporary directory name for mount points. Defaults to "\fI/tmp\fP". +-.TP +-.B DM_DEV_DIR +-The device directory name. +-Defaults to "\fI/dev\fP" and must be an absolute path. +-. +-.SH SEE ALSO +-. +-.nh +-.ad l +-.BR lvm (8), +-.BR lvm.conf (5), +-.P +-.BR vdo (8), +-.BR vdo2lvm (8), +diff --git a/scripts/Makefile.in b/scripts/Makefile.in +index 1fe88ca..f16c37d 100644 +--- a/scripts/Makefile.in ++++ b/scripts/Makefile.in +@@ -32,7 +32,7 @@ ifeq ("@FSADM@", "yes") + endif + + ifeq ("@VDOIMPORT@", "yes") +- LVM_SCRIPTS += vdoimport.sh ++ LVM_SCRIPTS += lvm_import_vdo.sh + endif + + ifeq ("@BLKDEACTIVATE@", "yes") +diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh +new file mode 100755 +index 0000000..35140a0 +--- /dev/null ++++ b/scripts/lvm_import_vdo.sh +@@ -0,0 +1,376 @@ ++#!/bin/bash ++# ++# Copyright (C) 2021 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 General Public License v.2. ++# ++# You should have received a copy of the GNU 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 ++# ++# Author: Zdenek Kabelac <zkabelac at redhat.com> ++# ++# Script for converting VDO volumes to lvm2 VDO LVs ++# ++# Needed utilities: ++# lvm, dmsetup, ++# vdo, vdo2lvm, ++# grep, awk, sed, blockdev, readlink, mkdir ++# ++# Conversion is using 'vdo convert' support from VDO manager to move ++# existing VDO header by 2M which makes space to place in PV header ++# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. ++# ++ ++set -euE -o pipefail ++ ++TOOL=lvm_import_vdo ++ ++_SAVEPATH=$PATH ++PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" ++ ++# user may override lvm location by setting LVM_BINARY ++LVM=${LVM_BINARY:-lvm} ++VDO=${VDO_BINARY:-vdo} ++VDOCONF=${VDOCONF:-} ++BLOCKDEV="blockdev" ++READLINK="readlink" ++READLINK_E="-e" ++MKDIR="mkdir" ++ ++TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" ++DM_DEV_DIR="${DM_DEV_DIR:-/dev}" ++ ++DRY=0 ++VERB="" ++FORCE="" ++YES="" ++ ++# default name for converted VG and its VDO LV ++NAME="vdovg/vdolvol" ++ ++# help message ++tool_usage() { ++ echo "${TOOL}: Utility to convert VDO volume to VDO LV." ++ echo ++ echo " ${TOOL} [options] <vdo_device_path>" ++ echo ++ echo " Options:" ++ echo " -f | --force Bypass sanity checks" ++ echo " -h | --help Show this help message" ++ echo " -n | --name Specifies VG/LV name for converted VDO volume" ++ echo " -v | --verbose Be verbose" ++ echo " -y | --yes Answer \"yes\" at any prompts" ++ echo " --dry-run Print commands without running them" ++ ++ exit ++} ++ ++verbose() { ++ test -z "$VERB" || echo "$TOOL:" "$@" ++} ++ ++# Support multi-line error messages ++error() { ++ for i in "$@" ; do ++ echo "$TOOL: $i" >&2 ++ done ++ cleanup 1 ++} ++ ++dry() { ++ if [ "$DRY" -ne 0 ]; then ++ verbose "Dry execution" "$@" ++ return 0 ++ fi ++ verbose "Executing" "$@" ++ "$@" ++} ++ ++cleanup() { ++ trap '' 2 ++ ++ rm -rf "$TEMPDIR" ++ # error exit status for break ++ exit "${1:-1}" ++} ++ ++get_enabled_value_() { ++ case "$1" in ++ enabled) echo "1" ;; ++ *) echo "0" ;; ++ esac ++} ++ ++get_kb_size_with_unit_() { ++ case "$1" in ++ *[kK]) echo $(( ${1%[kK]} )) ;; ++ *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; ++ *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; ++ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; ++ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; ++ esac ++} ++ ++get_mb_size_with_unit_() { ++ case "$1" in ++ *[mM]) echo $(( ${1%[mM]} )) ;; ++ *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; ++ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; ++ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; ++ esac ++} ++ ++# Figure out largest possible extent size usable for VG ++# $1 physical size ++# $2 logical size ++get_largest_extent_size_() { ++ local max=4 ++ local i ++ local d ++ ++ for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do ++ d=$(( $1 / i )) ++ test $(( d * i )) -eq "$1" || break ++ d=$(( $2 / i )) ++ test $(( d * i )) -eq "$2" || break ++ max=$i ++ done ++ echo "$max" ++} ++ ++# detect LV on the given device ++# dereference device name if it is symbolic link ++detect_lv_() { ++ local DEVICE=$1 ++ local MAJOR ++ local MINOR ++ local SYSVOLUME ++ local MAJORMINOR ++ ++ DEVICE=${1/#"${DM_DEV_DIR}/"/} ++ DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") ++ test -n "$DEVICE" || error "Cannot get readlink \"$1\"." ++ RDEVICE=$DEVICE ++ case "$RDEVICE" in ++ # hardcoded /dev since udev does not create these entries elsewhere ++ /dev/dm-[0-9]*) ++ read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" ++ read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." ++ MAJOR=${MAJORMINOR%%:*} ++ MINOR=${MAJORMINOR##*:} ++ ;; ++ *) ++ STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") ++ test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." ++ eval "$STAT" ++ ;; ++ esac ++ ++ eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" ++} ++ ++# parse yaml config files into 'prefix_yaml_part_names=("value")' strings ++parse_yaml_() { ++ local yaml_file=$1 ++ local prefix=$2 ++ local s ++ local w ++ local fs ++ ++ s='[[:space:]]*' ++ w='[a-zA-Z0-9_.-]*' ++ fs="$(echo @|tr @ '\034')" ++ ++ ( ++ sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ ++ -e 's/\$/\\\$/g' \ ++ -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ ++ -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ ++ -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | ++ ++ awk -F"$fs" '{ ++ indent = length($1)/2; ++ if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} ++ vname[indent] = $2; ++ for (i in vname) {if (i > indent) {delete vname[i]}} ++ if (length($3) > 0) { ++ vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} ++ printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3); ++ } ++ }' | ++ ++ sed -e 's/_=/+=/g' | ++ ++ awk 'BEGIN { ++ FS="="; ++ OFS="=" ++ } ++ /(-|\.).*=/ { ++ gsub("-|\\.", "_", $1) ++ } ++ { print }' ++ ) < "$yaml_file" ++} ++ ++# convert existing VDO volume into lvm2 volume ++convert2lvm_() { ++ local DEVICE=$1 ++ local VGNAME=${NAME%/*} ++ local LVNAME=${NAME#*/} ++ local VDONAME ++ local TRVDONAME ++ local EXTENTSZ ++ local IS_LV=1 ++ ++ DM_UUID="" ++ detect_lv_ "$DEVICE" ++ case "$DM_UUID" in ++ LVM-*) eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")" ++ if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then ++ VGNAME=$DM_VG_NAME ++ elif test "$VGNAME" != "$DM_VG_NAME" ; then ++ error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"." ++ fi ++ ;; ++ *) IS_LV=0 ++ # Check $VGNANE does not already exists ++ "$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"." ++ ;; ++ esac ++ ++ verbose "Checked whether device $1 is already LV ($IS_LV)." ++ ++ "$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR." ++ ++ verbose "Getting YAML VDO configuration." ++ "$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml" ++ ++ VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") ++ TRVDONAME=$(echo "$VDONAME" | tr '-' '_') ++ ++ # When VDO volume is 'active', check it's not mounted/being used ++ eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" ++ test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" ++ ++ #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ ++ eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" ++ ++ vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") ++ vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") ++ ++ verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." ++ verbose "With logical volume of size $vdo_logicalSize KiB." ++ ++ PARAMS=$(cat <<EOF ++allocation { ++ vdo_use_compression = $(get_enabled_value_ "$vdo_compression") ++ vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication") ++ vdo_use_metadata_hints=1 ++ vdo_minimum_io_size = $vdo_logicalBlockSize ++ vdo_block_map_cache_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize") ++ vdo_block_map_period = $vdo_blockMapPeriod ++ vdo_check_point_frequency = $vdo_indexCfreq ++ vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse") ++ vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}") ++ vdo_slab_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize") ++ vdo_ack_threads = $vdo_ackThreads ++ vdo_bio_threads = $vdo_bioThreads ++ vdo_bio_rotation = $vdo_bioRotationInterval ++ vdo_cpu_threads = $vdo_cpuThreads ++ vdo_hash_zone_threads = $vdo_hashZoneThreads ++ vdo_logical_threads = $vdo_logicalThreads ++ vdo_physical_threads = $vdo_physicalThreads ++ vdo_write_policy = $vdo_writePolicy ++ vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 )) ++ vdo_pool_header_size = 0 ++} ++EOF ++) ++ verbose "VDO conversion paramaters: $PARAMS" ++ ++ verbose "Stopping VDO volume." ++ dry "$VDO" stop $VDOCONF --name "$VDONAME" ++ ++ if [ "$IS_LV" = "0" ]; then ++ verbose "Moving VDO header by 2MiB." ++ dry "$VDO" convert $VDOCONF --force --name "$VDONAME" ++ ++ dry "$LVM" pvcreate $YES --dataalignment 2M "$DEVICE" || { ++ error "Creation of PV on \"$DEVICE\" failed, while VDO header has been already moved!" ++ } ++ ++ # Obtain free space in this new PV ++ # after 'vdo convert/vdo2lvm' call there is +2M free space at the front of the device ++ case "$DRY" in ++ 0) pvfree=$("$LVM" pvs -o devsize --units b --nosuffix --noheadings "$DEVICE") ;; ++ *) pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") ;; ++ esac ++ ++ pvfree=$(( pvfree / 1024 - 2048 )) # to KiB ++ else ++ pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$VGNAME/$LVNAME") ++ pvfree=$(( pvfree / 1024 )) # to KiB ++ fi ++ ++ # select largest possible extent size that can exactly express both sizes ++ EXTENTSZ=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize") ++ ++ if [ "$IS_LV" = "0" ]; then ++ verbose "Creating VG \"${NAME%/*}\" with extent size $EXTENTSZ KiB." ++ dry "$LVM" vgcreate $YES $VERB -s "${EXTENTSZ}k" "$VGNAME" "$DEVICE" || { ++ error "Creation of VG \"$VGNAME\" failed, while VDO header has been already moved!" ++ } ++ ++ verbose "Creating VDO pool data LV from all extents in volume group $VGNAME." ++ dry "$LVM" lvcreate -Zn -Wn $YES $VERB -l100%VG -n "${LVNAME}_vpool" "$VGNAME" ++ else ++ # validate existing VG extent_size can express virtual VDO size ++ vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME" || true) ++ vg_extent_size=$(( vg_extent_size / 1024 )) ++ ++ test "$vg_extent_size" -le "$EXTENTSZ" || { ++ error "Please vgchange extent_size to at most $EXTENTSZ KiB or extend and align virtual size on $vg_extent_size KiB." ++ } ++ verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV." ++ dry "$LVM" lvrename $YES $VERB "$VGNAME/$LVNAME" "$VGNAME/${LVNAME}_vpool" || { ++ error "Rename of LV \"$VGNAME/$LVNAME\" failed, while VDO header has been already moved!" ++ } ++ fi ++ ++ verbose "Converting to VDO pool." ++ dry "$LVM" lvconvert $YES $VERB $FORCE --config "$PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool" ++ ++ rm -fr "$TEMPDIR" ++} ++ ++############################# ++# start point of this script ++# - parsing parameters ++############################# ++trap "cleanup 2" 2 ++ ++test "$#" -eq 0 && tool_usage ++ ++while [ "$#" -ne 0 ] ++do ++ case "$1" in ++ "") ;; ++ "-f"|"--force" ) FORCE="-f" ;; ++ "-h"|"--help" ) tool_usage ;; ++ "-n"|"--name" ) shift; NAME=$1 ;; ++ "-v"|"--verbose") VERB="-v" ;; ++ "-y"|"--yes" ) YES="-y" ;; ++ "--dry-run" ) DRY="1" ;; ++ "-*") error "Wrong argument \"$1\". (see: $TOOL --help)" ;; ++ *) DEVICENAME=$1 ;; # device name does not start with '-' ++ esac ++ shift ++done ++ ++# do conversion ++convert2lvm_ "$DEVICENAME" +diff --git a/scripts/vdoimport.sh b/scripts/vdoimport.sh +deleted file mode 100755 +index ef96591..0000000 +--- a/scripts/vdoimport.sh ++++ /dev/null +@@ -1,376 +0,0 @@ +-#!/bin/bash +-# +-# Copyright (C) 2021 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 General Public License v.2. +-# +-# You should have received a copy of the GNU 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 +-# +-# Author: Zdenek Kabelac <zkabelac at redhat.com> +-# +-# Script for converting VDO volumes to lvm2 VDO LVs +-# +-# Needed utilities: +-# lvm, dmsetup, +-# vdo, vdo2lvm, +-# grep, awk, sed, blockdev, readlink, mkdir +-# +-# Conversion is using 'vdo convert' support from VDO manager to move +-# existing VDO header by 2M which makes space to place in PV header +-# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. +-# +- +-set -euE -o pipefail +- +-TOOL=vdoimport +- +-_SAVEPATH=$PATH +-PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" +- +-# user may override lvm location by setting LVM_BINARY +-LVM=${LVM_BINARY:-lvm} +-VDO=${VDO_BINARY:-vdo} +-VDOCONF=${VDOCONF:-} +-BLOCKDEV="blockdev" +-READLINK="readlink" +-READLINK_E="-e" +-MKDIR="mkdir" +- +-TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" +-DM_DEV_DIR="${DM_DEV_DIR:-/dev}" +- +-DRY=0 +-VERB="" +-FORCE="" +-YES="" +- +-# default name for converted VG and its VDO LV +-NAME="vdovg/vdolvol" +- +-# help message +-tool_usage() { +- echo "${TOOL}: Utility to convert VDO volume to VDO LV." +- echo +- echo " ${TOOL} [options] <vdo_device_path>" +- echo +- echo " Options:" +- echo " -f | --force Bypass sanity checks" +- echo " -h | --help Show this help message" +- echo " -n | --name Specifies VG/LV name for converted VDO volume" +- echo " -v | --verbose Be verbose" +- echo " -y | --yes Answer \"yes\" at any prompts" +- echo " --dry-run Print commands without running them" +- +- exit +-} +- +-verbose() { +- test -z "$VERB" || echo "$TOOL:" "$@" +-} +- +-# Support multi-line error messages +-error() { +- for i in "$@" ; do +- echo "$TOOL: $i" >&2 +- done +- cleanup 1 +-} +- +-dry() { +- if [ "$DRY" -ne 0 ]; then +- verbose "Dry execution" "$@" +- return 0 +- fi +- verbose "Executing" "$@" +- "$@" +-} +- +-cleanup() { +- trap '' 2 +- +- rm -rf "$TEMPDIR" +- # error exit status for break +- exit "${1:-1}" +-} +- +-get_enabled_value_() { +- case "$1" in +- enabled) echo "1" ;; +- *) echo "0" ;; +- esac +-} +- +-get_kb_size_with_unit_() { +- case "$1" in +- *[kK]) echo $(( ${1%[kK]} )) ;; +- *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; +- *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; +- *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; +- *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; +- esac +-} +- +-get_mb_size_with_unit_() { +- case "$1" in +- *[mM]) echo $(( ${1%[mM]} )) ;; +- *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; +- *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; +- *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; +- esac +-} +- +-# Figure out largest possible extent size usable for VG +-# $1 physical size +-# $2 logical size +-get_largest_extent_size_() { +- local max=4 +- local i +- local d +- +- for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do +- d=$(( $1 / i )) +- test $(( d * i )) -eq "$1" || break +- d=$(( $2 / i )) +- test $(( d * i )) -eq "$2" || break +- max=$i +- done +- echo "$max" +-} +- +-# detect LV on the given device +-# dereference device name if it is symbolic link +-detect_lv_() { +- local DEVICE=$1 +- local MAJOR +- local MINOR +- local SYSVOLUME +- local MAJORMINOR +- +- DEVICE=${1/#"${DM_DEV_DIR}/"/} +- DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") +- test -n "$DEVICE" || error "Cannot get readlink \"$1\"." +- RDEVICE=$DEVICE +- case "$RDEVICE" in +- # hardcoded /dev since udev does not create these entries elsewhere +- /dev/dm-[0-9]*) +- read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" +- read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." +- MAJOR=${MAJORMINOR%%:*} +- MINOR=${MAJORMINOR##*:} +- ;; +- *) +- STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") +- test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." +- eval "$STAT" +- ;; +- esac +- +- eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" +-} +- +-# parse yaml config files into 'prefix_yaml_part_names=("value")' strings +-parse_yaml_() { +- local yaml_file=$1 +- local prefix=$2 +- local s +- local w +- local fs +- +- s='[[:space:]]*' +- w='[a-zA-Z0-9_.-]*' +- fs="$(echo @|tr @ '\034')" +- +- ( +- sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ +- -e 's/\$/\\\$/g' \ +- -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ +- -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ +- -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | +- +- awk -F"$fs" '{ +- indent = length($1)/2; +- if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} +- vname[indent] = $2; +- for (i in vname) {if (i > indent) {delete vname[i]}} +- if (length($3) > 0) { +- vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} +- printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3); +- } +- }' | +- +- sed -e 's/_=/+=/g' | +- +- awk 'BEGIN { +- FS="="; +- OFS="=" +- } +- /(-|\.).*=/ { +- gsub("-|\\.", "_", $1) +- } +- { print }' +- ) < "$yaml_file" +-} +- +-# convert existing VDO volume into lvm2 volume +-convert2lvm_() { +- local DEVICE=$1 +- local VGNAME=${NAME%/*} +- local LVNAME=${NAME#*/} +- local VDONAME +- local TRVDONAME +- local EXTENTSZ +- local IS_LV=1 +- +- DM_UUID="" +- detect_lv_ "$DEVICE" +- case "$DM_UUID" in +- LVM-*) eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")" +- if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then +- VGNAME=$DM_VG_NAME +- elif test "$VGNAME" != "$DM_VG_NAME" ; then +- error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"." +- fi +- ;; +- *) IS_LV=0 +- # Check $VGNANE does not already exists +- "$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"." +- ;; +- esac +- +- verbose "Checked whether device $1 is already LV ($IS_LV)." +- +- "$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR." +- +- verbose "Getting YAML VDO configuration." +- "$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml" +- +- VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") +- TRVDONAME=$(echo "$VDONAME" | tr '-' '_') +- +- # When VDO volume is 'active', check it's not mounted/being used +- eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" +- test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" +- +- #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ +- eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" +- +- vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") +- vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") +- +- verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." +- verbose "With logical volume of size $vdo_logicalSize KiB." +- +- PARAMS=$(cat <<EOF +-allocation { +- vdo_use_compression = $(get_enabled_value_ "$vdo_compression") +- vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication") +- vdo_use_metadata_hints=1 +- vdo_minimum_io_size = $vdo_logicalBlockSize +- vdo_block_map_cache_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize") +- vdo_block_map_period = $vdo_blockMapPeriod +- vdo_check_point_frequency = $vdo_indexCfreq +- vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse") +- vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}") +- vdo_slab_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize") +- vdo_ack_threads = $vdo_ackThreads +- vdo_bio_threads = $vdo_bioThreads +- vdo_bio_rotation = $vdo_bioRotationInterval +- vdo_cpu_threads = $vdo_cpuThreads +- vdo_hash_zone_threads = $vdo_hashZoneThreads +- vdo_logical_threads = $vdo_logicalThreads +- vdo_physical_threads = $vdo_physicalThreads +- vdo_write_policy = $vdo_writePolicy +- vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 )) +- vdo_pool_header_size = 0 +-} +-EOF +-) +- verbose "VDO conversion paramaters: $PARAMS" +- +- verbose "Stopping VDO volume." +- dry "$VDO" stop $VDOCONF --name "$VDONAME" +- +- if [ "$IS_LV" = "0" ]; then +- verbose "Moving VDO header by 2MiB." +- dry "$VDO" convert $VDOCONF --force --name "$VDONAME" +- +- dry "$LVM" pvcreate $YES --dataalignment 2M "$DEVICE" || { +- error "Creation of PV on \"$DEVICE\" failed, while VDO header has been already moved!" +- } +- +- # Obtain free space in this new PV +- # after 'vdo convert/vdo2lvm' call there is +2M free space at the front of the device +- case "$DRY" in +- 0) pvfree=$("$LVM" pvs -o devsize --units b --nosuffix --noheadings "$DEVICE") ;; +- *) pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") ;; +- esac +- +- pvfree=$(( pvfree / 1024 - 2048 )) # to KiB +- else +- pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$VGNAME/$LVNAME") +- pvfree=$(( pvfree / 1024 )) # to KiB +- fi +- +- # select largest possible extent size that can exactly express both sizes +- EXTENTSZ=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize") +- +- if [ "$IS_LV" = "0" ]; then +- verbose "Creating VG \"${NAME%/*}\" with extent size $EXTENTSZ KiB." +- dry "$LVM" vgcreate $YES $VERB -s "${EXTENTSZ}k" "$VGNAME" "$DEVICE" || { +- error "Creation of VG \"$VGNAME\" failed, while VDO header has been already moved!" +- } +- +- verbose "Creating VDO pool data LV from all extents in volume group $VGNAME." +- dry "$LVM" lvcreate -Zn -Wn $YES $VERB -l100%VG -n "${LVNAME}_vpool" "$VGNAME" +- else +- # validate existing VG extent_size can express virtual VDO size +- vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME" || true) +- vg_extent_size=$(( vg_extent_size / 1024 )) +- +- test "$vg_extent_size" -le "$EXTENTSZ" || { +- error "Please vgchange extent_size to at most $EXTENTSZ KiB or extend and align virtual size on $vg_extent_size KiB." +- } +- verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV." +- dry "$LVM" lvrename $YES $VERB "$VGNAME/$LVNAME" "$VGNAME/${LVNAME}_vpool" || { +- error "Rename of LV \"$VGNAME/$LVNAME\" failed, while VDO header has been already moved!" +- } +- fi +- +- verbose "Converting to VDO pool." +- dry "$LVM" lvconvert $YES $VERB $FORCE --config "$PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool" +- +- rm -fr "$TEMPDIR" +-} +- +-############################# +-# start point of this script +-# - parsing parameters +-############################# +-trap "cleanup 2" 2 +- +-test "$#" -eq 0 && tool_usage +- +-while [ "$#" -ne 0 ] +-do +- case "$1" in +- "") ;; +- "-f"|"--force" ) FORCE="-f" ;; +- "-h"|"--help" ) tool_usage ;; +- "-n"|"--name" ) shift; NAME=$1 ;; +- "-v"|"--verbose") VERB="-v" ;; +- "-y"|"--yes" ) YES="-y" ;; +- "--dry-run" ) DRY="1" ;; +- "-*") error "Wrong argument \"$1\". (see: $TOOL --help)" ;; +- *) DEVICENAME=$1 ;; # device name does not start with '-' +- esac +- shift +-done +- +-# do conversion +-convert2lvm_ "$DEVICENAME" +diff --git a/test/Makefile.in b/test/Makefile.in +index 6be03aa..0f2cc25 100644 +--- a/test/Makefile.in ++++ b/test/Makefile.in +@@ -353,7 +353,7 @@ LIB = $(addprefix lib/, $(LIB_SECURETEST) $(LIB_DMSECURETEST) $(LIB_SHARED) $(LI + $(Q) $(LN_S) -f $(abs_top_srcdir)/conf/lvmdbusd.profile lib/ + $(Q) $(LN_S) -f $(abs_top_srcdir)/conf/thin-performance.profile lib/ + $(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/fsadm.sh lib/fsadm +- $(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/vdoimport.sh lib/vdoimport ++ $(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/lvm_import_vdo.sh lib/lvm_import_vdo + @test "$(srcdir)" = . || \ + for i in $(LIB_LVMLOCKD_CONF) $(LIB_MKE2FS_CONF); do \ + test -n "$(Q)" || echo "$(LN_S) -f $(abs_top_srcdir)/test/lib/$$i lib/"; \ +diff --git a/test/shell/vdo-convert.sh b/test/shell/vdo-convert.sh +index 538147b..2d16c97 100644 +--- a/test/shell/vdo-convert.sh ++++ b/test/shell/vdo-convert.sh +@@ -54,12 +54,12 @@ vdo create $VDOCONF --name "$VDONAME" --device="$DM_DEV_DIR/$vg/$lv1" --vdoLogic + mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME" + + # Different VG name fails +-not vdoimport -y -v --name $vg1/$lv1 "$DM_DEV_DIR/$vg/$lv1" ++not lvm_import_vdo -y -v --name $vg1/$lv1 "$DM_DEV_DIR/$vg/$lv1" + + # Try just dry run and observe logging +-vdoimport --dry-run -y -v --name $lv1 "$DM_DEV_DIR/$vg/$lv1" ++lvm_import_vdo --dry-run -y -v --name $lv1 "$DM_DEV_DIR/$vg/$lv1" + +-vdoimport -y --name $lv1 "$DM_DEV_DIR/$vg/$lv1" ++lvm_import_vdo -y --name $lv1 "$DM_DEV_DIR/$vg/$lv1" + + # ATM needed - since we do not call 'vdo convert' in this case + vdo remove $VDOCONF --force --name "$VDONAME" || true +@@ -79,13 +79,13 @@ vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=31G + mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME" + + # Fail with an already existing volume group $vg2 +-not vdoimport --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err ++not lvm_import_vdo --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err + grep "already existing volume group" err + + # User can also convert already stopped VDO volume + vdo stop $VDOCONF --name "$VDONAME" + +-vdoimport -y -v --name $vg/$lv1 "$dev1" ++lvm_import_vdo -y -v --name $vg/$lv1 "$dev1" + + fsck -n "$DM_DEV_DIR/$vg/$lv1" + +@@ -102,7 +102,7 @@ vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=23G + + mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME" + +-vdoimport -y -v --name $vg1/$lv2 "$dev1" ++lvm_import_vdo -y -v --name $vg1/$lv2 "$dev1" + + fsck -n "$DM_DEV_DIR/$vg1/$lv2" + diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec index bd9d071..12091bb 100644 --- a/SPECS/lvm2.spec +++ b/SPECS/lvm2.spec @@ -68,7 +68,7 @@ Version: 2.03.12 %if 0%{?from_snapshot} Release: 0.1.20210426git%{shortcommit}%{?dist}%{?rel_suffix} %else -Release: 6%{?dist}%{?rel_suffix} +Release: 8%{?dist}%{?rel_suffix} %endif License: GPLv2 URL: http://sourceware.org/lvm2 @@ -112,6 +112,8 @@ Patch21: lvm2-2_03_13-test.patch Patch22: lvm2-2_03_13-vgmerge-remove-one-of-merge-pmspare-LVs.patch Patch23: lvm2-2_03_13-vgmerge-support-option-poolmetadataspare.patch Patch24: lvm2-2_03_13-tests-extend-vgmerge-testing.patch +# BZ 1986930: +Patch25: lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch BuildRequires: gcc %if %{enable_testsuite} @@ -196,6 +198,7 @@ or more physical volumes and creating one or more logical volumes %patch22 -p1 -b .backup22 %patch23 -p1 -b .backup23 %patch24 -p1 -b .backup24 +%patch25 -p1 -b .backup25 %build %global _default_pid_dir /run @@ -314,6 +317,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %if %{enable_lvmpolld} %{_sbindir}/lvmpolld %endif +%{_sbindir}/lvm_import_vdo # Other files %defattr(444,root,root,-) @@ -340,7 +344,6 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %{_sbindir}/pvresize %{_sbindir}/pvs %{_sbindir}/pvscan -%{_sbindir}/vdoimport %{_sbindir}/vgcfgbackup %{_sbindir}/vgcfgrestore %{_sbindir}/vgchange @@ -409,7 +412,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || : %{_mandir}/man8/vgdisplay.8.gz %{_mandir}/man8/vgexport.8.gz %{_mandir}/man8/vgextend.8.gz -%{_mandir}/man8/vdoimport.8.gz +%{_mandir}/man8/lvm_import_vdo.8.gz %{_mandir}/man8/vgimport.8.gz %{_mandir}/man8/vgimportclone.8.gz %{_mandir}/man8/vgimportdevices.8.gz @@ -804,6 +807,12 @@ An extensive functional testsuite for LVM2. %endif %changelog +* Thu Aug 26 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-8 +- Rename vdoimport to lvm_import_vdo. + +* Wed Aug 11 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-7 +- Fix missing executable flag on vdoimport. + * Tue Aug 03 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-6 - Fix handling of pmspare by vgsplit, vgmerge and vgremove. - Fix detection of active components of external origin volume.