diff --git a/ChangeLog b/ChangeLog index 21925bc00..799a2e2d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +2008-07-04 Robert Millan + + This fixes a performance issue when pc & gpt partmap iterators + didn't abort iteration even after our hook found what it was + looking for (often causing expensive probes of non-existant drives). + + Some callers relied on previous buggy behaviour, since they would + rise an error when their own hooks caused early abortion of its + iteration. + + * kern/device.c (grub_device_open): Improve error message. + * disk/lvm.c (grub_lvm_open): Likewise. + * disk/raid.c (grub_raid_open): Likewise. + + * partmap/pc.c (pc_partition_map_iterate): Abort parent iteration + when hook requests it, independently of grub_errno. + (pc_partition_map_probe): Do not fail when find_func() caused + early abortion of pc_partition_map_iterate(). + + * partmap/gpt.c (gpt_partition_map_iterate): Abort parent iteration + when hook requests it, independently of grub_errno. + (gpt_partition_map_probe): Do not fail when find_func() caused + early abortion of gpt_partition_map_iterate(). + + * kern/partition.c (grub_partition_iterate): Abort parent iteration + when hook requests it, independently of grub_errno. Do not fail when + part_map_iterate_hook() caused early abortion of p->iterate(). + + * util/biosdisk.c (grub_util_biosdisk_get_grub_dev): Do not fail + when grub_partition_iterate() returned with non-zero. + 2008-07-03 Pavel Roskin * disk/ata.c (grub_ata_pio_write): Check status before writing, diff --git a/disk/lvm.c b/disk/lvm.c index 997d15cd5..6a05caa75 100644 --- a/disk/lvm.c +++ b/disk/lvm.c @@ -95,7 +95,7 @@ grub_lvm_open (const char *name, grub_disk_t disk) } if (! lv) - return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown device"); + return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown LVM device %s", name); disk->has_partitions = 0; disk->id = lv->number; diff --git a/disk/raid.c b/disk/raid.c index b8a5e1210..a484fcf89 100644 --- a/disk/raid.c +++ b/disk/raid.c @@ -100,7 +100,7 @@ grub_raid_open (const char *name, grub_disk_t disk) } if (!array) - return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown device"); + return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown RAID device %s", name); disk->has_partitions = 1; disk->id = array->number; diff --git a/kern/device.c b/kern/device.c index a39fdcecb..1b5a77c00 100644 --- a/kern/device.c +++ b/kern/device.c @@ -50,7 +50,7 @@ grub_device_open (const char *name) disk = grub_disk_open (name); if (! disk) { - grub_error (GRUB_ERR_BAD_DEVICE, "unknown device"); + grub_error (GRUB_ERR_BAD_DEVICE, "unknown device %s", name); goto fail; } diff --git a/kern/partition.c b/kern/partition.c index b9a045775..cb0e4f7b8 100644 --- a/kern/partition.c +++ b/kern/partition.c @@ -103,12 +103,10 @@ grub_partition_iterate (struct grub_disk *disk, int part_map_iterate (const grub_partition_map_t p) { - grub_err_t err; - grub_dprintf ("partition", "Detecting %s...\n", p->name); - err = p->iterate (disk, part_map_iterate_hook); + p->iterate (disk, part_map_iterate_hook); - if (err != GRUB_ERR_NONE) + if (grub_errno != GRUB_ERR_NONE) { /* Continue to next partition map type. */ grub_dprintf ("partition", "%s detection failed.\n", p->name); diff --git a/partmap/gpt.c b/partmap/gpt.c index ddfde2ec9..683fcbace 100644 --- a/partmap/gpt.c +++ b/partmap/gpt.c @@ -103,7 +103,7 @@ gpt_partition_map_iterate (grub_disk_t disk, (unsigned long long) part.len); if (hook (disk, &part)) - return grub_errno; + return 1; } last_offset += grub_le_to_cpu32 (gpt.partentry_size); @@ -151,7 +151,8 @@ gpt_partition_map_probe (grub_disk_t disk, const char *str) return 0; } - if (gpt_partition_map_iterate (disk, find_func)) + gpt_partition_map_iterate (disk, find_func); + if (grub_errno) goto fail; return p; diff --git a/partmap/pc.c b/partmap/pc.c index 2fba45dbb..0aa1482a8 100644 --- a/partmap/pc.c +++ b/partmap/pc.c @@ -153,7 +153,7 @@ pc_partition_map_iterate (grub_disk_t disk, pcdata.dos_part++; if (hook (disk, &p)) - goto finish; + return 1; /* Check if this is a BSD partition. */ if (grub_pc_partition_is_bsd (e->type)) @@ -192,7 +192,7 @@ pc_partition_map_iterate (grub_disk_t disk, if (be->fs_type != GRUB_PC_PARTITION_BSD_TYPE_UNUSED) if (hook (disk, &p)) - goto finish; + return 1; } } } @@ -257,7 +257,8 @@ pc_partition_map_probe (grub_disk_t disk, const char *str) return 0; pcdata = p->data; - if (pc_partition_map_iterate (disk, find_func)) + pc_partition_map_iterate (disk, find_func); + if (grub_errno) goto fail; if (p->index < 0) diff --git a/util/biosdisk.c b/util/biosdisk.c index 65e5af0ad..1137e98fe 100644 --- a/util/biosdisk.c +++ b/util/biosdisk.c @@ -863,7 +863,8 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) if (! disk) return 0; - if (grub_partition_iterate (disk, find_partition) != GRUB_ERR_NONE) + grub_partition_iterate (disk, find_partition); + if (grub_errno != GRUB_ERR_NONE) { grub_disk_close (disk); return 0;