| #!/bin/sh | |
| # Copyright (C) 2008 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| test_description='Test pvcreate option values' | |
| SKIP_WITH_LVMLOCKD=1 | |
| SKIP_WITH_LVMPOLLD=1 | |
| PAGESIZE=$(getconf PAGESIZE) | |
| # MDA_SIZE_MIN defined in lib/format_text/layout.h | |
| MDA_SIZE_MIN=$((8*$PAGESIZE)) | |
| . lib/inittest | |
| aux prepare_devs 4 | |
| #COMM 'pvcreate rejects negative setphysicalvolumesize' | |
| not pvcreate --setphysicalvolumesize -1024 "$dev1" | |
| #COMM 'pvcreate rejects negative metadatasize' | |
| not pvcreate --metadatasize -1024 "$dev1" | |
| #COMM 'pvcreate rejects metadatasize that is less than minimum size' | |
| not pvcreate --dataalignment $((${MDA_SIZE_MIN}/2))b --metadatasize $((${MDA_SIZE_MIN}/2))b "$dev1" 2>err | |
| grep "Metadata area size too small" err | |
| #COMM 'pvcreate accepts metadatasize that is at least the minimum size' | |
| pvcreate --dataalignment ${MDA_SIZE_MIN}b --metadatasize ${MDA_SIZE_MIN}b "$dev1" | |
| # x. metadatasize 0, defaults to 255 | |
| # FIXME: unable to check default value, not in reporting cmds | |
| # should default to 255 according to code | |
| # check pv_field pv_mda_size 255 | |
| #COMM 'pvcreate accepts metadatasize 0' | |
| pvcreate --metadatasize 0 "$dev1" | |
| pvremove "$dev1" | |
| #Verify vg_mda_size is smaller pv_mda_size | |
| pvcreate --metadatasize 512k "$dev1" | |
| pvcreate --metadatasize 96k "$dev2" | |
| vgcreate $vg "$dev1" "$dev2" | |
| pvs -o +pv_mda_size | |
| check compare_fields vgs $vg vg_mda_size pvs "$dev2" pv_mda_size | |
| vgremove $vg | |
| # x. metadatasize too large | |
| # For some reason we allow this, even though there's no room for data? | |
| ##COMM 'pvcreate rejects metadatasize too large' | |
| #not pvcreate --metadatasize 100000000000000 "$dev1" | |
| #COMM 'pvcreate rejects metadatacopies < 0' | |
| not pvcreate --metadatacopies -1 "$dev1" | |
| #COMM 'pvcreate accepts metadatacopies = 0, 1, 2' | |
| for j in metadatacopies pvmetadatacopies | |
| do | |
| pvcreate --$j 0 "$dev1" | |
| pvcreate --$j 1 "$dev2" | |
| pvcreate --$j 2 "$dev3" | |
| check pv_field "$dev1" pv_mda_count 0 | |
| check pv_field "$dev2" pv_mda_count 1 | |
| check pv_field "$dev3" pv_mda_count 2 | |
| pvremove "$dev1" "$dev2" "$dev3" | |
| done | |
| #COMM 'pvcreate rejects metadatacopies > 2' | |
| not pvcreate --metadatacopies 3 "$dev1" | |
| #COMM 'pvcreate rejects invalid device' | |
| not pvcreate "$dev1"bogus | |
| #COMM 'pvcreate rejects labelsector < 0' | |
| not pvcreate --labelsector -1 "$dev1" | |
| #COMM 'pvcreate rejects labelsector > 1000000000000' | |
| not pvcreate --labelsector 1000000000000 "$dev1" | |
| # other possibilites based on code inspection (not sure how hard) | |
| # x. device too small (min of 512 * 1024 KB) | |
| # x. device filtered out | |
| # x. unable to open /dev/urandom RDONLY | |
| # x. device too large (pe_count > UINT32_MAX) | |
| # x. device read-only | |
| # x. unable to open device readonly | |
| # x. BLKGETSIZE64 fails | |
| # x. set size to value inconsistent with device / PE size | |
| #COMM 'pvcreate basic dataalignment sanity checks' | |
| not pvcreate --dataalignment -1 "$dev1" | |
| not pvcreate --dataalignment 1e "$dev1" | |
| if test -n "$LVM_TEST_LVM1" ; then | |
| not pvcreate -M1 --dataalignment 1 "$dev1" | |
| fi | |
| #COMM 'pvcreate always rounded up to page size for start of device' | |
| #pvcreate --metadatacopies 0 --dataalignment 1 "$dev1" | |
| # amuse shell experts | |
| #check pv_field "$dev1" pe_start $(($(getconf PAGESIZE)/1024))".00k" | |
| #COMM 'pvcreate sets data offset directly' | |
| pvcreate --dataalignment 512k "$dev1" | |
| check pv_field "$dev1" pe_start "512.00k" | |
| #COMM 'vgcreate/vgremove do not modify data offset of existing PV' | |
| vgcreate $vg "$dev1" --config 'devices { data_alignment = 1024 }' | |
| check pv_field "$dev1" pe_start "512.00k" | |
| vgremove $vg --config 'devices { data_alignment = 1024 }' | |
| check pv_field "$dev1" pe_start "512.00k" | |
| #COMM 'pvcreate sets data offset next to mda area' | |
| pvcreate --metadatasize 100k --dataalignment 100k "$dev1" | |
| check pv_field "$dev1" pe_start "200.00k" | |
| # metadata area start is aligned according to pagesize | |
| case "$PAGESIZE" in | |
| 65536) pv_align="192.50k" ;; | |
| 8192) pv_align="136.50k" ;; | |
| *) pv_align="133.00k" ;; | |
| esac | |
| pvcreate --metadatasize 128k --dataalignment 3.5k "$dev1" | |
| check pv_field "$dev1" pe_start $pv_align | |
| pvcreate --metadatasize 128k --metadatacopies 2 --dataalignment 3.5k "$dev1" | |
| check pv_field "$dev1" pe_start $pv_align | |
| # data area is aligned to 1M by default, | |
| # data area start is shifted by the specified alignment_offset | |
| pv_align=1052160B # 1048576 + (7*512) | |
| pvcreate --metadatasize 128k --dataalignmentoffset 7s "$dev1" | |
| check pv_field "$dev1" pe_start $pv_align --units b | |
| # 2nd metadata area is created without problems when | |
| # data area start is shifted by the specified alignment_offset | |
| pvcreate --metadatasize 128k --metadatacopies 2 --dataalignmentoffset 7s "$dev1" | |
| check pv_field "$dev1" pv_mda_count 2 | |
| # FIXME: compare start of 2nd mda with and without --dataalignmentoffset | |
| #COMM 'pv with LVM1 compatible data alignment can be convereted' | |
| #compatible == LVM1_PE_ALIGN == 64k | |
| if test -n "$LVM_TEST_LVM1" ; then | |
| pvcreate --dataalignment 256k "$dev1" | |
| vgcreate -s 1m $vg "$dev1" | |
| vgconvert -M1 $vg | |
| vgconvert -M2 $vg | |
| check pv_field "$dev1" pe_start 256.00k | |
| vgremove $vg | |
| fi | |
| #COMM 'pv with LVM1 incompatible data alignment cannot be convereted' | |
| if test -n "$LVM_TEST_LVM1" ; then | |
| pvcreate --dataalignment 10k "$dev1" | |
| vgcreate -s 1m $vg "$dev1" | |
| not vgconvert -M1 $vg | |
| vgremove $vg | |
| fi | |
| #COMM 'vgcfgrestore allows pe_start=0' | |
| #basically it produces nonsense, but it tests vgcfgrestore, | |
| #not that final cfg is usable... | |
| pvcreate --metadatacopies 0 "$dev1" | |
| pvcreate "$dev2" | |
| vgcreate $vg "$dev1" "$dev2" | |
| vgcfgbackup -f backup.$$ $vg | |
| sed 's/pe_start = [0-9]*/pe_start = 0/' backup.$$ > backup.$$1 | |
| vgcfgrestore -f backup.$$1 $vg | |
| check pv_field "$dev1" pe_start "0" | |
| check pv_field "$dev2" pe_start "0" | |
| vgremove $vg | |
| echo "test pvcreate --metadataignore" | |
| for pv_in_vg in 1 0; do | |
| for mdacp in 1 2; do | |
| for ignore in y n; do | |
| echo "pvcreate --metadataignore has proper mda_count and mda_used_count" | |
| pvcreate --metadatacopies $mdacp --metadataignore $ignore "$dev1" "$dev2" | |
| check pv_field "$dev1" pv_mda_count "$mdacp" | |
| check pv_field "$dev2" pv_mda_count "$mdacp" | |
| if [ $ignore = y ]; then | |
| check pv_field "$dev1" pv_mda_used_count "0" | |
| check pv_field "$dev2" pv_mda_used_count "0" | |
| else | |
| check pv_field "$dev1" pv_mda_used_count "$mdacp" | |
| check pv_field "$dev2" pv_mda_used_count "$mdacp" | |
| fi | |
| echo "vgcreate has proper vg_mda_count and vg_mda_used_count" | |
| if [ $pv_in_vg = 1 ]; then | |
| vgcreate $vg "$dev1" "$dev2" | |
| check vg_field $vg vg_mda_count "$(($mdacp * 2))" | |
| if [ $ignore = y ]; then | |
| check vg_field $vg vg_mda_used_count "1" | |
| else | |
| check vg_field $vg vg_mda_used_count "$(($mdacp * 2))" | |
| fi | |
| check vg_field $vg vg_mda_copies "unmanaged" | |
| vgremove $vg | |
| fi | |
| done | |
| done | |
| done |