commit-grub
[Top][All Lists]
Advanced

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

[2457] 2009-07-31 Bean <address@hidden>


From: Bean
Subject: [2457] 2009-07-31 Bean <address@hidden>
Date: Fri, 31 Jul 2009 14:25:19 +0000

Revision: 2457
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2457
Author:   bean
Date:     2009-07-31 14:25:19 +0000 (Fri, 31 Jul 2009)
Log Message:
-----------
2009-07-31  Bean  <address@hidden>

        * disk/lvm.c (grub_lvm_scan_device): Ignore extra copy of metadata.
        Don't change pv->disk if it's already set.

        * disk/raid.c (grub_raid_scan_device): Merge this function into ...
        (grub_raid_register): ... here.
        (grub_raid_rescan): Removed.

        * include/grub/raid.h (grub_raid_rescan): Removed.

        * util/grub-fstest.c: Remove include file <grub/raid.h>.
        (fstest): Replace grub_raid_rescan with module fini function followed
        by init function.

        * util/grub-probe.c: Add include file <grub/raid.h>.
        (probe_raid_level): New function.
        (probe): Detect abstraction by walking the disk device, support two
        level of abstraction (LVM on RAID) when detecting partition map.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/disk/lvm.c
    trunk/grub2/disk/raid.c
    trunk/grub2/include/grub/raid.h
    trunk/grub2/util/grub-fstest.c
    trunk/grub2/util/grub-probe.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-07-31 04:38:20 UTC (rev 2456)
+++ trunk/grub2/ChangeLog       2009-07-31 14:25:19 UTC (rev 2457)
@@ -1,3 +1,23 @@
+2009-07-31  Bean  <address@hidden>
+
+       * disk/lvm.c (grub_lvm_scan_device): Ignore extra copy of metadata.
+       Don't change pv->disk if it's already set.
+
+       * disk/raid.c (grub_raid_scan_device): Merge this function into ...
+       (grub_raid_register): ... here.
+       (grub_raid_rescan): Removed.
+
+       * include/grub/raid.h (grub_raid_rescan): Removed.
+
+       * util/grub-fstest.c: Remove include file <grub/raid.h>.
+       (fstest): Replace grub_raid_rescan with module fini function followed
+       by init function.
+
+       * util/grub-probe.c: Add include file <grub/raid.h>.
+       (probe_raid_level): New function.
+       (probe): Detect abstraction by walking the disk device, support two
+       level of abstraction (LVM on RAID) when detecting partition map.
+
 2009-07-31  Pavel Roskin  <address@hidden>
 
        * disk/raid5_recover.c (grub_raid5_recover): Revert conversion

Modified: trunk/grub2/disk/lvm.c
===================================================================
--- trunk/grub2/disk/lvm.c      2009-07-31 04:38:20 UTC (rev 2456)
+++ trunk/grub2/disk/lvm.c      2009-07-31 14:25:19 UTC (rev 2457)
@@ -271,16 +271,10 @@
   dlocn++;
   mda_offset = grub_le_to_cpu64 (dlocn->offset);
   mda_size = grub_le_to_cpu64 (dlocn->size);
-  dlocn++;
 
-  if (dlocn->offset)
-    {
-      grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
-                 "We don't support multiple LVM metadata areas");
+  /* It's possible to have multiple copies of metadata areas, we just use the
+     first one.  */
 
-      goto fail;
-    }
-
   /* Allocate buffer space for the circular worst-case scenario. */
   metadatabuf = grub_malloc (2 * mda_size);
   if (! metadatabuf)
@@ -564,7 +558,10 @@
       {
        if (! grub_memcmp (pv->id, pv_id, GRUB_LVM_ID_STRLEN))
          {
-           pv->disk = grub_disk_open (name);
+           /* This could happen to LVM on RAID, pv->disk points to the
+              raid device, we shouldn't change it.  */
+           if (! pv->disk)
+             pv->disk = grub_disk_open (name);
            break;
          }
       }

Modified: trunk/grub2/disk/raid.c
===================================================================
--- trunk/grub2/disk/raid.c     2009-07-31 04:38:20 UTC (rev 2456)
+++ trunk/grub2/disk/raid.c     2009-07-31 14:25:19 UTC (rev 2457)
@@ -590,56 +590,6 @@
 static grub_raid_t grub_raid_list;
 
 static void
