From 2da8542e7069af71566a5d36d53fdc840a63228a Mon Sep 17 00:00:00 2001 From: Olaf Faaland Date: Mon, 17 Feb 2025 20:46:38 -0800 Subject: [PATCH] LU-18738 utils: avoid statx() of root of mounted FS When looking for a specific mounted lustre file system by path, avoid the stat() or statx() call on lustre file systems whose mountpoints do not match the given path. This avoids hangs if the client is disconnected from MDT0 of other mounted file systems, but the desired file system is reachable. Signed-off-by: Olaf Faaland Change-Id: I1c67214f107ae2afe34d050470155807063bda51 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/58135 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Li Xi Reviewed-by: Etienne AUJAMES Reviewed-by: Oleg Drokin --- lustre/utils/liblustreapi_root.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lustre/utils/liblustreapi_root.c b/lustre/utils/liblustreapi_root.c index 4bf8617..e413d49 100644 --- a/lustre/utils/liblustreapi_root.c +++ b/lustre/utils/liblustreapi_root.c @@ -47,6 +47,7 @@ #include /* for makedev() */ #include #include +#include #include #include @@ -210,6 +211,11 @@ static int get_root_path_slow(int want, char *fsname, int *outfd, char *path, fsnamelen = ptr_end - ptr; + /* avoid stat/statx call if path does not match mountpoint */ + if (path && (strlen(path) >= mntlen) && + (strncmp(mnt.mnt_dir, path, mntlen) != 0)) + continue; + /* ignore unaccessible filesystem */ if (get_file_dev(mnt.mnt_dir, &devmnt)) continue; @@ -233,10 +239,11 @@ static int get_root_path_slow(int want, char *fsname, int *outfd, char *path, break; } - /* Otherwise find the longest matching path */ - if (path && strlen(path) >= mntlen && - (strncmp(mnt.mnt_dir, path, mntlen) == 0) && - (strlen(path) == mntlen || path[mntlen] == '/')) { + /* + * Otherwise find the longest matching path beginning of path + * and mnt_dir already verified to be the same. + */ + if (path && (strlen(path) == mntlen || path[mntlen] == '/')) { rc = 0; break; } @@ -312,6 +319,8 @@ int get_root_path(int want, char *fsname, int *outfd, char *path, int index, { int rc = -ENODEV; + assert(fsname || path); + if (!(want & WANT_INDEX)) rc = get_root_path_fast(want, fsname, outfd, path, dev, nid); if (rc) -- 1.8.3.1