grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] fix multilevel diskfilter detection after rev 5024


From: Andrey Borzenkov
Subject: [PATCH] fix multilevel diskfilter detection after rev 5024
Date: Sat, 8 Jun 2013 11:12:19 +0400

After commit "Fix order to discover ambigouos RAID before discovering
RAIDs on top of it" diskfilter scans all volumes exactly once. This
means that only first level is found. Scanning second time will find
next level etc.

This means that e.g. MD RAID on top of MD RAID is not found.

Change scan to iteratively rescan volume list until nothing new was
detected (or scan depth exceeded).

Signed-off-by: Andrey Borzenkov <address@hidden>

---
 ChangeLog                   |  5 +++++
 grub-core/disk/diskfilter.c | 29 +++++++++++++++++++++--------
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4d8f343..bebcc8a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-06-08  Andrey Borzenkov <address@hidden>
+
+       * grub-core/disk/diskfilter.c (scan_devices): Iteratively
+       rescan diskfilter devices until nothing new is found.
+
 2013-06-07  Andrey Borzenkov <address@hidden>
 
        * grub-core/script/execute.c (grub_script_execute_sourcecode): Split
diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
index c8d267a..0455177 100644
--- a/grub-core/disk/diskfilter.c
+++ b/grub-core/disk/diskfilter.c
@@ -188,6 +188,7 @@ scan_disk (const char *name, int accept_diskfilter)
   if (!accept_diskfilter && is_valid_diskfilter_name (name))
     return 0;
 
+  /* FIXME do we still need it? It is not called recursively anymore */
   if (scan_depth > 100)
     return 0;
 
@@ -219,6 +220,8 @@ scan_devices (const char *arname)
   grub_disk_pull_t pull;
   struct grub_diskfilter_vg *vg;
   struct grub_diskfilter_lv *lv = NULL;
+  int scan_depth;
+  int need_rescan;
 
   for (pull = 0; pull < GRUB_DISK_PULL_MAX; pull++)
     for (p = grub_disk_dev_list; p; p = p->next)
@@ -231,16 +234,26 @@ scan_devices (const char *arname)
            return;
        }
 
-  for (vg = array_list; vg; vg = vg->next)
+  scan_depth = 0;
+  need_rescan = 1;
+  while (need_rescan && scan_depth++ < 100)
     {
-      if (vg->lvs)
-       for (lv = vg->lvs; lv; lv = lv->next)
-         if (!lv->scanned && lv->fullname && lv->became_readable_at)
-           {
-             scan_disk (lv->fullname, 1);
-             lv->scanned = 1;
-           }
+      need_rescan = 0;
+      for (vg = array_list; vg; vg = vg->next)
+       {
+         if (vg->lvs)
+           for (lv = vg->lvs; lv; lv = lv->next)
+             if (!lv->scanned && lv->fullname && lv->became_readable_at)
+               {
+                 scan_disk (lv->fullname, 1);
+                 lv->scanned = 1;
+                 need_rescan = 1;
+               }
+       }
     }
+
+  if (need_rescan)
+     grub_error (GRUB_ERR_UNKNOWN_DEVICE, "DISKFILTER scan depth exceeded");
 }
 
 static int
-- 
tg: (ac72fb7..) u/diskfilter_multilevel_detect (depends on: master)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]