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:
parent
277d0de997
commit
8516d2a8e1
8 changed files with 45 additions and 13 deletions
31
ChangeLog
31
ChangeLog
|
@ -1,3 +1,34 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2008-07-03 Pavel Roskin <proski@gnu.org>
|
2008-07-03 Pavel Roskin <proski@gnu.org>
|
||||||
|
|
||||||
* disk/ata.c (grub_ata_pio_write): Check status before writing,
|
* disk/ata.c (grub_ata_pio_write): Check status before writing,
|
||||||
|
|
|
@ -95,7 +95,7 @@ grub_lvm_open (const char *name, grub_disk_t disk)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! lv)
|
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->has_partitions = 0;
|
||||||
disk->id = lv->number;
|
disk->id = lv->number;
|
||||||
|
|
|
@ -100,7 +100,7 @@ grub_raid_open (const char *name, grub_disk_t disk)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!array)
|
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->has_partitions = 1;
|
||||||
disk->id = array->number;
|
disk->id = array->number;
|
||||||
|
|
|
@ -50,7 +50,7 @@ grub_device_open (const char *name)
|
||||||
disk = grub_disk_open (name);
|
disk = grub_disk_open (name);
|
||||||
if (! disk)
|
if (! disk)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_DEVICE, "unknown device");
|
grub_error (GRUB_ERR_BAD_DEVICE, "unknown device %s", name);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,12 +103,10 @@ grub_partition_iterate (struct grub_disk *disk,
|
||||||
|
|
||||||
int part_map_iterate (const grub_partition_map_t p)
|
int part_map_iterate (const grub_partition_map_t p)
|
||||||
{
|
{
|
||||||
grub_err_t err;
|
|
||||||
|
|
||||||
grub_dprintf ("partition", "Detecting %s...\n", p->name);
|
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. */
|
/* Continue to next partition map type. */
|
||||||
grub_dprintf ("partition", "%s detection failed.\n", p->name);
|
grub_dprintf ("partition", "%s detection failed.\n", p->name);
|
||||||
|
|
|
@ -103,7 +103,7 @@ gpt_partition_map_iterate (grub_disk_t disk,
|
||||||
(unsigned long long) part.len);
|
(unsigned long long) part.len);
|
||||||
|
|
||||||
if (hook (disk, &part))
|
if (hook (disk, &part))
|
||||||
return grub_errno;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_offset += grub_le_to_cpu32 (gpt.partentry_size);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gpt_partition_map_iterate (disk, find_func))
|
gpt_partition_map_iterate (disk, find_func);
|
||||||
|
if (grub_errno)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
|
|
|
@ -153,7 +153,7 @@ pc_partition_map_iterate (grub_disk_t disk,
|
||||||
pcdata.dos_part++;
|
pcdata.dos_part++;
|
||||||
|
|
||||||
if (hook (disk, &p))
|
if (hook (disk, &p))
|
||||||
goto finish;
|
return 1;
|
||||||
|
|
||||||
/* Check if this is a BSD partition. */
|
/* Check if this is a BSD partition. */
|
||||||
if (grub_pc_partition_is_bsd (e->type))
|
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 (be->fs_type != GRUB_PC_PARTITION_BSD_TYPE_UNUSED)
|
||||||
if (hook (disk, &p))
|
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;
|
return 0;
|
||||||
|
|
||||||
pcdata = p->data;
|
pcdata = p->data;
|
||||||
if (pc_partition_map_iterate (disk, find_func))
|
pc_partition_map_iterate (disk, find_func);
|
||||||
|
if (grub_errno)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (p->index < 0)
|
if (p->index < 0)
|
||||||
|
|
|
@ -863,7 +863,8 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
if (! disk)
|
if (! disk)
|
||||||
return 0;
|
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);
|
grub_disk_close (disk);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue