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

Compare commits

..

No commits in common. "f782eee68aea996c68b8cfeba5f288dae7fc876f" and "73bf0f2ace1472ceb72295e0fe5e425998af8a86" have entirely different histories.

12 changed files with 66 additions and 215 deletions

View File

@ -433,11 +433,6 @@ 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;

View File

@ -1267,14 +1267,11 @@ 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.
*
* 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. */
* limit is known. */
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 = {};

View File

@ -148,9 +148,8 @@ 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 = {

View File

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

View File

@ -1,13 +1,5 @@
#!/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"
@ -38,11 +30,6 @@ 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"
@ -259,31 +246,6 @@ 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

View File

@ -410,7 +410,7 @@ run_qemu() {
fi
kernel_params+=(
"root=LABEL=systemd_boot"
"root=/dev/sda1"
"rw"
"raid=noautodetect"
"rd.luks=0"
@ -896,7 +896,6 @@ 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
@ -936,20 +935,6 @@ 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"
@ -1135,9 +1120,9 @@ EOF
udevadm settle
local label=(-L systemd_boot)
local label=(-L systemd)
# mkfs.reiserfs doesn't know -L. so, use --label instead
[[ "$FSTYPE" == "reiserfs" ]] && label=(--label systemd_boot)
[[ "$FSTYPE" == "reiserfs" ]] && label=(--label systemd)
if ! mkfs -t "${FSTYPE}" "${label[@]}" "${LOOPDEV}p1" -q; then
dfatal "Failed to mkfs -t ${FSTYPE}"
exit 1

View File

@ -6,7 +6,7 @@ mkdir -p /run/udev/rules.d/
rm -f /run/udev/rules.d/50-testsuite.rules
udevadm control --reload
udevadm trigger --settle /dev/sda
udevadm trigger /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 --settle /dev/sda
udevadm trigger /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 --settle /dev/sda
udevadm trigger /dev/sda
while : ; do
(
@ -58,7 +58,7 @@ done
rm /run/udev/rules.d/50-testsuite.rules
udevadm control --reload
udevadm trigger --settle /dev/sda
udevadm trigger /dev/sda
while : ; do
(

View File

@ -8,10 +8,10 @@ setup() {
mkdir -p "${test_rule%/*}"
cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
cat >"${test_rule}" <<EOF
ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", OPTIONS="log_level=debug"
ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", PROGRAM=="/bin/sleep 60"
SUBSYSTEM=="net", KERNEL=="lo", OPTIONS="log_level=debug"
SUBSYSTEM=="net", KERNEL=="lo", PROGRAM=="/bin/sleep 60"
EOF
echo "event_timeout=10" >>/etc/udev/udev.conf
echo "event_timeout=30" >>/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)"
udevadm trigger -w --action add /dev/null
echo add >/sys/class/net/lo/uevent
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

View File

@ -15,34 +15,42 @@ ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
EOF
udevadm control --reload
udevadm trigger --settle --action add /dev/null
udevadm trigger -c 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:.*' && { echo 'unexpected TAGS='; exit 1; }
udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' && { echo 'unexpected CURRENT_TAGS='; exit 1; }
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 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

View File

@ -10,13 +10,15 @@ ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", IMPORT{program}="/bin/echo -e H
EOF
udevadm control --reload
udevadm trigger --settle --action add /dev/null
udevadm trigger -c add /dev/null
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'
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
rm /run/udev/rules.d/50-testsuite.rules
udevadm control --reload
sleep .5
done
exit 0

View File

@ -21,15 +21,20 @@ 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
@ -65,5 +70,6 @@ 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

View File

@ -5,27 +5,11 @@ set -eux
set -o pipefail
# Check if all symlinks under /dev/disk/ are valid
# shellcheck disable=SC2120
helper_check_device_symlinks() {
# 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
local dev link target
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
@ -39,7 +23,7 @@ helper_check_device_symlinks() {
echo >&2 "ERROR: symlink '$link' points to '$target' but '$dev' was expected"
return 1
fi
done < <(find "${paths[@]}" -type l)
done < <(find /dev/disk -type l)
}
testcase_megasas2_basic() {
@ -193,92 +177,6 @@ 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