[LTP] [PATCH] tst_find_backing_dev: fix logic in matching mount point

Jan Stancek jstancek@redhat.com
Fri Jul 8 09:33:20 CEST 2022


If backing dev is btrfs root device, then starting best_match_len
from 1 creates an issue, because root (/) is never matched.
Also we should check that entire mount point string is present in
path we are matching against.

In case there's error also dump /proc/self/mountinfo before tst_brk.

This fixes test with following partition layout (TMPDIR is on /):
  # cat /proc/self/mountinfo  | grep btrfs
  59 1 0:29 /root / rw,relatime shared:1 - btrfs /dev/dasda2 rw,seclabel,compress=zstd:1,ssd,space_cache=v2,subvolid=257,subvol=/root
  93 59 0:29 /home /home rw,relatime shared:47 - btrfs /dev/dasda2 rw,seclabel,compress=zstd:1,ssd,space_cache=v2,subvolid=256,subvol=/home

Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
 lib/tst_device.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/lib/tst_device.c b/lib/tst_device.c
index c34cbe6d1f56..414bf0eea816 100644
--- a/lib/tst_device.c
+++ b/lib/tst_device.c
@@ -506,12 +506,17 @@ unsigned long tst_dev_bytes_written(const char *dev)
 	return dev_bytes_written;
 }
 
-static int count_match_len(const char *first, const char *second)
+static int str_starts_with(const char *str, const char *prefix)
 {
 	int len = 0;
 
-	while (*first && *first++ == *second++)
+	while (*prefix) {
+		if (!*str)
+			return 0;
+		if (*str++ != *prefix++)
+			return 0;
 		len++;
+	}
 
 	return len;
 }
@@ -524,7 +529,7 @@ void tst_find_backing_dev(const char *path, char *dev)
 	char *pre = NULL;
 	char *next = NULL;
 	unsigned int dev_major, dev_minor, line_mjr, line_mnr;
-	unsigned int len, best_match_len = 1;
+	unsigned int len, best_match_len = 0;
 	char mnt_point[PATH_MAX];
 
 	if (stat(path, &buf) < 0)
@@ -550,7 +555,7 @@ void tst_find_backing_dev(const char *path, char *dev)
 			break;
 		}
 
-		len = count_match_len(path, mnt_point);
+		len = str_starts_with(path, mnt_point);
 		if (len > best_match_len) {
 			strcpy(dev, pre);
 			best_match_len = len;
@@ -559,8 +564,10 @@ void tst_find_backing_dev(const char *path, char *dev)
 
 	SAFE_FCLOSE(NULL, file);
 
-	if (!*dev)
+	if (!*dev) {
+		tst_system("cat /proc/self/mountinfo");
 		tst_brkm(TBROK, NULL, "Cannot find block device for %s", path);
+	}
 
 	if (stat(dev, &buf) < 0)
 		tst_brkm(TWARN | TERRNO, NULL, "stat(%s) failed", dev);
-- 
2.27.0



More information about the ltp mailing list