2009-04-13 Felix Zielcke util/hostdisk.c [__FreeBSD_kernel]: Include and . [__FreeBSD__]: Likewise. (open_device) [__FreeBSD_kernel_]: Use sysctlgetbyname() to add 0x10 to `kern.geom.debugflags' if it's not already set, before opening the device and reset them afterwards. [__FreeBSD__]: Likewise. Index: util/hostdisk.c =================================================================== --- util/hostdisk.c (revision 2094) +++ util/hostdisk.c (working copy) @@ -88,6 +88,8 @@ struct hd_geometry #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) # include /* DIOCGMEDIASIZE */ +# include +# include #endif struct @@ -340,7 +342,24 @@ open_device (const grub_disk_t disk, gru sector -= disk->partition->start; } #else /* ! __linux__ */ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + int sysctl_flags, sysctl_oldflags; + const size_t sysctl_size = sizeof (sysctl_flags); + + if (sysctlbyname ("kern.geom.debugflags", &sysctl_oldflags, &sysctl_size, NULL, 0)) + grub_util_error ("cannot get current flags of sysctl kern.geom.debugflags"); + sysctl_flags = sysctl_oldflags | 0x10; + if (! sysctl_oldflags & 0x10 && sysctlbyname ("kern.geom.debugflags", NULL , 0, &sysctl_flags, sysctl_size)) + grub_util_error ("cannot set flags of sysctl kern.geom.debugflags"); +#endif + fd = open (map[disk->id].device, flags); + +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + if (! sysctl_oldflags & 0x10 && sysctlbyname ("kern.geom.debugflags", NULL , 0, &sysctl_oldflags, sysctl_size)) + grub_util_error ("cannot set flags back to the old value for sysctl kern.geom.debugflags"); +#endif + if (fd < 0) { grub_error (GRUB_ERR_BAD_DEVICE, "cannot open `%s' in open_device()", map[disk->id].device);