]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2004-03-12 Yoshinori K. Okuji <okuji@enbug.org>
authorokuji <okuji@localhost>
Fri, 12 Mar 2004 17:31:51 +0000 (17:31 +0000)
committerokuji <okuji@localhost>
Fri, 12 Mar 2004 17:31:51 +0000 (17:31 +0000)
From Sergey Matveychuk <sem@ciam.ru>:
* lib/device.c (get_drive_geometry): Do not open the same device
more than once unnecessarily.
(get_drive_geometry) [__FreeBSD_version >= 500040]: Use new
ioctl methods.
(get_floppy_disk_name) [__FreeBSD__ >= 4]: Use /dev/fd%d rather
than /dev/rfd%d.
(get_ide_disk_name) [__FreeBSD__ >= 4]: Use /dev/ad%d rather
than /dev/rad%d.
(get_scsi_disk_name) [__FreeBSD__ >= 4]: Use /dev/da%d rather
than /dev/rda%d.
* grub/asmstub.c (get_diskinfo): Check if ERRNO is EPERM as
well.

ChangeLog
NEWS
THANKS
docs/grub.8
docs/mbchk.1
grub/asmstub.c
lib/device.c

index d6051edc2132bfda925d2c94141227768e548ea9..c062155f6989f9dde4e7723b73449c870fdc6179 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2004-03-12  Yoshinori K. Okuji  <okuji@enbug.org>
+
+       From Sergey Matveychuk <sem@ciam.ru>:
+       * lib/device.c (get_drive_geometry): Do not open the same device
+       more than once unnecessarily.
+       (get_drive_geometry) [__FreeBSD_version >= 500040]: Use new
+       ioctl methods.
+       (get_floppy_disk_name) [__FreeBSD__ >= 4]: Use /dev/fd%d rather
+       than /dev/rfd%d.
+       (get_ide_disk_name) [__FreeBSD__ >= 4]: Use /dev/ad%d rather
+       than /dev/rad%d.
+       (get_scsi_disk_name) [__FreeBSD__ >= 4]: Use /dev/da%d rather
+       than /dev/rda%d.
+       * grub/asmstub.c (get_diskinfo): Check if ERRNO is EPERM as
+       well.
+
 2004-02-28  Jeroen Dekkers  <jeroen@dekkers.cx>
 
        * docs/grub.texi (partnew): Change @var{to} to @var{len}.
diff --git a/NEWS b/NEWS
index 433ab6a597d02e1c0a0541374e2450b2408cbffa..b1a6b0b3c95ba8b1452a786d5f0ec2bd2eef0c1b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,9 @@
 NEWS - list of user-visible changes between releases of GRUB
 
+New:
+* Add support for ReiserFS 3.
+* Fix support for FreeBSD 5.
+
 New in 0.94 - 2004-01-25:
 * Support building on x86-64 with gcc -m32.
 * Use a BIOS call to turn on/off Gate A20. This should solve various
diff --git a/THANKS b/THANKS
index bd8794a6bd1103f1a1efcdc80cab8b343e34427d..6838c2bd3d642905df5ad24b8e8a0274ea4f5767 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -92,6 +92,7 @@ Ramon van Handel <vhandel@chem.vu.nl>
 Robert Millan  <robertmh@gnu.org>
 Roderich Schupp <rsch@ExperTeam.de>
 Rogelio M. Serrano Jr. <rogelio@victorio.com>
+Sergey Matveychuk <sem@ciam.ru>
 Serguei Tzukanov <tzukanov@narod.ru>
 Stefan Ondrejicka <ondrej@idata.sk>
 Stephen Early <steve@greenend.org.uk>
index 1a33cb6f964ae57e8be3dfd06710cff316e2121d..acaa41c8231d98596c2068561845a4a764e55288 100644 (file)
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.23.
-.TH GRUB "8" "February 2004" "grub (GNU GRUB 0.94)" FSF
+.TH GRUB "8" "March 2004" "grub (GNU GRUB 0.94)" FSF
 .SH NAME
 grub \- the grub shell
 .SH SYNOPSIS
index abd730b7388f923738045d70be59e35cc989f1b5..20e6bb0ca10e40fadfb8ff3b1c5f71f28c9e43e1 100644 (file)
@@ -1,5 +1,5 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.23.
-.TH MBCHK "1" "January 2004" "mbchk (GNU GRUB 0.94)" FSF
+.TH MBCHK "1" "March 2004" "mbchk (GNU GRUB 0.94)" FSF
 .SH NAME
 mbchk \- check the format of a Multiboot kernel
 .SH SYNOPSIS