-grub_raid_scan_device (int head_only)
-{
-  auto int hook (const char *name);
-  int hook (const char *name)
-    {
-      grub_disk_t disk;
-      struct grub_raid_array array;
-      struct grub_raid *p;
-
-      grub_dprintf ("raid", "Scanning for RAID devices on disk %s\n", name);
-
-      disk = grub_disk_open (name);
-      if (!disk)
-        return 0;
-
-      if (disk->total_sectors == GRUB_ULONG_MAX)
-        {
-          grub_disk_close (disk);
-          return 0;
-        }
-
-      for (p = grub_raid_list; p; p = p->next)
-        {
-          if (! p->detect (disk, &array))
-            {
-              if (! insert_array (disk, &array, p->name))
-                return 0;
-
-              break;
-            }
-
-          /* This error usually means it's not raid, no need to display
-             it.  */
-          if (grub_errno != GRUB_ERR_OUT_OF_RANGE)
-            grub_print_error ();
-
-          grub_errno = GRUB_ERR_NONE;
-          if (head_only)
-            break;
-        }
-
-      grub_disk_close (disk);
-
-      return 0;
-    }
-
-  grub_device_iterate (&hook);
-}
-
-static void
 free_array (void)
 {
   struct grub_raid_array *array;
@@ -668,9 +618,38 @@
 void
 grub_raid_register (grub_raid_t raid)
 {
+  auto int hook (const char *name);
+  int hook (const char *name)
+    {
+      grub_disk_t disk;
+      struct grub_raid_array array;
+
+      grub_dprintf ("raid", "Scanning for RAID devices on disk %s\n", name);
+
+      disk = grub_disk_open (name);
+      if (!disk)
+        return 0;
+
+      if ((disk->total_sectors != GRUB_ULONG_MAX) &&
+         (! grub_raid_list->detect (disk, &array)) &&
+         (! insert_array (disk, &array, grub_raid_list->name)))
+       return 0;
+
+      /* This error usually means it's not raid, no need to display
+        it.  */
+      if (grub_errno != GRUB_ERR_OUT_OF_RANGE)
+       grub_print_error ();
+
+      grub_errno = GRUB_ERR_NONE;
+
+      grub_disk_close (disk);
+
+      return 0;
+    }
+
   raid->next = grub_raid_list;
   grub_raid_list = raid;
-  grub_raid_scan_device (1);
+  grub_device_iterate (&hook);
 }
 
 void
@@ -686,13 +665,6 @@
       }
 }
 
