qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2 22/45] ide/atapi: Avoid physical/virtual tray


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v2 22/45] ide/atapi: Avoid physical/virtual tray state mismatch
Date: Fri, 02 Sep 2011 17:19:52 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)

Kevin Wolf <address@hidden> writes:

> Am 03.08.2011 15:08, schrieb Markus Armbruster:
>> When ide-cd is backed by a physical drive, we want the physical tray
>> match the virtual one.  To that end, we call bdrv_eject() on guest's
>> load/eject, and bdrv_lock_medium() on guest's prevent/allow removal.
>> But we don't set the initial state on device model init.  Fix that.
>> 
>> While there, also unlock on device model exit.
>> 
>> Signed-off-by: Markus Armbruster <address@hidden>
>> ---
>>  hw/ide/core.c |    4 ++++
>>  hw/ide/qdev.c |   18 ++++++++++++++++++
>>  2 files changed, 22 insertions(+), 0 deletions(-)
>> 
>> diff --git a/hw/ide/core.c b/hw/ide/core.c
>> index 5bcc857..d8b1d43 100644
>> --- a/hw/ide/core.c
>> +++ b/hw/ide/core.c
>> @@ -1839,6 +1839,10 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, 
>> IDEDriveKind kind,
>>  
>>      ide_reset(s);
>>      bdrv_set_removable(bs, s->drive_kind == IDE_CD);
>> +    if (s->drive_kind == IDE_CD) {
>> +        bdrv_lock_medium(bs, s->tray_locked);
>> +        bdrv_eject(bs, s->tray_open);
>> +    }
>>      return 0;
>>  }
>>  
>> diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
>> index 3b7b306..bc2f426 100644
>> --- a/hw/ide/qdev.c
>> +++ b/hw/ide/qdev.c
>> @@ -182,6 +182,12 @@ static int ide_cd_initfn(IDEDevice *dev)
>>      return ide_dev_initfn(dev, IDE_CD);
>>  }
>>  
>> +static int ide_cd_exitfn(IDEDevice *dev)
>> +{
>> +    bdrv_lock_medium(dev->conf.bs, 0);
>> +    return 0;
>> +}
>> +
>>  static int ide_drive_initfn(IDEDevice *dev)
>>  {
>>      DriveInfo *dinfo = drive_get_by_blockdev(dev->conf.bs);
>> @@ -189,6 +195,16 @@ static int ide_drive_initfn(IDEDevice *dev)
>>      return ide_dev_initfn(dev, dinfo->media_cd ? IDE_CD : IDE_HD);
>>  }
>>  
>> +static int ide_drive_exitfn(IDEDevice *dev)
>> +{
>> +    DriveInfo *dinfo = drive_get_by_blockdev(dev->conf.bs);
>> +
>> +    if (dinfo->media_cd) {
>> +        return ide_cd_exitfn(dev);
>> +    }
>
> Is dinfo->media_cd guaranteed to be the same as s->drive_kind? I
> wouldn't have expected this to be true at least since the introduction
> of ide-hd/cd.

I'm afraid you're right.  Now I need to find a way from IDEDevice to
IDEState.  These IDE data structures are sick...



reply via email to

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