Whamcloud - gitweb
LU-18738 utils: avoid statx() of root of mounted FS 21/58321/2
authorOlaf P. Faaland <faaland1@llnl.gov>
Sat, 22 Feb 2025 05:29:55 +0000 (21:29 -0800)
committerOleg Drokin <green@whamcloud.com>
Fri, 9 May 2025 01:45:57 +0000 (01:45 +0000)
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.

Lustre-change: https://review.whamcloud.com/58135
Lustre-commit: 2da8542e7069af71566a5d36d53fdc840a63228a

Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
Change-Id: I1c67214f107ae2afe34d050470155807063bda51
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-by: Etienne AUJAMES <eaujames@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/58321
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Gian-Carlo DeFazio <defazio1@llnl.gov>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/utils/liblustreapi.c

index 8b596af..5efb1a6 100644 (file)
@@ -73,6 +73,7 @@
 #include <inttypes.h>
 #include <pthread.h>
 
+#include <assert.h>
 #include <libcfs/util/ioctl.h>
 #include <libcfs/util/param.h>
 #include <libcfs/util/string.h>
@@ -1351,6 +1352,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;
@@ -1374,10 +1380,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;
                }
@@ -1436,6 +1443,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)