[2105] 2009-04-14 Felix Zielcke <[email protected]>

Felix Zielcke <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 2105
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2105
Author:   fzielcke
Date:     2009-04-14 07:01:34 +0000 (Tue, 14 Apr 2009)
Log Message:
-----------
2009-04-14  Felix Zielcke  <[email protected]>

	* util/hostdisk.c [__FreeBSD__ || __FreeBSD_kernel__]: Include
	<sys/param.h> and <sys/sysctl.h>.
	(open_device) [__FreeBSD__ || __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.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/util/hostdisk.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2009-04-14 01:54:06 UTC (rev 2104)
+++ trunk/grub2/ChangeLog	2009-04-14 07:01:34 UTC (rev 2105)
@@ -1,3 +1,11 @@
+2009-04-14  Felix Zielcke  <[email protected]>
+
+	* util/hostdisk.c [__FreeBSD__ || __FreeBSD_kernel__]: Include
+	<sys/param.h> and <sys/sysctl.h>.
+	(open_device) [__FreeBSD__ || __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.
+
 2009-04-13  Pavel Roskin  <[email protected]>
 
 	* conf/common.rmk (grub_fstest_SOURCES): Add normal/datetime.c.

Modified: trunk/grub2/util/hostdisk.c
===================================================================
--- trunk/grub2/util/hostdisk.c	2009-04-14 01:54:06 UTC (rev 2104)
+++ trunk/grub2/util/hostdisk.c	2009-04-14 07:01:34 UTC (rev 2105)
@@ -88,6 +88,8 @@
 
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
 # include <sys/disk.h> /* DIOCGMEDIASIZE */
+# include <sys/param.h>
+# include <sys/sysctl.h>
 #endif
 
 struct
@@ -340,7 +342,35 @@
       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_error (GRUB_ERR_BAD_DEVICE, "cannot get current flags of sysctl kern.geom.debugflags");
+      return -1;
+    }
+  sysctl_flags = sysctl_oldflags | 0x10;
+  if (! (sysctl_oldflags & 0x10)
+      && sysctlbyname ("kern.geom.debugflags", NULL , 0, &sysctl_flags, sysctl_size))
+    {
+      grub_error (GRUB_ERR_BAD_DEVICE, "cannot set flags of sysctl kern.geom.debugflags");
+      return -1;
+    }
+#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_error (GRUB_ERR_BAD_DEVICE, "cannot set flags back to the old value for sysctl kern.geom.debugflags");
+      return -1;
+    }
+#endif
+
   if (fd < 0)
     {
       grub_error (GRUB_ERR_BAD_DEVICE, "cannot open `%s' in open_device()", map[disk->id].device);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.