+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>
* disk/ata.c (grub_ata_pio_write): Check status before writing,
}
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;
}
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;
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;
}
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);
(unsigned long long) part.len);
if (hook (disk, &part))
- return grub_errno;
+ return 1;
}
last_offset += grub_le_to_cpu32 (gpt.partentry_size);
return 0;
}
- if (gpt_partition_map_iterate (disk, find_func))
+ gpt_partition_map_iterate (disk, find_func);
+ if (grub_errno)
goto fail;
return p;
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))
if (be->fs_type != GRUB_PC_PARTITION_BSD_TYPE_UNUSED)
if (hook (disk, &p))
- goto finish;
+ return 1;
}
}
}
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)
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;