|
|
aa0848 |
From 68199fe69a2c46e498bc7e9528d54922deecc553 Mon Sep 17 00:00:00 2001
|
|
|
aa0848 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
aa0848 |
Date: Mon, 14 Sep 2020 17:58:03 +0200
|
|
|
aa0848 |
Subject: [PATCH] test-mountpointutil-util: do not assert in test_mnt_id()
|
|
|
aa0848 |
|
|
|
aa0848 |
https://bugzilla.redhat.com/show_bug.cgi?id=1803070
|
|
|
aa0848 |
|
|
|
aa0848 |
I *think* this a kernel bug: the mnt_id as listed in /proc/self/mountinfo is different
|
|
|
aa0848 |
than the one we get from /proc/self/fdinfo/. This only matters when both statx and
|
|
|
aa0848 |
name_to_handle_at are unavailable and we hit the fallback path that goes through fdinfo:
|
|
|
aa0848 |
|
|
|
aa0848 |
(gdb) !uname -r
|
|
|
aa0848 |
5.6.19-200.fc31.ppc64le
|
|
|
aa0848 |
|
|
|
aa0848 |
(gdb) !cat /proc/self/mountinfo
|
|
|
aa0848 |
697 664 253:0 /var/lib/mock/fedora-31-ppc64le/root / rw,relatime shared:298 master:1 - xfs /dev/mapper/fedora_rh--power--vm14-root rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota
|
|
|
aa0848 |
698 697 253:0 /var/cache/mock/fedora-31-ppc64le/yum_cache /var/cache/yum rw,relatime shared:299 master:1 - xfs /dev/mapper/fedora_rh--power--vm14-root rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota
|
|
|
aa0848 |
699 697 253:0 /var/cache/mock/fedora-31-ppc64le/dnf_cache /var/cache/dnf rw,relatime shared:300 master:1 - xfs /dev/mapper/fedora_rh--power--vm14-root rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota
|
|
|
aa0848 |
700 697 0:32 /mock-selinux-plugin.7me9bfpi /proc/filesystems rw,nosuid,nodev shared:301 master:18 - tmpfs tmpfs rw,seclabel <==========================================================
|
|
|
aa0848 |
701 697 0:41 / /sys ro,nosuid,nodev,noexec,relatime shared:302 - sysfs sysfs ro,seclabel
|
|
|
aa0848 |
702 701 0:21 / /sys/fs/selinux ro,nosuid,nodev,noexec,relatime shared:306 master:8 - selinuxfs selinuxfs rw
|
|
|
aa0848 |
703 697 0:42 / /dev rw,nosuid shared:303 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
704 703 0:43 / /dev/shm rw,nosuid,nodev shared:304 - tmpfs tmpfs rw,seclabel
|
|
|
aa0848 |
705 703 0:45 / /dev/pts rw,nosuid,noexec,relatime shared:307 - devpts devpts rw,seclabel,gid=5,mode=620,ptmxmode=666
|
|
|
aa0848 |
706 703 0:6 /btrfs-control /dev/btrfs-control rw,nosuid shared:308 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
707 703 0:6 /loop-control /dev/loop-control rw,nosuid shared:309 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
708 703 0:6 /loop0 /dev/loop0 rw,nosuid shared:310 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
709 703 0:6 /loop1 /dev/loop1 rw,nosuid shared:311 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
710 703 0:6 /loop10 /dev/loop10 rw,nosuid shared:312 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
711 703 0:6 /loop11 /dev/loop11 rw,nosuid shared:313 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
712 703 0:6 /loop2 /dev/loop2 rw,nosuid shared:314 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
713 703 0:6 /loop3 /dev/loop3 rw,nosuid shared:315 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
714 703 0:6 /loop4 /dev/loop4 rw,nosuid shared:316 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
715 703 0:6 /loop5 /dev/loop5 rw,nosuid shared:317 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
716 703 0:6 /loop6 /dev/loop6 rw,nosuid shared:318 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
717 703 0:6 /loop7 /dev/loop7 rw,nosuid shared:319 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
718 703 0:6 /loop8 /dev/loop8 rw,nosuid shared:320 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
719 703 0:6 /loop9 /dev/loop9 rw,nosuid shared:321 master:9 - devtmpfs devtmpfs rw,seclabel,size=4107840k,nr_inodes=64185,mode=755
|
|
|
aa0848 |
720 697 0:44 / /run rw,nosuid,nodev shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
721 720 0:25 /systemd/nspawn/propagate/9cc8a155d0244558b273f773d2b92142 /run/systemd/nspawn/incoming ro master:12 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
722 697 0:32 /mock-resolv.dvml91hp /etc/resolv.conf rw,nosuid,nodev shared:322 master:18 - tmpfs tmpfs rw,seclabel
|
|
|
aa0848 |
725 697 0:47 / /proc rw,nosuid,nodev,noexec,relatime shared:323 - proc proc rw
|
|
|
aa0848 |
603 725 0:47 /sys /proc/sys ro,nosuid,nodev,noexec,relatime shared:323 - proc proc rw
|
|
|
aa0848 |
604 725 0:44 /systemd/inaccessible/reg /proc/kallsyms ro,nosuid,nodev,noexec shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
605 725 0:44 /systemd/inaccessible/reg /proc/kcore ro,nosuid,nodev,noexec shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
606 725 0:44 /systemd/inaccessible/reg /proc/keys ro,nosuid,nodev,noexec shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
607 725 0:44 /systemd/inaccessible/reg /proc/sysrq-trigger ro,nosuid,nodev,noexec shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
608 725 0:44 /systemd/inaccessible/reg /proc/timer_list ro,nosuid,nodev,noexec shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
609 725 0:47 /bus /proc/bus ro,nosuid,nodev,noexec,relatime shared:323 - proc proc rw
|
|
|
aa0848 |
610 725 0:47 /fs /proc/fs ro,nosuid,nodev,noexec,relatime shared:323 - proc proc rw
|
|
|
aa0848 |
611 725 0:47 /irq /proc/irq ro,nosuid,nodev,noexec,relatime shared:323 - proc proc rw
|
|
|
aa0848 |
612 725 0:47 /scsi /proc/scsi ro,nosuid,nodev,noexec,relatime shared:323 - proc proc rw
|
|
|
aa0848 |
613 703 0:46 / /dev/mqueue rw,nosuid,nodev,noexec,relatime shared:324 - mqueue mqueue rw,seclabel
|
|
|
aa0848 |
614 701 0:26 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime shared:325 - cgroup2 cgroup rw,seclabel,nsdelegate
|
|
|
aa0848 |
615 603 0:44 /.#proc-sys-kernel-random-boot-id4fbdce67af46d1c2//deleted /proc/sys/kernel/random/boot_id ro,nosuid,nodev,noexec shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
616 725 0:44 /.#proc-sys-kernel-random-boot-id4fbdce67af46d1c2//deleted /proc/sys/kernel/random/boot_id rw,nosuid,nodev shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
617 725 0:44 /.#proc-kmsg5b7a8bcfe6717139//deleted /proc/kmsg rw,nosuid,nodev shared:305 - tmpfs tmpfs rw,seclabel,mode=755
|
|
|
aa0848 |
|
|
|
aa0848 |
The test process does
|
|
|
aa0848 |
name_to_handle_at("/proc/filesystems") which returns -EOPNOTSUPP, and then
|
|
|
aa0848 |
openat(AT_FDCWD, "/proc/filesystems") which returns 4, and then
|
|
|
aa0848 |
read(open("/proc/self/fdinfo/4", ...)) which gives
|
|
|
aa0848 |
"pos:\t0\nflags:\t012100000\nmnt_id:\t725\n"
|
|
|
aa0848 |
|
|
|
aa0848 |
and the "725" is clearly inconsistent with "700" in /proc/self/mountinfo.
|
|
|
aa0848 |
|
|
|
aa0848 |
We could either drop the fallback path (and fail name_to_handle_at() is not
|
|
|
aa0848 |
avaliable) or ignore the error in the test. Not sure what is better. I think
|
|
|
aa0848 |
this issue only occurs sometimes and with older kernels, so probably continuing
|
|
|
aa0848 |
with the current flaky implementation is better than ripping out the fallback.
|
|
|
aa0848 |
|
|
|
aa0848 |
Another strace:
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="mnt ids of /proc/sys is 603", iov_len=27}, {iov_base="\n", iov_len=1}], 2mnt ids of /proc/sys is 603
|
|
|
aa0848 |
) = 28
|
|
|
aa0848 |
name_to_handle_at(AT_FDCWD, "/", {handle_bytes=128 => 12, handle_type=129, f_handle=0x52748401000000008b93e20d}, [697], 0) = 0
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="mnt ids of / is 697", iov_len=19}, {iov_base="\n", iov_len=1}], 2mnt ids of / is 697
|
|
|
aa0848 |
) = 20
|
|
|
aa0848 |
name_to_handle_at(AT_FDCWD, "/proc/kcore", {handle_bytes=128 => 12, handle_type=1, f_handle=0x92ddcfcd2e802d0100000000}, [605], 0) = 0
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="mnt ids of /proc/kcore is 605", iov_len=29}, {iov_base="\n", iov_len=1}], 2mnt ids of /proc/kcore is 605
|
|
|
aa0848 |
) = 30
|
|
|
aa0848 |
name_to_handle_at(AT_FDCWD, "/dev", {handle_bytes=128 => 12, handle_type=1, f_handle=0x8ae269160c802d0100000000}, [703], 0) = 0
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="mnt ids of /dev is 703", iov_len=22}, {iov_base="\n", iov_len=1}], 2mnt ids of /dev is 703
|
|
|
aa0848 |
) = 23
|
|
|
aa0848 |
name_to_handle_at(AT_FDCWD, "/proc/filesystems", {handle_bytes=128}, 0x7fffe36ddb84, 0) = -1 EOPNOTSUPP (Operation not supported)
|
|
|
aa0848 |
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 4</proc/filesystems>
|
|
|
aa0848 |
openat(AT_FDCWD, "/proc/self/fdinfo/4", O_RDONLY|O_CLOEXEC) = 5</proc/20/fdinfo/4>
|
|
|
aa0848 |
fstat(5</proc/20/fdinfo/4>, {st_mode=S_IFREG|0400, st_size=0, ...}) = 0
|
|
|
aa0848 |
fstat(5</proc/20/fdinfo/4>, {st_mode=S_IFREG|0400, st_size=0, ...}) = 0
|
|
|
aa0848 |
read(5</proc/20/fdinfo/4>, "pos:\t0\nflags:\t012100000\nmnt_id:\t725\n", 2048) = 36
|
|
|
aa0848 |
read(5</proc/20/fdinfo/4>, "", 1024) = 0
|
|
|
aa0848 |
close(5</proc/20/fdinfo/4>) = 0
|
|
|
aa0848 |
close(4</proc/filesystems>) = 0
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="mnt ids of /proc/filesystems are 700, 725", iov_len=41}, {iov_base="\n", iov_len=1}], 2mnt ids of /proc/filesystems are 700, 725
|
|
|
aa0848 |
) = 42
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="the other path for mnt id 725 is /proc", iov_len=38}, {iov_base="\n", iov_len=1}], 2the other path for mnt id 725 is /proc
|
|
|
aa0848 |
) = 39
|
|
|
aa0848 |
writev(2</dev/pts/0>, [{iov_base="Assertion 'path_equal(p, t)' failed at src/test/test-mountpoint-util.c:94, function test_mnt_id(). Aborting.", iov_len=108}, {iov_base="\n", iov_len=1}], 2Assertion 'path_equal(p, t)' failed at src/test/test-mountpoint-util.c:94, function test_mnt_id(). Aborting.
|
|
|
aa0848 |
) = 109
|
|
|
aa0848 |
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
|
|
|
aa0848 |
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
|
|
|
aa0848 |
getpid() = 20
|
|
|
aa0848 |
gettid() = 20
|
|
|
aa0848 |
tgkill(20, 20, SIGABRT) = 0
|
|
|
aa0848 |
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
|
|
|
aa0848 |
|
|
|
aa0848 |
RHEL notes: af918c4 should mitigate this issue, but in some build
|
|
|
aa0848 |
systems (Copr, brew, etc.) we don't have enough privileges to create a
|
|
|
aa0848 |
new mount namespace
|
|
|
aa0848 |
|
|
|
aa0848 |
Cherry-picked manually from https://github.com/systemd/systemd/pull/17050.
|
|
|
aa0848 |
|
|
|
aa0848 |
rhel-only
|
|
|
aa0848 |
Related: #2017035
|
|
|
aa0848 |
---
|
|
|
aa0848 |
src/test/test-mountpoint-util.c | 8 ++++++--
|
|
|
aa0848 |
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
|
aa0848 |
|
|
|
aa0848 |
diff --git a/src/test/test-mountpoint-util.c b/src/test/test-mountpoint-util.c
|
|
|
aa0848 |
index d11edf502a..9515d8cf7b 100644
|
|
|
aa0848 |
--- a/src/test/test-mountpoint-util.c
|
|
|
aa0848 |
+++ b/src/test/test-mountpoint-util.c
|
|
|
aa0848 |
@@ -101,8 +101,12 @@ TEST(mnt_id) {
|
|
|
aa0848 |
/* The ids don't match? If so, then there are two mounts on the same path, let's check if
|
|
|
aa0848 |
* that's really the case */
|
|
|
aa0848 |
char *t = hashmap_get(h, INT_TO_PTR(mnt_id2));
|
|
|
aa0848 |
- log_debug("the other path for mnt id %i is %s\n", mnt_id2, t);
|
|
|
aa0848 |
- assert_se(path_equal(p, t));
|
|
|
aa0848 |
+ log_debug("Path for mnt id %i from /proc/self/mountinfo is %s\n", mnt_id2, t);
|
|
|
aa0848 |
+
|
|
|
aa0848 |
+ if (!path_equal(p, t))
|
|
|
aa0848 |
+ /* Apparent kernel bug in /proc/self/fdinfo */
|
|
|
aa0848 |
+ log_warning("Bad mount id given for %s: %d, should be %d",
|
|
|
aa0848 |
+ p, mnt_id2, mnt_id);
|
|
|
aa0848 |
}
|
|
|
aa0848 |
}
|
|
|
aa0848 |
|