mirror of
https://github.com/systemd/systemd
synced 2026-03-28 09:44:50 +01:00
Compare commits
16 Commits
73bf0f2ace
...
f782eee68a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f782eee68a | ||
|
|
5aaa55d841 | ||
|
|
1dcd91ad11 | ||
|
|
2d253d7206 | ||
|
|
a871f3bb54 | ||
|
|
a9d8bebacd | ||
|
|
e70f57796d | ||
|
|
9228ecaf8c | ||
|
|
26146d82db | ||
|
|
0203b2e4be | ||
|
|
6df0259732 | ||
|
|
a0560b93ea | ||
|
|
df72bd45f3 | ||
|
|
4999f3688f | ||
|
|
e3d9a2e74f | ||
|
|
bac05644a7 |
@ -433,6 +433,11 @@ int read_virtual_file(const char *filename, size_t max_size, char **ret_contents
|
||||
}
|
||||
|
||||
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 {
|
||||
size = MIN(READ_VIRTUAL_BYTES_MAX, max_size);
|
||||
n_retries = 0;
|
||||
|
||||
@ -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
|
||||
* 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
|
||||
* 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_SPACE_TIMEVAL +
|
||||
CMSG_SPACE(sizeof(int)) + /* fd */
|
||||
CMSG_SPACE(NAME_MAX) /* selinux label */) control;
|
||||
CMSG_SPACE(NAME_MAX) /* selinux label */) control = {};
|
||||
|
||||
union sockaddr_union sa = {};
|
||||
|
||||
|
||||
@ -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,
|
||||
triple_timestamp *ret_timestamp) {
|
||||
|
||||
/* This needs to be initialized with zero. See #20741. */
|
||||
CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(int)) + /* ttl */
|
||||
CMSG_SPACE_TIMEVAL) control;
|
||||
CMSG_SPACE_TIMEVAL) control = {};
|
||||
struct iovec iov = {};
|
||||
union sockaddr_union sa = {};
|
||||
struct msghdr msg = {
|
||||
|
||||
@ -416,7 +416,8 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
|
||||
.iov_base = &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;
|
||||
struct msghdr msghdr = {
|
||||
.msg_iov = &iov,
|
||||
|
||||
@ -1,5 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# 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
|
||||
|
||||
TEST_DESCRIPTION="systemd-udev storage tests"
|
||||
@ -30,6 +38,11 @@ test_append_files() {
|
||||
install_multipath
|
||||
fi
|
||||
|
||||
# Configure LVM
|
||||
if command -v lvm; then
|
||||
install_lvm
|
||||
fi
|
||||
|
||||
for i in {0..127}; do
|
||||
dd if=/dev/zero of="${TESTDIR:?}/disk$i.img" bs=1M count=1
|
||||
echo "device$i" >"${TESTDIR:?}/disk$i.img"
|
||||
@ -246,6 +259,31 @@ testcase_simultaneous_events() {
|
||||
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
|
||||
# testing (make -C test/... TESTCASES="testcase1 testcase2")
|
||||
if [[ -v "TESTCASES" && -n "$TESTCASES" ]]; then
|
||||
|
||||
@ -410,7 +410,7 @@ run_qemu() {
|
||||
fi
|
||||
|
||||
kernel_params+=(
|
||||
"root=/dev/sda1"
|
||||
"root=LABEL=systemd_boot"
|
||||
"rw"
|
||||
"raid=noautodetect"
|
||||
"rd.luks=0"
|
||||
@ -896,6 +896,7 @@ install_modules() {
|
||||
install_dmevent() {
|
||||
instmods dm_crypt =crypto
|
||||
inst_binary dmeventd
|
||||
image_install "${ROOTLIBDIR:?}"/system/dm-event.{service,socket}
|
||||
if get_bool "$LOOKS_LIKE_DEBIAN"; then
|
||||
# dmsetup installs 55-dm and 60-persistent-storage-dm on Debian/Ubuntu
|
||||
# and since buster/bionic 95-dm-notify.rules
|
||||
@ -935,6 +936,20 @@ install_multipath() {
|
||||
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() {
|
||||
dinfo "Install compiled systemd"
|
||||
|
||||
@ -1120,9 +1135,9 @@ EOF
|
||||
|
||||
udevadm settle
|
||||
|
||||
local label=(-L systemd)
|
||||
local label=(-L systemd_boot)
|
||||
# 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
|
||||
dfatal "Failed to mkfs -t ${FSTYPE}"
|
||||
exit 1
|
||||
|
||||
@ -6,7 +6,7 @@ mkdir -p /run/udev/rules.d/
|
||||
|
||||
rm -f /run/udev/rules.d/50-testsuite.rules
|
||||
udevadm control --reload
|
||||
udevadm trigger /dev/sda
|
||||
udevadm trigger --settle /dev/sda
|
||||
|
||||
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"
|
||||
EOF
|
||||
udevadm control --reload
|
||||
udevadm trigger /dev/sda
|
||||
udevadm trigger --settle /dev/sda
|
||||
|
||||
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"
|
||||
EOF
|
||||
udevadm control --reload
|
||||
udevadm trigger /dev/sda
|
||||
udevadm trigger --settle /dev/sda
|
||||
|
||||
while : ; do
|
||||
(
|
||||
@ -58,7 +58,7 @@ done
|
||||
rm /run/udev/rules.d/50-testsuite.rules
|
||||
|
||||
udevadm control --reload
|
||||
udevadm trigger /dev/sda
|
||||
udevadm trigger --settle /dev/sda
|
||||
|
||||
while : ; do
|
||||
(
|
||||
|
||||
@ -8,10 +8,10 @@ setup() {
|
||||
mkdir -p "${test_rule%/*}"
|
||||
cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
|
||||
cat >"${test_rule}" <<EOF
|
||||
SUBSYSTEM=="net", KERNEL=="lo", OPTIONS="log_level=debug"
|
||||
SUBSYSTEM=="net", KERNEL=="lo", PROGRAM=="/bin/sleep 60"
|
||||
ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", OPTIONS="log_level=debug"
|
||||
ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", PROGRAM=="/bin/sleep 60"
|
||||
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
|
||||
|
||||
systemctl restart systemd-udevd.service
|
||||
@ -28,13 +28,13 @@ teardown() {
|
||||
run_test() {
|
||||
since="$(date +%T)"
|
||||
|
||||
echo add >/sys/class/net/lo/uevent
|
||||
udevadm trigger -w --action add /dev/null
|
||||
|
||||
for _ in {1..20}; do
|
||||
sleep 5
|
||||
if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then
|
||||
return 0
|
||||
fi
|
||||
sleep .5
|
||||
done
|
||||
|
||||
return 1
|
||||
|
||||
@ -15,42 +15,34 @@ ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
|
||||
EOF
|
||||
|
||||
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/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
|
||||
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:.*' && { echo 'unexpected TAGS='; exit 1; }
|
||||
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' && { echo 'unexpected CURRENT_TAGS='; exit 1; }
|
||||
|
||||
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 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
|
||||
|
||||
@ -10,15 +10,13 @@ ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", IMPORT{program}="/bin/echo -e H
|
||||
EOF
|
||||
|
||||
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 &&
|
||||
udevadm info /dev/null | grep -q 'E: HOGE=aa\\x20\\x20\\x20bb' &&
|
||||
udevadm info /dev/null | grep -q 'E: FOO=\\x20aaa\\x20' &&
|
||||
break
|
||||
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: FOO=\\x20aaa\\x20'
|
||||
|
||||
sleep .5
|
||||
done
|
||||
rm /run/udev/rules.d/50-testsuite.rules
|
||||
udevadm control --reload
|
||||
|
||||
exit 0
|
||||
|
||||
@ -21,20 +21,15 @@ function check() {
|
||||
systemctl restart systemd-udevd.service
|
||||
udevadm control --ping
|
||||
udevadm settle
|
||||
sleep 1
|
||||
check_validity
|
||||
|
||||
for ((j=0;j<2;j++)); do
|
||||
udevadm trigger -w --action add --subsystem-match=block
|
||||
udevadm settle
|
||||
sleep 1
|
||||
check_validity
|
||||
done
|
||||
|
||||
for ((j=0;j<2;j++)); do
|
||||
udevadm trigger -w --action change --subsystem-match=block
|
||||
udevadm settle
|
||||
sleep 1
|
||||
check_validity
|
||||
done
|
||||
done
|
||||
@ -70,6 +65,5 @@ rm /run/udev/rules.d/00-debug.rules
|
||||
rm /run/udev/rules.d/50-testsuite.rules
|
||||
|
||||
udevadm control --reload
|
||||
udevadm trigger -w --action add --subsystem-match=block
|
||||
|
||||
exit 0
|
||||
|
||||
@ -5,11 +5,27 @@ set -eux
|
||||
set -o pipefail
|
||||
|
||||
# Check if all symlinks under /dev/disk/ are valid
|
||||
# shellcheck disable=SC2120
|
||||
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
|
||||
target="$(readlink -f "$link")"
|
||||
echo "$link -> $target"
|
||||
# Both checks should do virtually the same thing, but check both to be
|
||||
# on the safe side
|
||||
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"
|
||||
return 1
|
||||
fi
|
||||
done < <(find /dev/disk -type l)
|
||||
done < <(find "${paths[@]}" -type l)
|
||||
}
|
||||
|
||||
testcase_megasas2_basic() {
|
||||
@ -177,6 +193,92 @@ EOF
|
||||
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
|
||||
|
||||
udevadm settle
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user