public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH] Fix tst_find_backing_dev when no initramfs
@ 2022-10-17 11:05 Alessandro Carminati
  2022-10-24 13:49 ` Richard Palethorpe
  0 siblings, 1 reply; 8+ messages in thread
From: Alessandro Carminati @ 2022-10-17 11:05 UTC (permalink / raw)
  To: ltp

mount_root() is the kernel function responsible for mounting the primary
rootfs.
A dynamic there, prevents the /dev/root device node in the not yet mounted
files system. For this reason, in the embedded system that starts without
an initramfs, or however a proper initscript, the /dev/root device appears
into the mount table in the / line.
The test tries to open this /dev/root and fails with a warning.
This patch aims to fix this situation.

Signed-off-by: Alessandro Carminati <alessandro.carminati@gmail.com>

typo fixes
---
 lib/tst_device.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/lib/tst_device.c b/lib/tst_device.c
index 8419b80c3..c3427eb31 100644
--- a/lib/tst_device.c
+++ b/lib/tst_device.c
@@ -526,6 +526,8 @@ void tst_find_backing_dev(const char *path, char *dev)
 	unsigned int dev_major, dev_minor, line_mjr, line_mnr;
 	unsigned int len, best_match_len = 1;
 	char mnt_point[PATH_MAX];
+	char tmpbuf1[PATH_MAX];
+	char tmpbuf2[PATH_MAX];
 
 	if (stat(path, &buf) < 0)
 		tst_brkm(TWARN | TERRNO, NULL, "stat() failed");
@@ -562,6 +564,24 @@ void tst_find_backing_dev(const char *path, char *dev)
 	if (!*dev)
 		tst_brkm(TBROK, NULL, "Cannot find block device for %s", path);
 
+	if (stat(dev, &buf) < 0) {
+		if (strcmp("/dev/root", dev) != 0) {
+			tst_brkm(TWARN | TERRNO, NULL, "stat(%s) failed", dev);
+		} else {
+			sprintf(tmpbuf1, "/sys/dev/block/%d:%d/uevent", dev_major, dev_minor);
+			file = SAFE_FOPEN(NULL, tmpbuf1, "r");
+			while (fgets(line, sizeof(line), file)) {
+				if (sscanf(line, "%[^=]=%s", tmpbuf1, tmpbuf2) != 2)
+					continue;
+				if (strcmp("DEVNAME", tmpbuf1) == 0) {
+					sprintf(dev, "/dev/%s", tmpbuf2);
+					break;
+				}
+			}
+			SAFE_FCLOSE(NULL, file);
+		}
+	}
+
 	if (stat(dev, &buf) < 0)
 		tst_brkm(TWARN | TERRNO, NULL, "stat(%s) failed", dev);
 
-- 
2.34.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 8+ messages in thread
* Re: [LTP] [PATCH] Fix tst_find_backing_dev when no initramfs
@ 2022-10-21 14:18 Alessandro Carminati
  0 siblings, 0 replies; 8+ messages in thread
From: Alessandro Carminati @ 2022-10-21 14:18 UTC (permalink / raw)
  To: ltp

After having discussed this patch content with Jan Stancek, I realized that 
my patch log is too minimal.
By this message, I want to substantiate the case.
I will start by saying the problem I want to fix happens in minimal systems: 
the kernel and minimal onit scripts.
This is the case of many embedded system powered by linux.
Here is the link of a minimal system I used to test the patch.
https://gitlab.com/acarmina/test-files/-/blob/main/testenv.tar.gz
In such a system, you have:

# cat /proc/cmdline 
console=ttyS0 root=/dev/sda rw   rootwait
# cat /proc/self/mountinfo 
14 1 8:0 / / rw,relatime - ext2 /dev/root rw
15 14 0:5 / /dev rw,relatime - devtmpfs devtmpfs rw,size=505412k,nr_inodes=126353,mode=755
16 14 0:13 / /proc rw,relatime - proc proc rw
17 15 0:14 / /dev/pts rw,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666
18 15 0:15 / /dev/shm rw,relatime - tmpfs tmpfs rw,mode=777
19 14 0:16 / /tmp rw,relatime - tmpfs tmpfs rw
20 14 0:17 / /run rw,nosuid,nodev,relatime - tmpfs tmpfs rw,mode=755
21 14 0:18 / /sys rw,relatime - sysfs sysfs rw
# /usr/lib/ltp-testsuite/testcases/bin/ioctl_loop05
tst_test.c:1363: TINFO: Timeout per run is 0h 05m 00s
tst_test.c:1115: TINFO: ext2/ext3/ext4 is supported by the test
tst_device.c:88: TINFO: Found free device 0 '/dev/loop0'
loop0: detected capacity change from 0 to 2048
tst_device.c:566: TWARN: stat(/dev/root) failed: ENOENT (2)

Summary:
passed   0
failed   0
broken   0
skipped  0
warnings 1
#

/dev/root is simply not there, and the test fails with a warning.

In the systems where the /dev/root is there, it is typically a symbolic link 
to the actual device.

Digging on why this device is not there, despite the mount info reports the / 
to be mounted over it, I discovered something weird in the early kernel 
initialization:
https://elixir.bootlin.com/linux/v6.0.3/source/init/do_mounts.c#L566
In this recent kernel release it is evident how the kernel creates the 
/dev/root device node and after it mounts the new device on the / .

The problem is not widely known since in systems where the /dev/root is 
used, typically, the init scripts handle it.
Although it may look strange, this behaviour is considered the intended 
behaviour for the kernel.
An indirect proof is that as early as 2013 a patch aimed to fix this 
behaviour circulated in the kernel mailing lists 
https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg378443.html
But it never made to the upstream

Assuming the current the intended kernel behaviour, the thesis I'm 
trying to push is that the test, meant to test the kernel, should not 
rely on work done in userspace init scripts.

In the patch I am pushing, my intent is to deal with this /dev/root 
peculiarity at the LTP level, by basically add a logic that replaces 
the actual device in case of stat failing on the /dev/root case.

I hope this make my patch context clear.

Cheers
Alessandro

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-10-27  6:50 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-17 11:05 [LTP] [PATCH] Fix tst_find_backing_dev when no initramfs Alessandro Carminati
2022-10-24 13:49 ` Richard Palethorpe
2022-10-25  9:11   ` Alessandro Carminati
2022-10-25 14:59     ` [LTP] [PATCH] tst_find_backing_dev: Get dev name from /sys/dev/block/*/uevent Richard Palethorpe via ltp
2022-10-25 20:13       ` Alessandro Carminati
2022-10-26 10:56       ` Jan Stancek
2022-10-27  6:50         ` Alessandro Carminati
  -- strict thread matches above, loose matches on Subject: below --
2022-10-21 14:18 [LTP] [PATCH] Fix tst_find_backing_dev when no initramfs Alessandro Carminati

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox