#!/bin/sh
# Copyright (C) 2009-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

SKIP_WITH_LVMLOCKD=1
SKIP_WITH_LVMPOLLD=1

. lib/inittest

# skip this test if mdadm or sfdisk (or others) aren't available
which sfdisk || skip

test -f /proc/mdstat && grep -q raid0 /proc/mdstat || \
	modprobe raid0 || skip

aux lvmconf 'devices/md_component_detection = 1'
aux extend_filter_LVMTEST
aux extend_filter "a|/dev/md.*|"

aux prepare_devs 2

# create 2 disk MD raid0 array (stripe_width=128K)
aux prepare_md_dev 0 64 2 "$dev1" "$dev2"

mddev=$(< MD_DEV)
pvdev=$(< MD_DEV_PV)

# Test alignment of PV on MD without any MD-aware or topology-aware detection
# - should treat $mddev just like any other block device
pvcreate --metadatasize 128k \
    --config 'devices {md_chunk_alignment=0 data_alignment_detection=0 data_alignment_offset_detection=0}' \
    "$pvdev"

check pv_field "$pvdev" pe_start "1.00m"

# Test md_chunk_alignment independent of topology-aware detection
pvcreate --metadatasize 128k \
    --config 'devices {data_alignment_detection=0 data_alignment_offset_detection=0}' \
    "$pvdev"
check pv_field "$pvdev" pe_start "1.00m"

# Test newer topology-aware alignment detection
# - first added to 2.6.31 but not "reliable" until 2.6.33
if aux kernel_at_least 2 6 33 ; then
    # optimal_io_size=131072, minimum_io_size=65536
    pvcreate --metadatasize 128k \
	--config 'devices { md_chunk_alignment=0 }' "$pvdev"
    check pv_field "$pvdev" pe_start "1.00m"
    pvremove "$pvdev"
fi

# partition MD array directly, depends on blkext in Linux >= 2.6.28
if aux kernel_at_least 2 6 28 ; then
    # create one partition
    sfdisk "$mddev" <<EOF
,,83
EOF
    # Wait till all partition links in udev are created
    aux udev_wait

    # Skip test if udev rule has not created proper links for partitions
    test -b "${mddev}p1" || { ls -laR /dev ; skip "Missing partition link" ; }

    pvscan
    # make sure partition on MD is _not_ removed
    # - tests partition -> parent lookup via sysfs paths
    not pvcreate --metadatasize 128k "$pvdev"

    # verify alignment_offset is accounted for in pe_start
    # - topology infrastructure is available in Linux >= 2.6.31
    # - also tests partition -> parent lookup via sysfs paths

    # Checking for 'alignment_offset' in sysfs implies Linux >= 2.6.31
    # but reliable alignment_offset support requires kernel.org Linux >= 2.6.33
    if aux kernel_at_least 2 6 33 ; then
	# in case the system is running without devtmpfs /dev
	# wait here for created device node on tmpfs
	test "$DM_DEV_DIR" != "/dev" && cp -LR "${mddev}p1" "$DM_DEV_DIR"

	pvcreate --metadatasize 128k "${pvdev}p1"

	maj=$(($(stat -L --printf=0x%t "${mddev}p1")))
	min=$(($(stat -L --printf=0x%T "${mddev}p1")))

	sysfs_alignment_offset="/sys/dev/block/$maj:$min/alignment_offset"
	[ -f "$sysfs_alignment_offset" ] && \
		alignment_offset=$(< "$sysfs_alignment_offset") || \
		alignment_offset=0

	# default alignment is 1M, add alignment_offset
	pv_align=$((1048576+$alignment_offset))
	check pv_field "${pvdev}p1" pe_start $pv_align --units b --nosuffix

	pvremove "${pvdev}p1"
	test "$DM_DEV_DIR" != "/dev" && rm -f "$DM_DEV_DIR/${mddev}p1"
    fi
fi

# Test newer topology-aware alignment detection w/ --dataalignment override
if aux kernel_at_least 2 6 33 ; then
    # make sure we're clean for another test
    dd if=/dev/zero of="$mddev" bs=512 count=1
    aux prepare_md_dev 0 1024 2 "$dev1" "$dev2"
    pvdev=$(< MD_DEV_PV)

    # optimal_io_size=2097152, minimum_io_size=1048576
    pvcreate --metadatasize 128k \
	--config 'devices { md_chunk_alignment=0 }' "$pvdev"
    check pv_field "$pvdev" pe_start "2.00m"

    # now verify pe_start alignment override using --dataalignment
    pvcreate --dataalignment 64k --metadatasize 128k \
	--config 'devices { md_chunk_alignment=0 }' "$pvdev"
    check pv_field "$pvdev" pe_start "192.00k"
fi
