1
0
mirror of https://github.com/systemd/systemd synced 2026-03-28 01:34:52 +01:00

Compare commits

...

16 Commits

Author SHA1 Message Date
Yu Watanabe
f782eee68a journal,network,timesync: fix segfault on 32bit timeval/timespec systems
Fixes #20741.
2021-09-16 11:47:44 +02:00
Anita Zhang
5aaa55d841 fileio: start with 4k buffer for procfs
There's a very gradual increase of anonymous memory in systemd-journald that
blames to 2ac67221bb6270f0fbe7cbd0076653832cd49de2.

systemd-journald makes many calls to read /proc/PID/cmdline and
/proc/PID/status, both of which tend to be well under 4K. However the
combination of allocating 4M read buffers, then using `realloc()` to
shrink the buffer in `read_virtual_file()` appears to be creating
fragmentation in the heap (when combined with the other allocations
systemd-journald is doing).

To help mitigate this, try reading /proc with a 4K buffer as
`read_virtual_file()` did before 2ac67221bb6270f0fbe7cbd0076653832cd49de2.
If it isn't big enough then try again with the larger buffers.
2021-09-16 11:31:29 +02:00
Luca Boccassi
1dcd91ad11
Merge pull request #20758 from yuwata/test-17-udev-cleanups
test: several cleanups for TEST-17-UDEV
2021-09-16 09:45:10 +01:00
Yu Watanabe
2d253d7206
Merge pull request #20721 from mrc0mmand/test-storage-lvm
test: udev/LVM storage tests
2021-09-16 12:39:24 +09:00
Yu Watanabe
a871f3bb54 test: drop unnecessary sleep and 'udevadm settle'
After the triggered events are processed, all symlinks which store
watch handles should be valid.
2021-09-16 06:55:11 +09:00
Yu Watanabe
a9d8bebacd test: use --settle option for udevadm trigger 2021-09-16 06:55:11 +09:00
Yu Watanabe
e70f57796d test: use --settle option for udevadm trigger
Then, we can drop the loops.
This also drops unnecessary `udevadm control --reload`.
2021-09-16 06:55:04 +09:00
Yu Watanabe
9228ecaf8c test: use /dev/null instead of the loop back network interface
It should faster to be processed. So, we can shorten the timeout.
Also, this makes the test use `udevadm trigger`.
2021-09-16 06:46:19 +09:00
Yu Watanabe
26146d82db test: use --settle option for udevadm trigger 2021-09-16 06:39:48 +09:00
Frantisek Sumsal
0203b2e4be test: basic LVM tests 2021-09-15 20:17:50 +02:00
Frantisek Sumsal
6df0259732 test: check if all paths passed to helper_check_device_symlinks() are valid 2021-09-14 19:15:13 +02:00
Frantisek Sumsal
a0560b93ea test: make helper_check_device_symlinks() less verbose 2021-09-14 19:15:13 +02:00
Frantisek Sumsal
df72bd45f3 test: handle arbitrary paths in helper_check_device_symlinks() 2021-09-14 19:15:13 +02:00
Frantisek Sumsal
4999f3688f test: add an LVM helper 2021-09-14 19:15:13 +02:00
Frantisek Sumsal
e3d9a2e74f test: install dmevent service and socket 2021-09-14 19:15:13 +02:00
Frantisek Sumsal
bac05644a7 test: specify the rootfs by label
otherwise the boot might fail when attaching multiple SATA devices to
the VM.
2021-09-14 19:15:13 +02:00
12 changed files with 215 additions and 66 deletions

View File

