]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Use grub-probe and not cmp to check that disk is empty.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 11 May 2012 19:07:39 +0000 (21:07 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 11 May 2012 19:07:39 +0000 (21:07 +0200)
* util/grub-install.in: Use grub-probe for zero-check.
* util/grub-probe.c (PRINT_ZERO_CHECK): New enum value.
(probe): Handle PRINT_ZERO_CHECK.
(argp_parser): Handle -t zero_check.

ChangeLog
util/grub-install.in
util/grub-probe.c

index 62df29c9660c701a3f284c748463f8a9a7b73552..e68cc9d80ae798a89bd8dd2c5199b9a666a85b36 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,13 @@
-2012-05-10  Vladimir Serbinenko  <phcoder@gmail.com>
+2012-05-11  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Use grub-probe and not cmp to check that disk is empty.
+
+       * util/grub-install.in: Use grub-probe for zero-check.
+       * util/grub-probe.c (PRINT_ZERO_CHECK): New enum value.
+       (probe): Handle PRINT_ZERO_CHECK.
+       (argp_parser): Handle -t zero_check.
+
+2012-05-11  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Flush block cache on adding disk to device map.
 
index 03d7e1fca444eb6b817d344216b5de5f4e98d523..b8e1d5a52af9e4591ced001f9fe83c46c51dd2df 100644 (file)
@@ -776,7 +776,7 @@ elif [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "i386-ieee1275" ]
                exit 1
             fi
 
-            if [ "$(file -s "${install_device}" -b | awk '{ print $1 }')" = ELF ] || [ $(cmp /dev/zero "${install_device}" &>/dev/null) ]; then
+            if [ "$(file -s "${install_device}" -b | awk '{ print $1 }')" = ELF ] || [ x$("${grub_probe}" -m "${device_map}" -d "${install_device}" -t zero_check) = xtrue ]; then
             # Change boot device to the harddisk root
                boot_device="$ofpath"
                dd if="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" of="${install_device}" status=noxfer || {
index 8734366cd4d25be08e35f7a6cf71ec4fd7eb1fc8..8beb1bc60f4a277928abb8aec8deafd3fc92f340 100644 (file)
@@ -67,6 +67,7 @@ enum {
   PRINT_ARC_HINT,
   PRINT_COMPATIBILITY_HINT,
   PRINT_MSDOS_PARTTYPE,
+  PRINT_ZERO_CHECK,
   PRINT_DISK
 };
 
@@ -392,6 +393,45 @@ probe (const char *path, char **device_names, char delim)
       goto end;
     }
 
+  if (print == PRINT_ZERO_CHECK)
+    {
+      for (curdev = drives_names; *curdev; curdev++)
+       {
+         grub_device_t dev = NULL;
+         grub_uint32_t buffer[32768];
+         grub_disk_addr_t addr;
+         grub_disk_addr_t dsize;
+
+         grub_util_info ("opening %s", *curdev);
+         dev = grub_device_open (*curdev);
+         if (! dev || !dev->disk)
+           grub_util_error ("%s", grub_errmsg);
+
+         dsize = grub_disk_get_size (dev->disk);
+         for (addr = 0; addr < dsize;
+              addr += sizeof (buffer) / GRUB_DISK_SECTOR_SIZE)
+           {
+             grub_size_t sz = sizeof (buffer);
+             grub_uint32_t *ptr;
+
+             if (sizeof (buffer) / GRUB_DISK_SECTOR_SIZE > dsize - addr)
+               sz = (dsize - addr) * GRUB_DISK_SECTOR_SIZE;
+             grub_disk_read (dev->disk, addr, 0, sz, buffer);
+
+             for (ptr = buffer; ptr < buffer + sz / sizeof (*buffer); ptr++)
+               if (*ptr)
+                 {
+                   grub_printf ("false\n");
+                   grub_device_close (dev);
+                   goto end;
+                 }
+           }
+
+         grub_device_close (dev);
+       }
+      grub_printf ("true\n");
+    }
+
   if (print == PRINT_FS || print == PRINT_FS_UUID
       || print == PRINT_FS_LABEL)
     {
@@ -770,6 +810,8 @@ argp_parser (int key, char *arg, struct argp_state *state)
        print = PRINT_ARC_HINT;
       else if (!strcmp (arg, "compatibility_hint"))
        print = PRINT_COMPATIBILITY_HINT;
+      else if (strcmp (arg, "zero_check") == 0)
+       print = PRINT_ZERO_CHECK;
       else if (!strcmp (arg, "disk"))
        print = PRINT_DISK;
       else