All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] getroot: Skip mount points in grub_find_device
@ 2025-09-16  6:38 Michael Chang via Grub-devel
  2025-09-16 12:02 ` Neal Gompa
  0 siblings, 1 reply; 4+ messages in thread
From: Michael Chang via Grub-devel @ 2025-09-16  6:38 UTC (permalink / raw)
  To: The development of GNU GRUB; +Cc: Michael Chang

The grub_find_device function scans a starting directory, typically
/dev, for device files with matching major and minor numbers. During
this process, it recursively descends into subdirectories.

However, this can significantly slow down the scan if a subdirectory is
a mount point not related to devtmpfs, especially if it contains a large
number of files.

This patch modifies grub_find_device() to skip subdirectories that are
mount points. A mount point is detected by comparing the st_dev of the
subdirectory against that of the parent or starting directory. While
this method does not catch all types of mounts, for eg bind mounts, it
is a practical solution that avoids the need to parse /proc/self/mounts.

Signed-off-by: Michael Chang <mchang@suse.com>
---
 grub-core/osdep/unix/getroot.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/grub-core/osdep/unix/getroot.c b/grub-core/osdep/unix/getroot.c
index c7aa202ab..c3fc28ca8 100644
--- a/grub-core/osdep/unix/getroot.c
+++ b/grub-core/osdep/unix/getroot.c
@@ -353,6 +353,7 @@ grub_find_device (const char *dir, dev_t dev)
   DIR *dp;
   struct saved_cwd saved_cwd;
   struct dirent *ent;
+  struct stat st_dir;
 
   if (! dir)
     dir = "/dev";
@@ -361,6 +362,12 @@ grub_find_device (const char *dir, dev_t dev)
   if (! dp)
     return 0;
 
+  if (stat (dir, &st_dir) < 0)
+    {
+      closedir (dp);
+      return 0;
+    }
+
   if (save_cwd (&saved_cwd) < 0)
     {
       grub_util_error ("%s", _("cannot save the original directory"));
@@ -410,6 +417,13 @@ grub_find_device (const char *dir, dev_t dev)
 	  /* Find it recursively.  */
 	  char *res;
 
+	  /* Skip mount point */
+	  if (st.st_dev != st_dir.st_dev)
+	    {
+	      grub_util_info ("skip mount point %s/%s", dir, ent->d_name);
+	      continue;
+	    }
+
 	  res = grub_find_device (ent->d_name, dev);
 
 	  if (res)
-- 
2.51.0


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

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

end of thread, other threads:[~2025-09-16 17:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.5114.1758024225.1197.grub-devel@gnu.org>
2025-09-16 16:38 ` [PATCH] docs/grub.texi: Fix build warnings in libgcrypt and blsuki doc Avnish Chouhan
2025-09-16 17:27 ` [PATCH] getroot: Skip mount points in grub_find_device Avnish Chouhan
2025-09-16  6:38 Michael Chang via Grub-devel
2025-09-16 12:02 ` Neal Gompa

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.