qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: Commit 622b520f changed -drive if=scsi, index=N, intent


From: Markus Armbruster
Subject: [Qemu-devel] Re: Commit 622b520f changed -drive if=scsi, index=N, intentional?
Date: Thu, 27 Jan 2011 16:11:38 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)

Kevin Wolf <address@hidden> writes:

> Am 27.01.2011 13:10, schrieb Markus Armbruster:
>> Consider -drive if=scsi,index=12,...
>> 
>> Before the commit, index=12 meant bus=1,unit=5.  Example:
>> 
>>     [...]
>> 
>>     Two scsi-buses, and scsi1-cd5 with scsi-id 5 is on the second one,
>>     i.e. bus=1, unit=5.
>> 
>> After the commit, it means bus=0,unit=12.  The drive is created, but not
>> the guest device.  That's because lsi53c895a supports only 7 units
>> (LSI_MAX_DEVS), and scsi_bus_legacy_handle_cmdline() ignores drives with
>> unit numbers exceeding that limit.  Example:
>> 
>>     [...]
>> 
>>     One scsi-bus, and scsi1-cd5 nowhere to be found.
>> 
>> I'd call this a regression.
>> 
>> What now?
>
> That's a really good question. We could do something like this:
>
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -192,7 +192,7 @@ DriveInfo *drive_init(QemuOpts *opts, int
> default_to_scsi)
>              max_devs = MAX_IDE_DEVS;
>          } else if (!strcmp(buf, "scsi")) {
>             type = IF_SCSI;
> -            max_devs = MAX_SCSI_DEVS;
> +            max_devs = 7;
>          } else if (!strcmp(buf, "floppy")) {
>             type = IF_FLOPPY;
>              max_devs = 0;
>
> That's very obviously not much more than a hack, but I don't think
> blockdev.c can get the real number easily (please prove me wrong). With
> this hack, we would get the old behaviour for -drive (which doesn't use
> any other controller anyway) and you can still use -device to attach
> more devices to a non-lsi bus.

The real number is 7, because it's always been 7 :)

Okay, back to serious.  drive_init() with IF_SCSI is tied to
scsi_bus_legacy_handle_cmdline() and its callers.  The callers are SCSI
controller device initialization functions.  The controller has a per
bus unit limit.  And that's the real number for that bus.

But drive_init() doesn't know which device is going to provide a given
bus number!  It shouldn't know.  Perhaps it even can't know.

We have two callers now: lsi_scsi_init(), limit 7 (LSI_MAX_DEVS), and
esp_init1(), limit 7 (ESP_MAX_DEVS).

Let's worry about it when we add a caller with a different limit.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]