[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