Bug#239111: Freeze when installing GRUB on XFS boot partition

Ben Hutchings ben at decadent.org.uk
Sun Jan 4 19:56:56 UTC 2009


Here's another possibility: don't run xfs_freeze at all but instead run
a separate program that does ioctl(FIBMAP).  This works for me on ext3
in that it doesn't break installation.  Please can you test this with a
fresh installation of grub on XFS?

diff -urN grub-0.97.orig/util/grub-install.in grub-0.97/util/grub-install.in
--- grub-0.97.orig/util/grub-install.in	2004-07-24 19:57:31.000000000 +0100
+++ grub-0.97/util/grub-install.in	2009-01-04 19:26:31.000000000 +0000
@@ -30,6 +30,7 @@
 pkglibdir=${libdir}/${PACKAGE}/${host_cpu}-${host_vendor}
 
 grub_shell=${sbindir}/grub
+grub_map_file=${sbindir}/grub-map-file
 grub_set_default=${sbindir}/grub-set-default
 log_file=/tmp/grub-install.log.$$
 img_file=/tmp/grub-install.img.$$
@@ -471,6 +472,7 @@
 test -n "$mklog" && log_file=`$mklog`
 
 for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
+    $grub_map_file $file || exit 1
     count=5
     tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
     while test $count -gt 0; do
diff -urN grub-0.97.orig/util/grub-map-file.c grub-0.97/util/grub-map-file.c
--- grub-0.97.orig/util/grub-map-file.c	1970-01-01 01:00:00.000000000 +0100
+++ grub-0.97/util/grub-map-file.c	2009-01-04 19:19:44.000000000 +0000
@@ -0,0 +1,76 @@
+/* grub-map-file - force block-mapping for a file using ioctl(FIBMAP) */
+/*
+ *  Copyright (C) 2008  Ben Hutchings <ben at decadent.org.uk>.
+ *
+ *  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
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define _FILE_OFFSET_BITS 64
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <linux/fs.h>
+
+int
+main (int argc, char **argv)
+{
+  int fd;
+  struct stat stats;
+  unsigned long n, i;
+
+  if (argc != 2)
+    {
+      fprintf (stderr, "Usage: grub-map-file FILENAME\n");
+      exit (2);
+    }
+
+  fd = open (argv[1], O_RDONLY);
+  if (fd < 0)
+    {
+      fprintf (stderr, "grub-map-file: open %s: %s\n",
+		argv[1], strerror (errno));
+      exit (1);
+    }
+
+  if (fstat (fd, &stats))
+    {
+      fprintf (stderr, "grub-map-file: stat %s: %s\n",
+		argv[1], strerror (errno));
+      exit (1);
+    }
+  n = (stats.st_size + stats.st_blksize - 1) / stats.st_blksize;
+
+  for (i = 0; i < n; i++)
+    {
+      unsigned long temp = i;
+      if (ioctl (fd, FIBMAP, &temp))
+	{
+	  fprintf (stderr, "grub-map-file: FIBMAP %s: %s\n",
+		   argv[1], strerror (errno));
+	  exit (1);
+	}
+    }
+
+  return 0;
+}
diff -urN grub-0.97.orig/util/Makefile.am grub-0.97/util/Makefile.am
--- grub-0.97.orig/util/Makefile.am	2004-06-19 20:52:06.000000000 +0100
+++ grub-0.97/util/Makefile.am	2009-01-04 19:21:05.000000000 +0000
@@ -1,4 +1,5 @@
 bin_PROGRAMS = mbchk
+sbin_PROGRAMS = grub-map-file
 sbin_SCRIPTS = grub-install grub-md5-crypt grub-terminfo \
 	grub-set-default
 noinst_SCRIPTS = grub-image mkbimage
@@ -10,3 +11,5 @@
 
 mbchk_SOURCES = mbchk.c
 mbchk_LDADD = ../lib/libcommon.a
+
+grub_map_file_SOURCES =  grub-map-file.c
--- END ---

If that doesn't work, please also test my previously proposed patch:

--- grub-0.97.orig/util/grub-install.in	2004-07-24 19:57:31.000000000 +0100
+++ grub-0.97/util/grub-install.in	2009-01-04 04:57:47.000000000 +0000
@@ -418,6 +418,12 @@
 # Make a default file.
 ${grub_set_default} --root-directory=${rootdir} default
 
+# XFS is special; we must run xfs_freeze to flush files as well as sync
+# (which grub itself does).
+if [ "$(stat -f --printf=%T ${grubdir})" = "xfs" ]; then
+    xfs_freeze -f ${grubdir} && xfs_freeze -u ${grubdir}
+fi
+
 # Make sure that GRUB reads the same images as the host OS.
 test -n "$mkimg" && img_file=`$mkimg`
 test -n "$mklog" && log_file=`$mklog`
--- END ---

Either of these patches should replace debian/patches/xfs_freeze.diff in
the source package.

Ben.

-- 
Ben Hutchings
[W]e found...that it wasn't as easy to get programs right as we had thought.
... I realized that a large part of my life from then on was going to be spent
in finding mistakes in my own programs. - Maurice Wilkes, 1949
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.alioth.debian.org/pipermail/pkg-grub-devel/attachments/20090104/e12193d4/attachment.pgp 


More information about the Pkg-grub-devel mailing list