]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
NetBSD disk wedge support.
authorGrégoire Sutre <gregoire.sutre@gmail.com>
Fri, 3 Feb 2012 11:32:21 +0000 (12:32 +0100)
committerGrégoire Sutre <gregoire.sutre@gmail.com>
Fri, 3 Feb 2012 11:32:21 +0000 (12:32 +0100)
ChangeLog
grub-core/kern/emu/hostdisk.c
util/getroot.c

index 21ccd02235056977bb88f3e78122194bec3ce924..91197d67e5ebcbb3930356b6e081ad7c439c9bc7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2012-02-03  Grégoire Sutre  <gregoire.sutre@gmail.com>
+
+       NetBSD disk wedge support.
+
+       * grub-core/kern/emu/hostdisk.c (grub_hostdisk_find_partition_start)
+       [__NetBSD__]: Handle NetBSD disk wedges.
+       * util/getroot.c (convert_system_partition_to_system_disk)
+       [__NetBSD__]: Likewise.
+
 2012-02-03  Mark Wooding <mdw@distorted.org.uk>
 
        * util/grub-mkconfig.in: Use umask rather than chmod to create
index 704911e121e8f15b933812741f577e6e37c55300..1b5374934d8f517a950dfd8e519930de1ea0136c 100644 (file)
@@ -100,6 +100,7 @@ struct hd_geometry
 # define HAVE_DIOCGDINFO
 # include <sys/ioctl.h>
 # include <sys/disklabel.h>    /* struct disklabel */
+# include <sys/disk.h>    /* struct dkwedge_info */
 #else /* !defined(__NetBSD__) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) */
 # undef HAVE_DIOCGDINFO
 #endif /* defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) */
@@ -483,6 +484,9 @@ grub_hostdisk_find_partition_start (const char *dev)
 # elif !defined(HAVE_DIOCGDINFO)
   struct hd_geometry hdg;
 # else /* defined(HAVE_DIOCGDINFO) */
+#  if defined(__NetBSD__)
+  struct dkwedge_info dkw;
+#  endif /* defined(__NetBSD__) */
   struct disklabel label;
   int p_index;
 # endif /* !defined(HAVE_DIOCGDINFO) */
@@ -574,6 +578,12 @@ devmapper_fail:
 # else /* defined(HAVE_DIOCGDINFO) */
 #  if defined(__NetBSD__)
   configure_device_driver (fd);
+  /* First handle the case of disk wedges.  */
+  if (ioctl (fd, DIOCGWEDGEINFO, &dkw) == 0)
+    {
+      close (fd);
+      return (grub_disk_addr_t) dkw.dkw_offset;
+    }
 #  endif /* defined(__NetBSD__) */
   if (ioctl (fd, DIOCGDINFO, &label) == -1)
 # endif /* !defined(HAVE_DIOCGDINFO) */
index 8a94932f8d454513930052962721c07f73d34864..a11afd079a1e9ae331e38d69b4550dc937df121c 100644 (file)
 # define HAVE_DIOCGDINFO
 # include <sys/ioctl.h>
 # include <sys/disklabel.h>    /* struct disklabel */
+# include <sys/disk.h>    /* struct dkwedge_info */
 #else /* !defined(__NetBSD__) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) */
 # undef HAVE_DIOCGDINFO
 #endif /* defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) */
@@ -1714,12 +1715,44 @@ devmapper_out:
   return path;
 
 #elif defined(__NetBSD__)
-  /* NetBSD uses "/dev/r[a-z]+[0-9][a-z]".  */
-  char *path = xstrdup (os_dev);
-  if (strncmp ("/dev/r", path, sizeof("/dev/r") - 1) == 0 &&
-      (path[sizeof("/dev/r") - 1] >= 'a' && path[sizeof("/dev/r") - 1] <= 'z') &&
-      strncmp ("fd", path + sizeof("/dev/r") - 1, sizeof("fd") - 1) != 0)    /* not a floppy device name */
+  int rawpart = -1;
+# ifdef HAVE_GETRAWPARTITION
+  rawpart = getrawpartition();
+# endif /* HAVE_GETRAWPARTITION */
+  if (rawpart < 0)
+    return xstrdup (os_dev);
+
+  /* NetBSD disk wedges are of the form "/dev/rdk.*".  */
+  if (strncmp ("/dev/rdk", os_dev, sizeof("/dev/rdk") - 1) == 0)
+    {
+      struct dkwedge_info dkw;
+      int fd;
+
+      fd = open (os_dev, O_RDONLY);
+      if (fd == -1)
+       {
+         grub_error (GRUB_ERR_BAD_DEVICE,
+                     "cannot open `%s' while attempting to get disk wedge info", os_dev);
+         return xstrdup (os_dev);
+       }
+      /* We don't call configure_device_driver since this isn't a floppy device name.  */
+      if (ioctl (fd, DIOCGWEDGEINFO, &dkw) == -1)
+       {
+         grub_error (GRUB_ERR_BAD_DEVICE,
+                     "cannot get disk wedge info of `%s'", os_dev);
+         close (fd);
+         return xstrdup (os_dev);
+       }
+      close (fd);
+      return xasprintf ("/dev/r%s%c", dkw.dkw_parent, 'a' + rawpart);
+    }
+
+  /* NetBSD (disk label) partitions are of the form "/dev/r[a-z]+[0-9][a-z]".  */
+  if (strncmp ("/dev/r", os_dev, sizeof("/dev/r") - 1) == 0 &&
+      (os_dev[sizeof("/dev/r") - 1] >= 'a' && os_dev[sizeof("/dev/r") - 1] <= 'z') &&
+      strncmp ("fd", os_dev + sizeof("/dev/r") - 1, sizeof("fd") - 1) != 0)    /* not a floppy device name */
     {
+      char *path = xstrdup (os_dev);
       char *p;
       for (p = path + sizeof("/dev/r"); *p >= 'a' && *p <= 'z'; p++);
       if (grub_isdigit(*p))
@@ -1729,16 +1762,13 @@ devmapper_out:
            {
              /* path matches the required regular expression and
                 p points to its last character.  */
-             int rawpart = -1;
-# ifdef HAVE_GETRAWPARTITION
-             rawpart = getrawpartition();
-# endif /* HAVE_GETRAWPARTITION */
-             if (rawpart >= 0)
-               *p = 'a' + rawpart;
+             *p = 'a' + rawpart;
            }
-        }
+       }
+      return path;
     }
-  return path;
+
+  return xstrdup (os_dev);
 
 #elif defined (__sun__)
   char *colon = grub_strrchr (os_dev, ':');