From: Filip Navara <filip.navara@gmail.com>
To: Gleb Natapov <gleb@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v3] make windows notice media change
Date: Wed, 29 Jul 2009 20:43:29 +0200 [thread overview]
Message-ID: <5b31733c0907291143h75b04339r173b90647126acc3@mail.gmail.com> (raw)
In-Reply-To: <20090729173820.GA7382@redhat.com>
2009/7/29 Gleb Natapov <gleb@redhat.com>:
> On Wed, Jul 29, 2009 at 07:10:29PM +0200, Filip Navara wrote:
>> On Wed, Jul 29, 2009 at 6:09 PM, Gleb Natapov<gleb@redhat.com> wrote:
>> > @@ -3250,6 +3253,8 @@ static int pci_ide_load(QEMUFile* f, void *opaque, int version_id)
>> > /* per IDE drive data */
>> > for(i = 0; i < 4; i++) {
>> > ide_load(f, &d->ide_if[i]);
>> > + if (version_id == 3)
>> > + qemu_get_8s(f, &d->ide_if[i].cdrom_changed);
>> > }
>> > return 0;
>> > }
>>
>> I'd prefer passing the version to ide_load and doing the actual load there...
>>
> Then you'll break ide_load for md ad pmac.
You would actually unbreak the PowerMAC code. It should save the
cdrom_changed flag the same way as the PC version does.
>> ... but the patch is all wrong and based on wrong assumptions, which is
>> much more fundamental problem. Windows cdrom driver is not that stupid
>> about the change as you think.
> Have you seen the code? How do you know?
Yes, I did. It's part of Windows DDK and it has been there at least since NT 4.
>> The cdrom driver really has a timer and polls the IDE controller, but it
>> doesn't require the intermediate ASC_MEDIUM_NOT_PRESENT state
>> you introduced. It's perfectly ok to return SENSE_UNIT_ATTENTION /
> I have
>> ASC_MEDIUM_MAY_HAVE_CHANGED from GPCMD_TEST_UNIT_READY
>> and Windows will recognize it as medium change.
>>
>> Something like this should work:
>> if (bdrv_is_inserted(s->bs)) {
>> if (s->cdrom_changed) {
>> ide_atapi_cmd_error(s, SENSE_UNIT_ATTENTION,
>> ASC_MEDIUM_MAY_HAVE_CHANGED);
>> s->cdrom_changed = 0;
>> } else {
>> ide_atapi_cmd_ok(s);
>> }
>> } else {
>> ide_atapi_cmd_error(s, SENSE_NOT_READY,
>> ASC_MEDIUM_NOT_PRESENT);
>> }
>>
>> The benefit is that it will not break guests which issue the request only
>> once.
>>
> 10.8.26 TEST UNIT READY Command
> The TEST UNIT READY command provides a means to check if the Device is
> ready. This is not a request for a self-test. If the Device would accept
> an appropriate medium-access command without returning CHECK CONDITION
> status, this command shall return a GOOD status. If the Device cannot
> become operational or is in a state such that an Host Computer action
> (e.g. START/STOP UNIT command with LoEj = 0 & Start = 1) is required to
> make the unit ready, the ATAPI CD-ROM Drive shall return CHECK CONDITION
> status with a sense key of NOT READY.
>
> No mentioning of returning MEDIUM MAY HAVE CHANGED from UNIT READY
> command, so you code it already incorrect. So what should be done in
> this case. Here is what spec says and code actually implements:
Well, my suggestion is wrong, because I didn't read the QEMU IDE code
carefully. It should return GOOD status, which is what ide_atapi_cmd_ok
already did. Notice that ide_atapi_cmd_ok doesn't set s->sense_key and
s->asc, so the values from cdrom_change_cb should be preserved and
Windows driver would still happily received the "MEDIUM MAY HAVE
CHANGED" code. So I wonder what really fails?
> 10.6 Unit Attention Condition
> If an Host Computer issues a command other than INQUIRY or REQUEST SENSE
> while a unit attention condition exists for that Host, the ATAPI CD-ROM
> Drive shall not perform the command and shall report CHECK CONDITION
> status unless a higher priority status as defined by the ATAPI CD-ROM
> Drive is also pending (e.g. BUSY).
>
> Cool. So Windows calls REQUEST SENSE after seeing CHECK CONDITION. Gets
> MEDIUM MAY HAVE CHANGED calls TEST UNIT once again see that media is
> present and thinks that CDROM gone crazy.
>
> If you claim that my fix is incorrect (it may very well be) please
> provide working tested solution compliant to spec.
I'm no IDE expert, but your change is workaround that may break
well-behaved guests
because the TEST_UNIT_READY code will intentionally return wrong result and the
guest has no reason to retry the query. The fact that Windows driver
has a timer and
eventually re-queries the status is something one shouldn't depend on.
If I knew how to patch it properly I would have done, but I don't. I'm
more than willing
to explain how Windows behaves, but I can't any patches at the moment
since I have
no Windows virtual machine ready for testing.
Best regards,
Filip Navara
next prev parent reply other threads:[~2009-07-29 18:43 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-29 16:09 [Qemu-devel] [PATCH v3] make windows notice media change Gleb Natapov
2009-07-29 17:10 ` Filip Navara
2009-07-29 17:38 ` Gleb Natapov
2009-07-29 18:43 ` Filip Navara [this message]
2009-07-29 20:12 ` Gleb Natapov
2009-07-29 21:04 ` Filip Navara
2009-07-30 3:51 ` Jamie Lokier
2009-07-30 11:54 ` Gleb Natapov
2009-07-29 19:11 ` Paul Brook
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5b31733c0907291143h75b04339r173b90647126acc3@mail.gmail.com \
--to=filip.navara@gmail.com \
--cc=gleb@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).