@ -433,6 +433,11 @@ int read_virtual_file(const char *filename, size_t max_size, char **ret_contents
} }
n_retries--; n_retries--;
} else if (n_retries > 1) {
/* Files in /proc are generally smaller than the page size so let's start with a page size
* buffer from malloc and only use the max buffer on the final try. */
size = MIN3(page_size() - 1, READ_VIRTUAL_BYTES_MAX, max_size);
n_retries = 1;
} else { } else {
size = MIN(READ_VIRTUAL_BYTES_MAX, max_size); size = MIN(READ_VIRTUAL_BYTES_MAX, max_size);
n_retries = 0; n_retries = 0;

View File

@ -1267,11 +1267,14 @@ int server_process_datagram(
/* We use NAME_MAX space for the SELinux label here. The kernel currently enforces no limit, but /* We use NAME_MAX space for the SELinux label here. The kernel currently enforces no limit, but
* according to suggestions from the SELinux people this will change and it will probably be * according to suggestions from the SELinux people this will change and it will probably be
* identical to NAME_MAX. For now we use that, but this should be updated one day when the final * identical to NAME_MAX. For now we use that, but this should be updated one day when the final
* limit is known. */ * limit is known.
*
* Here, we need to explicitly initialize the buffer with zero, as glibc has a bug in
* __convert_scm_timestamps(), which assumes the buffer is initialized. See #20741. */
CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(struct ucred)) + CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(struct ucred)) +
CMSG_SPACE_TIMEVAL + CMSG_SPACE_TIMEVAL +
CMSG_SPACE(sizeof(int)) + /* fd */ CMSG_SPACE(sizeof(int)) + /* fd */
CMSG_SPACE(NAME_MAX) /* selinux label */) control; CMSG_SPACE(NAME_MAX) /* selinux label */) control = {};
union sockaddr_union sa = {}; union sockaddr_union sa = {};

View File

