From 9422ce83c201ab4154de832331f0b351fc5137f6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 19 Jun 2025 17:18:11 +0200 Subject: [PATCH] udev: reset loopback block device ownership and mode on detach MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Loopback block devices are agressively reused, without being removed in between. This means various inode attributes on their device nodes will – so far – remain in effect between uses of the devices. Since there are applications which change access mode/ownership of such devices after attaching files to them, let's undo this again when we detect them to be unused again. Fixes: #37745 --- rules.d/60-block.rules | 3 ++ test/units/TEST-17-UDEV.loop-own.sh | 50 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100755 test/units/TEST-17-UDEV.loop-own.sh diff --git a/rules.d/60-block.rules b/rules.d/60-block.rules index c3bf32eb833..ea691cc277e 100644 --- a/rules.d/60-block.rules +++ b/rules.d/60-block.rules @@ -11,3 +11,6 @@ ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ACTION!="remove", SUBSYSTEM=="block", \ KERNEL=="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|vd*|xvd*|bcache*|cciss*|dasd*|ubd*|ubi*|scm*|pmem*|nbd*|zd*|rbd*|zram*|ublkb*", \ OPTIONS+="watch" + +# Reset access rights to each loopback device once it gets detached. +SUBSYSTEM=="block", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1", TEST!="loop/backing_file", GROUP="disk", MODE="660" diff --git a/test/units/TEST-17-UDEV.loop-own.sh b/test/units/TEST-17-UDEV.loop-own.sh new file mode 100755 index 00000000000..b2f6f885d0d --- /dev/null +++ b/test/units/TEST-17-UDEV.loop-own.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +# shellcheck disable=SC2317 +set -ex +set -o pipefail + +# shellcheck source=test/units/util.sh +. "$(dirname "$0")"/util.sh + +at_exit() ( + set +e + + [[ -d "$TMPDIR" ]] && rm -rf "$TMPDIR" + + udevadm control --log-level=info +) + +trap at_exit EXIT + +udevadm control --log-level=debug + +TMPDIR="$(mktemp -d)" +truncate -s 16M "$TMPDIR"/foo.raw +mkfs.ext4 "$TMPDIR"/foo.raw + +D="$(systemd-dissect --attach --loop-ref=schlumpf "$TMPDIR"/foo.raw)" + +udevadm wait --timeout=30 --settle /dev/disk/by-loop-ref/schlumpf + +SAVED_GROUP="$(stat -c "%g" "$D")" +SAVED_MODE="$(stat -c "%a" "$D")" + +chmod 705 "$D" +chown root:65534 "$D" + +test "$(stat -c "%g %a" "$D")" = "65534 705" + +losetup -d "$D" + +for _ in {0..4}; do + udevadm settle --timeout=5 + + if [[ "$(stat -c "%g" "$D")" = "$SAVED_GROUP" && "$(stat -c "%a" "$D")" = "$SAVED_MODE" ]] ; then + exit 0 + fi + + sleep 1 +done + +exit 1 -- 2.47.3