-void
-grub_raid_rescan (void)
-{
-  free_array ();
-  grub_raid_scan_device (0);
-}
-
 static struct grub_disk_dev grub_raid_dev =
   {
     .name = "raid",

Modified: trunk/grub2/include/grub/raid.h
===================================================================
--- trunk/grub2/include/grub/raid.h     2009-07-31 04:38:20 UTC (rev 2456)
+++ trunk/grub2/include/grub/raid.h     2009-07-31 14:25:19 UTC (rev 2457)
@@ -67,7 +67,6 @@
 void grub_raid_register (grub_raid_t raid);
 void grub_raid_unregister (grub_raid_t raid);
 
-void grub_raid_rescan (void);
 void grub_raid_block_xor (char *buf1, const char *buf2, int size);
 
 typedef grub_err_t (*grub_raid5_recover_func_t) (struct grub_raid_array *array,

Modified: trunk/grub2/util/grub-fstest.c
===================================================================
--- trunk/grub2/util/grub-fstest.c      2009-07-31 04:38:20 UTC (rev 2456)
+++ trunk/grub2/util/grub-fstest.c      2009-07-31 14:25:19 UTC (rev 2457)
@@ -28,7 +28,6 @@
 #include <grub/env.h>
 #include <grub/term.h>
 #include <grub/mm.h>
-#include <grub/raid.h>
 #include <grub/lib/hexdump.h>
 #include <grub/lib/crc.h>
 #include <grub/command.h>
@@ -293,7 +292,13 @@
         grub_util_error ("loopback command fails.");
     }
 
-  grub_raid_rescan ();
+  grub_lvm_fini ();
+  grub_mdraid_fini ();
+  grub_raid_fini ();
+  grub_raid_init ();
+  grub_mdraid_init ();
+  grub_lvm_init ();
+
   switch (cmd)
     {
     case CMD_LS:

Modified: trunk/grub2/util/grub-probe.c
===================================================================
--- trunk/grub2/util/grub-probe.c       2009-07-31 04:38:20 UTC (rev 2456)
+++ trunk/grub2/util/grub-probe.c       2009-07-31 14:25:19 UTC (rev 2457)
@@ -30,6 +30,7 @@
 #include <grub/util/getroot.h>
 #include <grub/term.h>
 #include <grub/env.h>
+#include <grub/raid.h>
 
 #include <grub_probe_init.h>
 
@@ -100,13 +101,21 @@
   free (name);
 }
 
+static int
+probe_raid_level (grub_disk_t disk)
+{
+  if (disk->dev->id != GRUB_DISK_DEVICE_RAID_ID)
+    return -1;
+
+  return ((struct grub_raid_array *) disk->data)->level;
+}
+
 static void
 probe (const char *path, char *device_name)
 {
   char *drive_name = NULL;
   char *grub_path = NULL;
   char *filebuf_via_grub = NULL, *filebuf_via_sys = NULL;
-  int abstraction_type;
   grub_device_t dev = NULL;
   grub_fs_t fs;
 
@@ -132,28 +141,6 @@
       goto end;
     }
 
-  abstraction_type = grub_util_get_dev_abstraction (device_name);
-  /* No need to check for errors; lack of abstraction is permissible.  */
-
-  if (print == PRINT_ABSTRACTION)
-    {
-      char *abstraction_name;
-      switch (abstraction_type)
-       {
-       case GRUB_DEV_ABSTRACTION_LVM:
-         abstraction_name = "lvm";
-         break;
-       case GRUB_DEV_ABSTRACTION_RAID:
-         abstraction_name = "raid mdraid";
-         break;
-       default:
-         grub_util_info ("did not find LVM/RAID in %s, assuming raw device", 
device_name);
-         goto end;
-       }
-      printf ("%s\n", abstraction_name);
-      goto end;
-    }
-
   drive_name = grub_util_get_grub_dev (device_name);
   if (! drive_name)
     grub_util_error ("Cannot find a GRUB drive for %s.  Check your 
device.map.\n", device_name);
@@ -169,6 +156,58 @@
   if (! dev)
     grub_util_error ("%s", grub_errmsg);
 
+  if (print == PRINT_ABSTRACTION)
+    {
+      grub_disk_memberlist_t list = NULL, tmp;
+      const int is_lvm = (dev->disk->dev->id == GRUB_DISK_DEVICE_LVM_ID);
+      int is_raid = 0;
+      int is_raid5 = 0;
+      int is_raid6 = 0;
+      int raid_level;
+
+      raid_level = probe_raid_level (dev->disk);
+      if (raid_level >= 0)
+       {
+         is_raid = 1;
+         is_raid5 |= (raid_level == 5);
+         is_raid6 |= (raid_level == 6);
+       }
+
+      if ((is_lvm) && (dev->disk->dev->memberlist))
+       list = dev->disk->dev->memberlist (dev->disk);
+      while (list)
+       {
+         raid_level = probe_raid_level (list->disk);
+         if (raid_level >= 0)
+           {
+             is_raid = 1;
+             is_raid5 |= (raid_level == 5);
+             is_raid6 |= (raid_level == 6);
+           }
+
+         tmp = list->next;
+         free (list);
+         list = tmp;
+       }
+
+      if (is_raid)
+       {
+         printf ("raid ");
+         if (is_raid5)
+           printf ("raid5rec ");
+         if (is_raid6)
+           printf ("raid6rec ");
+         printf ("mdraid ");
+       }
+
+      if (is_lvm)
+       printf ("lvm ");
+
+      printf ("\n");
+
+      goto end;
+    }
+
   if (print == PRINT_PARTMAP)
     {
       grub_disk_memberlist_t list = NULL, tmp;
@@ -182,6 +221,20 @@
       while (list)
        {
          probe_partmap (list->disk);
+         /* LVM on RAID  */
+         if (list->disk->dev->memberlist)
+           {
+             grub_disk_memberlist_t sub_list;
+
+             sub_list = list->disk->dev->memberlist (list->disk);
+             while (sub_list)
+               {
+                 probe_partmap (sub_list->disk);
+                 tmp = sub_list->next;
+                 free (sub_list);
+                 sub_list = tmp;
+               }
+           }
          tmp = list->next;
          free (list);
          list = tmp;





reply via email to

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