@ -148,8 +148,9 @@ int icmp6_send_router_solicitation(int s, const struct ether_addr *ether_addr) {
int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst, int icmp6_receive(int fd, void *buffer, size_t size, struct in6_addr *ret_dst,
triple_timestamp *ret_timestamp) { triple_timestamp *ret_timestamp) {
/* This needs to be initialized with zero. See #20741. */
CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(int)) + /* ttl */ CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(int)) + /* ttl */
CMSG_SPACE_TIMEVAL) control; CMSG_SPACE_TIMEVAL) control = {};
struct iovec iov = {}; struct iovec iov = {};
union sockaddr_union sa = {}; union sockaddr_union sa = {};
struct msghdr msg = { struct msghdr msg = {

View File

@ -416,7 +416,8 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
.iov_base = &ntpmsg, .iov_base = &ntpmsg,
.iov_len = sizeof(ntpmsg), .iov_len = sizeof(ntpmsg),
}; };
CMSG_BUFFER_TYPE(CMSG_SPACE_TIMESPEC) control; /* This needs to be initialized with zero. See #20741. */
CMSG_BUFFER_TYPE(CMSG_SPACE_TIMESPEC) control = {};
union sockaddr_union server_addr; union sockaddr_union server_addr;
struct msghdr msghdr = { struct msghdr msghdr = {
.msg_iov = &iov, .msg_iov = &iov,

View File

@ -1,5 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# vi: ts=4 sw=4 tw=0 et: # vi: ts=4 sw=4 tw=0 et:
#
# TODO:
# * iSCSI
# * LVM over iSCSI (?)
# * SW raid (mdadm)
# * LUKS -> MD (mdadm) -> LVM
# * BTRFS
# * MD BTRFS
set -e set -e
TEST_DESCRIPTION="systemd-udev storage tests" TEST_DESCRIPTION="systemd-udev storage tests"
@ -30,6 +38,11 @@ test_append_files() {
install_multipath install_multipath
fi fi
# Configure LVM
if command -v lvm; then
install_lvm
fi
for i in {0..127}; do for i in {0..127}; do
dd if=/dev/zero of="${TESTDIR:?}/disk$i.img" bs=1M count=1 dd if=/dev/zero of="${TESTDIR:?}/disk$i.img" bs=1M count=1
echo "device$i" >"${TESTDIR:?}/disk$i.img" echo "device$i" >"${TESTDIR:?}/disk$i.img"
@ -246,6 +259,31 @@ testcase_simultaneous_events() {
test_run_one "${1:?}" test_run_one "${1:?}"
} }
testcase_lvm_basic() {
if ! command -v lvm; then
echo "Missing lvm tools, skipping the test..."
return 77
fi
local qemu_opts=("-device ahci,id=ahci0")
local diskpath
# Attach 4 SATA disks to the VM (and set their model and serial fields
# to something predictable, so we can refer to them later)
for i in {0..3}; do
diskpath="${TESTDIR:?}/lvmbasic${i}.img"
dd if=/dev/zero of="$diskpath" bs=1M count=32
qemu_opts+=(
"-device ide-hd,bus=ahci0.$i,drive=drive$i,model=foobar,serial=deadbeeflvm$i"
"-drive format=raw,cache=unsafe,file=$diskpath,if=none,id=drive$i"
)
done
KERNEL_APPEND="systemd.setenv=TEST_FUNCTION_NAME=${FUNCNAME[0]} ${USER_KERNEL_APPEND:-}"
QEMU_OPTIONS="${qemu_opts[*]} ${USER_QEMU_OPTIONS:-}"
test_run_one "${1:?}"
}
# Allow overriding which tests should be run from the "outside", useful for manual # Allow overriding which tests should be run from the "outside", useful for manual
# testing (make -C test/... TESTCASES="testcase1 testcase2") # testing (make -C test/... TESTCASES="testcase1 testcase2")
if [[ -v "TESTCASES" && -n "$TESTCASES" ]]; then if [[ -v "TESTCASES" && -n "$TESTCASES" ]]; then

View File

@ -410,7 +410,7 @@ run_qemu() {
fi fi
kernel_params+=( kernel_params+=(
"root=/dev/sda1" "root=LABEL=systemd_boot"
"rw" "rw"
"raid=noautodetect" "raid=noautodetect"
"rd.luks=0" "rd.luks=0"
@ -896,6 +896,7 @@ install_modules() {
install_dmevent() { install_dmevent() {
instmods dm_crypt =crypto instmods dm_crypt =crypto
inst_binary dmeventd inst_binary dmeventd
image_install "${ROOTLIBDIR:?}"/system/dm-event.{service,socket}
if get_bool "$LOOKS_LIKE_DEBIAN"; then if get_bool "$LOOKS_LIKE_DEBIAN"; then
# dmsetup installs 55-dm and 60-persistent-storage-dm on Debian/Ubuntu # dmsetup installs 55-dm and 60-persistent-storage-dm on Debian/Ubuntu
# and since buster/bionic 95-dm-notify.rules # and since buster/bionic 95-dm-notify.rules
@ -935,6 +936,20 @@ install_multipath() {
fi fi
} }
install_lvm() {
image_install lvm
image_install "${ROOTLIBDIR:?}"/system/lvm2-lvmpolld.{service,socket}
image_install "${ROOTLIBDIR:?}"/system/{blk-availability,lvm2-monitor,lvm2-pvscan@}.service
image_install "${ROOTLIBDIR:?}"/system-generators/lvm2-activation-generator
image_install -o "/lib/tmpfiles.d/lvm2.conf"
if get_bool "$LOOKS_LIKE_DEBIAN"; then
inst_rules 56-lvm.rules 69-lvm-metad.rules
else
inst_rules 11-dm-lvm.rules 69-dm-lvm-metad.rules
fi
mkdir -p "${initdir:?}/etc/lvm"
}
install_compiled_systemd() { install_compiled_systemd() {
dinfo "Install compiled systemd" dinfo "Install compiled systemd"
@ -1120,9 +1135,9 @@ EOF
udevadm settle udevadm settle
local label=(-L systemd) local label=(-L systemd_boot)
# mkfs.reiserfs doesn't know -L. so, use --label instead # mkfs.reiserfs doesn't know -L. so, use --label instead
[[ "$FSTYPE" == "reiserfs" ]] && label=(--label systemd) [[ "$FSTYPE" == "reiserfs" ]] && label=(--label systemd_boot)
if ! mkfs -t "${FSTYPE}" "${label[@]}" "${LOOPDEV}p1" -q; then if ! mkfs -t "${FSTYPE}" "${label[@]}" "${LOOPDEV}p1" -q; then
dfatal "Failed to mkfs -t ${FSTYPE}" dfatal "Failed to mkfs -t ${FSTYPE}"
exit 1 exit 1

View File

@ -6,7 +6,7 @@ mkdir -p /run/udev/rules.d/
rm -f /run/udev/rules.d/50-testsuite.rules rm -f /run/udev/rules.d/50-testsuite.rules
udevadm control --reload udevadm control --reload
udevadm trigger /dev/sda udevadm trigger --settle /dev/sda
while : ; do while : ; do
( (
@ -24,7 +24,7 @@ SUBSYSTEM=="block", KERNEL=="sda", OPTIONS="log_level=debug"
ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="foobar.service" ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="foobar.service"
EOF EOF
udevadm control --reload udevadm control --reload
udevadm trigger /dev/sda udevadm trigger --settle /dev/sda
while : ; do while : ; do
( (
@ -42,7 +42,7 @@ SUBSYSTEM=="block", KERNEL=="sda", OPTIONS="log_level=debug"
ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="waldo.service" ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="waldo.service"
EOF EOF
udevadm control --reload udevadm control --reload
udevadm trigger /dev/sda udevadm trigger --settle /dev/sda
while : ; do while : ; do
( (
@ -58,7 +58,7 @@ done
rm /run/udev/rules.d/50-testsuite.rules rm /run/udev/rules.d/50-testsuite.rules
udevadm control --reload udevadm control --reload
udevadm trigger /dev/sda udevadm trigger --settle /dev/sda
while : ; do while : ; do
( (

View File

@ -8,10 +8,10 @@ setup() {
mkdir -p "${test_rule%/*}" mkdir -p "${test_rule%/*}"
cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
cat >"${test_rule}" <<EOF cat >"${test_rule}" <<EOF
SUBSYSTEM=="net", KERNEL=="lo", OPTIONS="log_level=debug" ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", OPTIONS="log_level=debug"
SUBSYSTEM=="net", KERNEL=="lo", PROGRAM=="/bin/sleep 60" ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", PROGRAM=="/bin/sleep 60"
EOF EOF
echo "event_timeout=30" >>/etc/udev/udev.conf echo "event_timeout=10" >>/etc/udev/udev.conf
echo "timeout_signal=SIGABRT" >>/etc/udev/udev.conf echo "timeout_signal=SIGABRT" >>/etc/udev/udev.conf
systemctl restart systemd-udevd.service systemctl restart systemd-udevd.service
@ -28,13 +28,13 @@ teardown() {
run_test() { run_test() {
since="$(date +%T)" since="$(date +%T)"
echo add >/sys/class/net/lo/uevent udevadm trigger -w --action add /dev/null
for _ in {1..20}; do for _ in {1..20}; do
sleep 5
if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then
return 0 return 0
fi fi
sleep .5
done done
return 1 return 1

View File

@ -15,42 +15,34 @@ ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
EOF EOF
udevadm control --reload udevadm control --reload
udevadm trigger -c add /dev/null udevadm trigger --settle --action add /dev/null
while test ! -f /run/udev/tags/added/c1:3 || test -f /run/udev/tags/added/c1:3
test -f /run/udev/tags/changed/c1:3 || test ! -f /run/udev/tags/changed/c1:3
! udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' || udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*'
! udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' || udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*'
udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' || udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' && { echo 'unexpected TAGS='; exit 1; }
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' && { echo 'unexpected CURRENT_TAGS='; exit 1; }
do
sleep .5
done
udevadm trigger --settle --action change /dev/null
test -f /run/udev/tags/added/c1:3
test -f /run/udev/tags/changed/c1:3
udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*'
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' && { echo 'unexpected CURRENT_TAGS='; exit 1; }
udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*'
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*'
udevadm trigger --settle --action add /dev/null
test -f /run/udev/tags/added/c1:3
test -f /run/udev/tags/changed/c1:3
udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*'
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*'
udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*'
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' && { echo 'unexpected CURRENT_TAGS='; exit 1; }
rm /run/udev/rules.d/50-testsuite.rules
udevadm control --reload udevadm control --reload
udevadm trigger -c change /dev/null
while test ! -f /run/udev/tags/added/c1:3 ||
test ! -f /run/udev/tags/changed/c1:3 ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' ||
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' ||
! udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*'
do
sleep .5
done
udevadm control --reload
udevadm trigger -c add /dev/null
while test ! -f /run/udev/tags/added/c1:3 ||
test ! -f /run/udev/tags/changed/c1:3 ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' ||
! udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' ||
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*'
do
sleep .5
done
exit 0 exit 0

View File

@ -10,15 +10,13 @@ ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", IMPORT{program}="/bin/echo -e H
EOF EOF
udevadm control --reload udevadm control --reload
udevadm trigger -c add /dev/null udevadm trigger --settle --action add /dev/null
while : ; do test -f /run/udev/data/c1:3
test -f /run/udev/data/c1:3 && udevadm info /dev/null | grep -q 'E: HOGE=aa\\x20\\x20\\x20bb'
udevadm info /dev/null | grep -q 'E: HOGE=aa\\x20\\x20\\x20bb' && udevadm info /dev/null | grep -q 'E: FOO=\\x20aaa\\x20'
udevadm info /dev/null | grep -q 'E: FOO=\\x20aaa\\x20' &&
break
sleep .5 rm /run/udev/rules.d/50-testsuite.rules
done udevadm control --reload
exit 0 exit 0

View File

@ -21,20 +21,15 @@ function check() {
systemctl restart systemd-udevd.service systemctl restart systemd-udevd.service
udevadm control --ping udevadm control --ping
udevadm settle udevadm settle
sleep 1
check_validity check_validity
for ((j=0;j<2;j++)); do for ((j=0;j<2;j++)); do
udevadm trigger -w --action add --subsystem-match=block udevadm trigger -w --action add --subsystem-match=block
udevadm settle
sleep 1
check_validity check_validity
done done
for ((j=0;j<2;j++)); do for ((j=0;j<2;j++)); do
udevadm trigger -w --action change --subsystem-match=block udevadm trigger -w --action change --subsystem-match=block
udevadm settle
sleep 1
check_validity check_validity
done done
done done
@ -70,6 +65,5 @@ rm /run/udev/rules.d/00-debug.rules
rm /run/udev/rules.d/50-testsuite.rules rm /run/udev/rules.d/50-testsuite.rules
udevadm control --reload udevadm control --reload
udevadm trigger -w --action add --subsystem-match=block
exit 0 exit 0

View File

@ -5,11 +5,27 @@ set -eux
set -o pipefail set -o pipefail
# Check if all symlinks under /dev/disk/ are valid # Check if all symlinks under /dev/disk/ are valid
# shellcheck disable=SC2120
helper_check_device_symlinks() { helper_check_device_symlinks() {
local dev link target # Disable verbose logging only for this function (and reset the signal handler
# when leaving the function)
set +x; trap "trap - RETURN; set -x" RETURN
local dev link path paths target
[[ $# -gt 0 ]] && paths=("$@") || paths=("/dev/disk")
# Check if all given paths are valid
for path in "${paths[@]}"; do
if ! test -e "$path"; then
echo >&2 "Path '$path' doesn't exist"
return 1
fi
done
while read -r link; do while read -r link; do
target="$(readlink -f "$link")" target="$(readlink -f "$link")"
echo "$link -> $target"
# Both checks should do virtually the same thing, but check both to be # Both checks should do virtually the same thing, but check both to be
# on the safe side # on the safe side
if [[ ! -e "$link" || ! -e "$target" ]]; then if [[ ! -e "$link" || ! -e "$target" ]]; then
@ -23,7 +39,7 @@ helper_check_device_symlinks() {
echo >&2 "ERROR: symlink '$link' points to '$target' but '$dev' was expected" echo >&2 "ERROR: symlink '$link' points to '$target' but '$dev' was expected"
return 1 return 1
fi fi
done < <(find /dev/disk -type l) done < <(find "${paths[@]}" -type l)
} }
testcase_megasas2_basic() { testcase_megasas2_basic() {
@ -177,6 +193,92 @@ EOF
rm -f "$partscript" rm -f "$partscript"
} }
testcase_lvm_basic() {
local i part
local vgroup="MyTestGroup$RANDOM"
local devices=(
/dev/disk/by-id/ata-foobar_deadbeeflvm{0..3}
)
# Make sure all the necessary soon-to-be-LVM devices exist
ls -l "${devices[@]}"
# Add all test devices into a volume group, create two logical volumes,
# and check if necessary symlinks exist (and are valid)
lvm pvcreate -y "${devices[@]}"
lvm pvs
lvm vgcreate "$vgroup" -y "${devices[@]}"
lvm vgs
lvm vgchange -ay "$vgroup"
lvm lvcreate -y -L 4M "$vgroup" -n mypart1
lvm lvcreate -y -L 8M "$vgroup" -n mypart2
lvm lvs
udevadm settle
test -e "/dev/$vgroup/mypart1"
test -e "/dev/$vgroup/mypart2"
mkfs.ext4 -L mylvpart1 "/dev/$vgroup/mypart1"
udevadm settle
test -e "/dev/disk/by-label/mylvpart1"
helper_check_device_symlinks "/dev/disk" "/dev/$vgroup"
# Disable the VG and check symlinks...
lvm vgchange -an "$vgroup"
udevadm settle
test ! -e "/dev/$vgroup"
test ! -e "/dev/disk/by-label/mylvpart1"
helper_check_device_symlinks "/dev/disk"
# reenable the VG and check the symlinks again if all LVs are properly activated
lvm vgchange -ay "$vgroup"
udevadm settle
test -e "/dev/$vgroup/mypart1"
test -e "/dev/$vgroup/mypart2"
test -e "/dev/disk/by-label/mylvpart1"
helper_check_device_symlinks "/dev/disk" "/dev/$vgroup"
# Same as above, but now with more "stress"
for i in {1..100}; do
lvm vgchange -an "$vgroup"
lvm vgchange -ay "$vgroup"
if ((i % 10 == 0)); then
udevadm settle
test -e "/dev/$vgroup/mypart1"
test -e "/dev/$vgroup/mypart2"
test -e "/dev/disk/by-label/mylvpart1"
helper_check_device_symlinks "/dev/disk" "/dev/$vgroup"
fi
done
# Remove the first LV
lvm lvremove -y "$vgroup/mypart1"
udevadm settle
test ! -e "/dev/$vgroup/mypart1"
test -e "/dev/$vgroup/mypart2"
helper_check_device_symlinks "/dev/disk" "/dev/$vgroup"
# Create & remove LVs in a loop, i.e. with more "stress"
for i in {1..50}; do
# 1) Create 16 logical volumes
for part in {0..15}; do
lvm lvcreate -y -L 4M "$vgroup" -n "looppart$part"
done
# 2) Immediately remove them
lvm lvremove -y "$vgroup"/looppart{0..15}
# 3) On every 10th iteration settle udev and check if all partitions are
# indeed gone, and if all symlinks are still valid
if ((i % 10 == 0)); then
udevadm settle
for part in {0..15}; do
test ! -e "/dev/$vgroup/looppart$part"
done
helper_check_device_symlinks "/dev/disk" "/dev/$vgroup"
fi
done
}
: >/failed : >/failed
udevadm settle udevadm settle