2008-07-04 Robert Millan <rmh@aybabtu.com>

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.
This commit is contained in:
robertmh 2008-07-03 22:56:43 +00:00
parent 277d0de997
commit 8516d2a8e1
8 changed files with 45 additions and 13 deletions

View file

@ -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)