mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
ide: Update ide_drive_get to be HBA agnostic
Instead of duplicating the logic for the if_ide (bus,unit) mappings, rely on the blockdev layer for managing those mappings for us, and use the drive_get_by_index call instead. This allows ide_drive_get to work for AHCI HBAs as well, and can be used in the Q35 initialization. Lastly, change the nature of the argument to ide_drive_get so that represents the number of total drives we can support, and not the total number of buses. This will prevent array overflows if the units-per-default-bus property ever needs to be adjusted for compatibility reasons. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Message-id: 1412187569-23452-5-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
1602651833
commit
d8f94e1bb2
12 changed files with 44 additions and 14 deletions
|
@ -2558,16 +2558,28 @@ const VMStateDescription vmstate_ide_bus = {
|
|||
}
|
||||
};
|
||||
|
||||
void ide_drive_get(DriveInfo **hd, int max_bus)
|
||||
void ide_drive_get(DriveInfo **hd, int n)
|
||||
{
|
||||
int i;
|
||||
int highest_bus = drive_get_max_bus(IF_IDE) + 1;
|
||||
int max_devs = drive_get_max_devs(IF_IDE);
|
||||
int n_buses = max_devs ? (n / max_devs) : n;
|
||||
|
||||
if (drive_get_max_bus(IF_IDE) >= max_bus) {
|
||||
fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
|
||||
/*
|
||||
* Note: The number of actual buses available is not known.
|
||||
* We compute this based on the size of the DriveInfo* array, n.
|
||||
* If it is less than max_devs * <num_real_buses>,
|
||||
* We will stop looking for drives prematurely instead of overfilling
|
||||
* the array.
|
||||
*/
|
||||
|
||||
if (highest_bus > n_buses) {
|
||||
error_report("Too many IDE buses defined (%d > %d)",
|
||||
highest_bus, n_buses);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
|
||||
hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
|
||||
for (i = 0; i < n; i++) {
|
||||
hd[i] = drive_get_by_index(IF_IDE, i);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue