diff --git a/WHATS_NEW b/WHATS_NEW index 3b22ec5dc..24f0c7605 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.120 - =============================== + Properly validate PV size for pvcreate --restorefile. Fix check if pvcreate wiped device (2.02.117). Fix storing of vgid when caching metadata (2.02.118). Fix recursive lvm-config man page. (2.02.119) diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 759ad89d7..f38628c6e 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -1603,9 +1603,9 @@ static int _text_pv_initialise(const struct format_type *fmt, if (rp->extent_count) pv->pe_count = rp->extent_count; - if ((pv->pe_start + pv->pe_count * pv->pe_size - 1) > (pv->size << SECTOR_SHIFT)) { + if ((pv->pe_start + pv->pe_count * (uint64_t)pv->pe_size - 1) > pv->size) { log_error("Physical extents end beyond end of device %s.", - pv_dev_name(pv)); + pv_dev_name(pv)); return 0; } @@ -2172,7 +2172,7 @@ static int _text_pv_add_metadata_area(const struct format_type *fmt, * LABEL_SCAN_SIZE. */ pe_end = pv->pe_count ? (pv->pe_start + - pv->pe_count * pv->pe_size - 1) << SECTOR_SHIFT + pv->pe_count * (uint64_t)pv->pe_size - 1) << SECTOR_SHIFT : 0; if (pe_start || pe_start_locked) { diff --git a/test/shell/pvcreate-restore.sh b/test/shell/pvcreate-restore.sh new file mode 100644 index 000000000..733139611 --- /dev/null +++ b/test/shell/pvcreate-restore.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# Copyright (C) 2015 Red Hat, Inc. All rights reserved. +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/inittest + +aux prepare_vg 4 + +lvcreate --type snapshot -s -L10 -n $lv1 $vg --virtualsize 2T +lvcreate --type snapshot -s -L10 -n $lv2 $vg --virtualsize 4T +lvcreate --type snapshot -s -L10 -n $lv3 $vg --virtualsize 4194300M + +aux extend_filter_LVMTEST + +vgcreate $vg1 "$DM_DEV_DIR/$vg/$lv2" + +vgcfgbackup -f vgback $vg1 + +UUID=$(get pv_field "$DM_DEV_DIR/$vg/$lv2" uuid) +pvremove -ff -y "$DM_DEV_DIR/$vg/$lv2" + +# too small to fit +fail pvcreate --restorefile vgback --uuid $UUID "$DM_DEV_DIR/$vg/$lv1" + +# still does not fit +fail pvcreate --restorefile vgback --uuid $UUID "$DM_DEV_DIR/$vg/$lv3" + +pvcreate --restorefile vgback --uuid $UUID "$DM_DEV_DIR/$vg/$lv2" + +vgremove -ff $vg