Skip to contentSkip to conversation

Don't look for a partition map on a floppy

PATCH In review Robert Mabee 2 participants 2 messages Jun 15, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Don't look for a partition map on a floppy

"echo *" takes about 12 seconds on my system (PC, BIOS, empty floppy drive) because grub_partition_iterate tries to enumerate the partitions on the floppy. "search --no-floppy" probably hits the same delay (not verified) since it has to generate the partition names before it can discard fd[0-9].

I suggest skipping tiny devices (ie < 4 MB) rather than looking at the name so it won't affect various 100 MB super floppies that might appear as BIOS floppies and therefore get indistinguishable names in fd[0-9]. Arguably these drives should continue to support partition maps, at the expense of long timeouts if they don't handle missing media any better than plain-old floppy drives do.

=== modified file 'ChangeLog'

ChangeLog 2012-06-15 04:34:50 +0000 renamed from ChangeLog 2012-06-09 17:58:38 +0000 +7 -0
@@ -1,3 +1,15 @@
+2012-06-15  Bob Mabee <[email protected]>
+
+    * kern/partition.c (grub_partition_is_plausible): New function to
+    decide drive is too small (like floppy) to support partitioning.
+    * (grub_partition_iterate): Use above so search and (*) avoid long
+    timeouts trying to read partmap from a missing floppy.
+

2012-06-09 Vladimir Serbinenko <[email protected]>

* tests/grub_script_expansion.in: Explicitly tell grep that we handle

=== modified file 'grub-core/kern/partition.c'

grub-core/kern/partition.c 2012-06-14 05:30:02 +0000 renamed from grub-core/kern/partition.c 2012-02-08 19:19:44 +0000 +11 -0
@@ -162,12 +162,23 @@
   return part;
 }
 
+/* Very unlikely to find a partmap on a tiny floppy, but looking for a
+   map costs a long timeout if drive is empty, so skip device < 4 MB.
+   (Allowing for a lower-overhead format on biggest media, 2.88 MB.) */
+static int
+grub_partition_is_plausible (struct grub_disk *disk)
+{
+  grub_uint64_t n_bytes = grub_disk_get_size (disk) << GRUB_DISK_SECTOR_BITS;
+  return n_bytes >= 4 << 20;
+}
+
 int
 grub_partition_iterate (struct grub_disk *disk,
             int (*hook) (grub_disk_t disk,
                      const grub_partition_t partition))
 {
   int ret = 0;
+  if (!grub_partition_is_plausible (disk)) return ret;
 
   auto int part_iterate (grub_disk_t dsk, const grub_partition_t p);
 
#1 lore raw
Quoted 7 lines · Robert Mabee

"echo *" takes about 12 seconds on my system (PC, BIOS, empty floppy drive) because grub_partition_iterate tries to enumerate the partitions on the floppy.
"search --no-floppy" probably hits the same delay (not verified) since it has to
generate the partition names before it can discard fd[0-9].

search -s stops when it finds first matching device and floppies are checked in the last place.

Quoted 6 lines

I suggest skipping tiny devices (ie < 4 MB) rather than looking at the name so it won't affect various 100 MB super floppies that might appear as BIOS floppies and therefore get indistinguishable names in fd[0-9]. Arguably these drives should continue to support partition maps, at the expense of long timeouts if they don't handle missing media any better than plain-old floppy drives do.

Minix floppies are partitioned.

Quoted 52 lines

=== modified file 'ChangeLog'

ChangeLog 2012-06-15 04:34:50 +0000 renamed from ChangeLog 2012-06-09 17:58:38 +0000 +7 -0
@@ -1,3 +1,15 @@
+2012-06-15  Bob Mabee <[email protected]>
+
+    * kern/partition.c (grub_partition_is_plausible): New function to
+    decide drive is too small (like floppy) to support partitioning.
+    * (grub_partition_iterate): Use above so search and (*) avoid long
+    timeouts trying to read partmap from a missing floppy.
+

2012-06-09 Vladimir Serbinenko <[email protected]>

* tests/grub_script_expansion.in: Explicitly tell grep that we handle

=== modified file 'grub-core/kern/partition.c'

grub-core/kern/partition.c 2012-06-14 05:30:02 +0000 renamed from grub-core/kern/partition.c 2012-02-08 19:19:44 +0000 +11 -0
@@ -162,12 +162,23 @@
   return part;
 }
 
+/* Very unlikely to find a partmap on a tiny floppy, but looking for a
+   map costs a long timeout if drive is empty, so skip device < 4 MB.
+   (Allowing for a lower-overhead format on biggest media, 2.88 MB.) */
+static int
+grub_partition_is_plausible (struct grub_disk *disk)
+{
+  grub_uint64_t n_bytes = grub_disk_get_size (disk) <<
 GRUB_DISK_SECTOR_BITS;
+  return n_bytes >= 4 << 20;
+}
+
 int
 grub_partition_iterate (struct grub_disk *disk,
             int (*hook) (grub_disk_t disk,
                      const grub_partition_t partition))
 {
   int ret = 0;
+  if (!grub_partition_is_plausible (disk)) return ret;
 
   auto int part_iterate (grub_disk_t dsk, const grub_partition_t p);

_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Signature · 2 lines
Regards
Vladimir 'φ-coder/phcoder' Serbinenko