Don't look for a partition map on a floppy
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);
Quoted 7 lines · Robert Mabee
"echo *" takes about 12 seconds on my system (PC, BIOS, empty floppy drive) because
grub_partition_iteratetries 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