summaryrefslogtreecommitdiff
path: root/test/shell/pvcreate-operation-md.sh
blob: f959c0bf02526da187e5bbba1597325850505769 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/bin/sh
# Copyright (C) 2009 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

# skip this test if mdadm or sfdisk (or others) aren't available
which mdadm || skip
which sfdisk || skip
which perl || skip
which awk || skip
which cut || 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

# Have MD use a non-standard name to avoid colliding with an existing MD device
# - mdadm >= 3.0 requires that non-standard device names be in /dev/md/
# - newer mdadm _completely_ defers to udev to create the associated device node
mdadm_maj=$(mdadm --version 2>&1 | perl -pi -e 's|.* v(\d+).*|\1|')
[ $mdadm_maj -ge 3 ] && \
    mddev=/dev/md/md_lvm_test0 || \
    mddev=/dev/md_lvm_test0

cleanup_md() {
    # sleeps offer hack to defeat: 'md: md127 still in use'
    # see: https://bugzilla.redhat.com/show_bug.cgi?id=509908#c25
    aux udev_wait
    mdadm --stop "$mddev" || true
    aux udev_wait
    if [ -b "$mddev" ]; then
        # mdadm doesn't always cleanup the device node
	sleep 2
	rm -f "$mddev"
    fi
}

cleanup_md_and_teardown() {
    cleanup_md
    aux teardown
}

# create 2 disk MD raid0 array (stripe_width=128K)
test -b "$mddev" && skip
mdadm --create --metadata=1.0 "$mddev" --auto=md --level 0 --raid-devices=2 --chunk 64 "$dev1" "$dev2"
trap 'cleanup_md_and_teardown' EXIT # cleanup this MD device at the end of the test
test -b "$mddev" || skip
cp -LR "$mddev" "$DM_DEV_DIR" # so that LVM/DM can see the device
lvmdev="$DM_DEV_DIR/md_lvm_test0"

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

check pv_field "$lvmdev" pe_start $pv_align

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


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

# partition MD array directly, depends on blkext in Linux >= 2.6.28
if kernel_at_least 2 6 28 ; then
    # create one partition
    sfdisk "$mddev" <<EOF
,,83
EOF
    pvscan
    # make sure partition on MD is _not_ removed
    # - tests partition -> parent lookup via sysfs paths
    not pvcreate --metadatasize 128k "$lvmdev"

    # 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

    # Oh joy: need to lookup /sys/block/md127 rather than /sys/block/md_lvm_test0
    mddev_maj_min=$(ls -lL "$mddev" | awk '{ print $5 $6 }' | perl -pi -e 's|,|:|')
    mddev_p_sysfs_name=$(echo /sys/dev/block/${mddev_maj_min}/*p1)
    base_mddev_p=`basename $mddev_p_sysfs_name`
    mddev_p=/dev/${base_mddev_p}

    # in case the system is running without devtmpfs /dev
    # wait here for created device node on tmpfs
    aux udev_wait "$mddev_p"
    test -b "$mddev_p" || skip
    cp -LR "$mddev_p" "$DM_DEV_DIR"
    lvmdev_p="$DM_DEV_DIR/$base_mddev_p"

    # Checking for 'alignment_offset' in sysfs implies Linux >= 2.6.31
    # but reliable alignment_offset support requires kernel.org Linux >= 2.6.33
    sysfs_alignment_offset=/sys/dev/block/${mddev_maj_min}/${base_mddev_p}/alignment_offset
    [ -f $sysfs_alignment_offset ] && kernel_at_least 2 6 33 && \
	alignment_offset=`cat $sysfs_alignment_offset` || \
	alignment_offset=0

    if [ $alignment_offset -gt 0 ]; then
        # default alignment is 1M, add alignment_offset
	pv_align=$((1048576+$alignment_offset))B
	pvcreate --metadatasize 128k "$lvmdev_p"
	check pv_field "$lvmdev_p" pe_start $pv_align --units b
	pvremove "$lvmdev_p"
    fi
fi

# Test newer topology-aware alignment detection w/ --dataalignment override
if kernel_at_least 2 6 33 ; then
    cleanup_md
    pvcreate -f "$dev1"
    pvcreate -f "$dev2"

    # create 2 disk MD raid0 array (stripe_width=2M)
    test -b "$mddev" && skip
    mdadm --create --metadata=1.0 "$mddev" --auto=md --level 0 --raid-devices=2 --chunk 1024 "$dev1" "$dev2"
    test -b "$mddev" || skip

    # optimal_io_size=2097152, minimum_io_size=1048576
    pv_align="2.00m"
    pvcreate --metadatasize 128k \
	--config 'devices { md_chunk_alignment=0 }' "$lvmdev"
    pvscan # Something is seriously broken.
    check pv_field "$lvmdev" pe_start $pv_align

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