index a22eed4b78d6891398a63dbf07c18b060e89646c..094a9cd3a58088542c37f98eeaee4acee4c95a33 100644 (file)
@@ -1,7 +1,7 @@
 /* asmstub.c - a version of shared_src/asm.S that works under Unix */
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
+ *  Copyright (C) 1999,2000,2001,2002,2004  Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -779,7 +779,7 @@ get_diskinfo (int drive, struct geometry *geometry)
 
       if (disks[drive].flags == -1)
        {
-         if (read_only || errno == EACCES || errno == EROFS)
+         if (read_only || errno == EACCES || errno == EROFS || errno == EPERM)
            {
              disks[drive].flags = open (devname, O_RDONLY);
              if (disks[drive].flags == -1)
index 07f7d512d96696513a20e38cc3b0da917eae6dd2..7f09d881db028c9aa79392f69176ee5f1528b013 100644 (file)
@@ -78,6 +78,12 @@ struct hd_geometry
 # include <sys/ioctl.h>                /* ioctl */
 # include <sys/disklabel.h>
 # include <sys/cdio.h>         /* CDIOCCLRDEBUG */
+# if defined(__FreeBSD__)
+#  include <sys/param.h>
+#  if __FreeBSD_version >= 500040
+#   include <sys/disk.h>
+#  endif
+# endif /* __FreeBSD__ */
 #endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
 
 #ifdef HAVE_OPENDISK
@@ -94,8 +100,13 @@ get_drive_geometry (struct geometry *geom, char **map, int drive)
 {
   int fd;
 
-  fd = open (map[drive], O_RDONLY);
-  assert (fd >= 0);
+  if (geom->flags == -1)
+    {
+      fd = open (map[drive], O_RDONLY);
+      assert (fd >= 0);
+    }
+  else
+    fd = geom->flags;
 
 #if defined(__linux__)
   /* Linux */
@@ -115,10 +126,44 @@ get_drive_geometry (struct geometry *geom, char **map, int drive)
     geom->sectors = hdg.sectors;
     geom->total_sectors = nr;
     
-    close (fd);
-    return;
+    goto success;
   }
 
+#elif defined(__FreeBSD__) && __FreeBSD_version >= 500040
+  /* FreeBSD version 5 and later */
+  {
+    u_int sector_size;
+    off_t media_size;
+    uint_t tmp;
+    
+    if(ioctl (fd, DIOCGSECTORSIZE, &sector_size) != 0)
+      sector_size = 512;
+    
+    if (ioctl (fd, DIOCGMEDIASIZE, &media_size) != 0)
+      goto fail;
+
+    geometry->total_sectors = media_size / sector_size;
+    
+    if (ioctl (fd, DIOCGFWSECTORS, &tmp) == 0)
+      geometry->sectors = tmp;
+    else
+      geometry->sectors = 63;
+    if (ioctl (fd, DIOCGFWHEADS, &tmp) == 0)
+      geometry->heads = tmp;
+    else if (geometry->total_sectors <= 63 * 1 * 1024)
+      geometry->heads = 1;
+    else if (geometry->total_sectors <= 63 * 16 * 1024)
+      geometry->heads = 16;
+    else
+      geometry->heads = 255;
+
+    geometry->cylinders = (geometry->total_sectors
+                          / geometry->heads
+                          / geometry->sectors);
+    
+    goto success;
+  }
+  
 #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
   /* FreeBSD, NetBSD or OpenBSD */
   {
@@ -131,8 +176,7 @@ get_drive_geometry (struct geometry *geom, char **map, int drive)
     geom->sectors = hdg.d_nsectors;
     geom->total_sectors = hdg.d_secperunit;
 
-    close (fd);
-    return;
+    goto success;
   }
   
 #else
@@ -167,7 +211,9 @@ partially. This is not fatal."
       geom->total_sectors = geom->cylinders * geom->heads * geom->sectors;
   }
 
-  close (fd);
+ success:
+  if (geom->flags == -1)
+    close (fd);
 }
 
 #ifdef __linux__
@@ -203,7 +249,11 @@ get_floppy_disk_name (char *name, int unit)
   sprintf (name, "/dev/fd%d", unit);
 #elif defined(__FreeBSD__)
   /* FreeBSD */
+# if __FreeBSD__ >= 4
+  sprintf (name, "/dev/fd%d", unit);
+# else /* __FreeBSD__ < 4 */
   sprintf (name, "/dev/rfd%d", unit);
+# endif /* __FreeBSD__ < 4 */
 #elif defined(__NetBSD__)
   /* NetBSD */
   /* opendisk() doesn't work for floppies.  */
@@ -233,7 +283,7 @@ get_ide_disk_name (char *name, int unit)
 #elif defined(__FreeBSD__)
   /* FreeBSD */
 # if __FreeBSD__ >= 4
-  sprintf (name, "/dev/rad%d", unit);
+  sprintf (name, "/dev/ad%d", unit);
 # else /* __FreeBSD__ <= 3 */
   sprintf (name, "/dev/rwd%d", unit);
 # endif /* __FreeBSD__ <= 3 */
@@ -274,7 +324,11 @@ get_scsi_disk_name (char *name, int unit)
   sprintf (name, "/dev/sd%d", unit);
 #elif defined(__FreeBSD__)
   /* FreeBSD */
+# if __FreeBSD__ >= 4
+  sprintf (name, "/dev/da%d", unit);
+# else /* __FreeBSD__ < 4 */
   sprintf (name, "/dev/rda%d", unit);
+# endif /* __FreeBSD__ < 4 */
 #elif defined(__NetBSD__) && defined(HAVE_OPENDISK)
   /* NetBSD */
   char shortname[16];