diff --git a/ChangeLog b/ChangeLog index d6051edc2..c062155f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2004-03-12 Yoshinori K. Okuji + + From Sergey Matveychuk : + * 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 * docs/grub.texi (partnew): Change @var{to} to @var{len}. diff --git a/NEWS b/NEWS index 433ab6a59..b1a6b0b3c 100644 --- 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 bd8794a6b..6838c2bd3 100644 --- a/THANKS +++ b/THANKS @@ -92,6 +92,7 @@ Ramon van Handel Robert Millan Roderich Schupp Rogelio M. Serrano Jr. +Sergey Matveychuk Serguei Tzukanov Stefan Ondrejicka Stephen Early diff --git a/docs/grub.8 b/docs/grub.8 index 1a33cb6f9..acaa41c82 100644 --- a/docs/grub.8 +++ b/docs/grub.8 @@ -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 diff --git a/docs/mbchk.1 b/docs/mbchk.1 index abd730b73..20e6bb0ca 100644 --- a/docs/mbchk.1 +++ b/docs/mbchk.1 @@ -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 diff --git a/grub/asmstub.c b/grub/asmstub.c index a22eed4b7..094a9cd3a 100644 --- a/grub/asmstub.c +++ b/grub/asmstub.c @@ -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) diff --git a/lib/device.c b/lib/device.c index 07f7d512d..7f09d881d 100644 --- a/lib/device.c +++ b/lib/device.c @@ -78,6 +78,12 @@ struct hd_geometry # include /* ioctl */ # include # include /* CDIOCCLRDEBUG */ +# if defined(__FreeBSD__) +# include +# if __FreeBSD_version >= 500040 +# include +# 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, §or_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];