]> git.proxmox.com Git - grub2.git/commitdiff
Avoid consuming lots of space and time if the first partition is not near the start...
authorColin Watson <cjwatson@ubuntu.com>
Fri, 25 Mar 2011 17:22:12 +0000 (17:22 +0000)
committerColin Watson <cjwatson@ubuntu.com>
Fri, 25 Mar 2011 17:22:12 +0000 (17:22 +0000)
ChangeLog.embed-sectors
grub-core/partmap/gpt.c
grub-core/partmap/msdos.c
include/grub/partition.h
util/grub-setup.c

index b1d5868e7673ed67272cb908dd4cf27ac044839c..a8de67d24dc059f646af4e026ad3c5e66b2cc7ce 100644 (file)
@@ -1,7 +1,12 @@
 2011-03-14  Colin Watson  <cjwatson@ubuntu.com>
 
+       * include/grub/partition.h (grub_partition_map): Change prototype of
+       embed to take a maximum value for nsectors.
        * grub-core/partmap/msdos.c (embed_signatures): New array.
        (pc_partition_map_embed): Check for and avoid sectors matching any
-       of the signatures in embed_signatures.
+       of the signatures in embed_signatures, up to max_nsectors.
+       * grub-core/partmap/gpt.c (gpt_partition_map_embed): Restrict
+       returned sector map to max_nsectors.
        * util/grub-setup.c (setup): Allow for the embedding area being
-       split into multiple blocklists.
+       split into multiple blocklists.  Tell dest_partmap->embed the
+       maximum number of sectors we care about.
index 7f2c36143bbe95ecd678a85828bce8aaa136922d..c4c10d73d506bc6ab506ad2688b2a596812d46a9 100644 (file)
@@ -125,6 +125,7 @@ gpt_partition_map_iterate (grub_disk_t disk,
 #ifdef GRUB_UTIL
 static grub_err_t
 gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
+                        unsigned int max_nsectors,
                         grub_embed_type_t embed_type,
                         grub_disk_addr_t **sectors)
 {
@@ -174,6 +175,8 @@ gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
                       " embedding won't be possible!");
 
   *nsectors = len;
+  if (*nsectors > max_nsectors)
+    *nsectors = max_nsectors;
   *sectors = grub_malloc (*nsectors * sizeof (**sectors));
   if (!*sectors)
     return grub_errno;
index acfa6f302810d5a21087b5a898bbda0f85341c9a..0352d69491e8b307c6db36996fe510ef564bf2c7 100644 (file)
@@ -185,6 +185,7 @@ grub_partition_msdos_iterate (grub_disk_t disk,
 #ifdef GRUB_UTIL
 static grub_err_t
 pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
+                       unsigned int max_nsectors,
                        grub_embed_type_t embed_type,
                        grub_disk_addr_t **sectors)
 {
@@ -275,10 +276,13 @@ pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
     {
       unsigned i, j;
       char *embed_signature_check;
-      unsigned int orig_nsectors;
+      unsigned int orig_nsectors, avail_nsectors;
 
       orig_nsectors = *nsectors;
       *nsectors = end - 2;
+      avail_nsectors = *nsectors;
+      if (*nsectors > max_nsectors)
+       *nsectors = max_nsectors;
       *sectors = grub_malloc (*nsectors * sizeof (**sectors));
       if (!*sectors)
        return grub_errno;
@@ -307,11 +311,20 @@ pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
                          "future.  Please ask its authors not to store data "
                          "in the boot track",
                          (*sectors)[i], embed_signatures[j].name);
-         (*nsectors)--;
+         avail_nsectors--;
+         if (avail_nsectors < *nsectors)
+           *nsectors = avail_nsectors;
 
          /* Avoid this sector.  */
          for (j = i; j < *nsectors; j++)
            (*sectors)[j]++;
+
+         /* Have we run out of space?  */
+         if (avail_nsectors < orig_nsectors)
+           break;
+
+         /* Make sure to check the next sector.  */
+         i--;
        }
       grub_free (embed_signature_check);
 
index e7e00ef7fa6e2ac50356edf5164fd359dbae3970..13ada8614648781aa024d47a9871ca9f0c8724bb 100644 (file)
@@ -49,6 +49,7 @@ struct grub_partition_map
 #ifdef GRUB_UTIL
   /* Determine sectors available for embedding.  */
   grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
+                      unsigned int max_nsectors,
                       grub_embed_type_t embed_type,
                       grub_disk_addr_t **sectors);
 #endif
index dc2ab0cce4e89ca2e82f6bbc246f2133bcbe61b0..02abb0d1f16815b8f49b31285ffbab264bbe510a 100644 (file)
@@ -426,10 +426,8 @@ setup (const char *dir,
       }
 
     nsec = core_sectors;
-    err = dest_partmap->embed (dest_dev->disk, &nsec,
+    err = dest_partmap->embed (dest_dev->disk, &nsec, 2 * core_sectors,
                               GRUB_EMBED_PCBIOS, &sectors);
-    if (nsec > 2 * core_sectors)
-      nsec = 2 * core_sectors;
     
     if (err)
       {