From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:45656) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QobRP-0004Cn-8z for qemu-devel@nongnu.org; Wed, 03 Aug 2011 09:24:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QobRN-0004te-LL for qemu-devel@nongnu.org; Wed, 03 Aug 2011 09:24:55 -0400 Received: from oxygen.pond.sub.org ([78.46.104.156]:50173) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QobRM-0004sx-VV for qemu-devel@nongnu.org; Wed, 03 Aug 2011 09:24:53 -0400 From: Markus Armbruster Date: Wed, 3 Aug 2011 15:07:56 +0200 Message-Id: <1312376904-16115-18-git-send-email-armbru@redhat.com> In-Reply-To: <1312376904-16115-1-git-send-email-armbru@redhat.com> References: <1312376904-16115-1-git-send-email-armbru@redhat.com> Subject: [Qemu-devel] [PATCH v2 17/45] block: Leave enforcing tray lock to device models List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, quintela@redhat.com, stefano.stabellini@eu.citrix.com, lcapitulino@redhat.com, hare@suse.de, amit.shah@redhat.com, hch@lst.de The device model knows best when to accept the guest's eject command. No need to detour through the block layer. bdrv_eject() can't fail anymore. Make it void. Signed-off-by: Markus Armbruster --- block.c | 7 +------ block.h | 2 +- hw/ide/atapi.c | 29 +++++++++-------------------- hw/scsi-disk.c | 3 +++ 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/block.c b/block.c index 737cdc9..73e0fd4 100644 --- a/block.c +++ b/block.c @@ -3016,18 +3016,13 @@ int bdrv_media_changed(BlockDriverState *bs) /** * If eject_flag is TRUE, eject the media. Otherwise, close the tray */ -int bdrv_eject(BlockDriverState *bs, int eject_flag) +void bdrv_eject(BlockDriverState *bs, int eject_flag) { BlockDriver *drv = bs->drv; - if (eject_flag && bs->locked) { - return -EBUSY; - } - if (drv && drv->bdrv_eject) { drv->bdrv_eject(bs, eject_flag); } - return 0; } int bdrv_is_locked(BlockDriverState *bs) diff --git a/block.h b/block.h index 3ff30c9..3f33c8e 100644 --- a/block.h +++ b/block.h @@ -207,7 +207,7 @@ int bdrv_is_inserted(BlockDriverState *bs); int bdrv_media_changed(BlockDriverState *bs); int bdrv_is_locked(BlockDriverState *bs); void bdrv_set_locked(BlockDriverState *bs, int locked); -int bdrv_eject(BlockDriverState *bs, int eject_flag); +void bdrv_eject(BlockDriverState *bs, int eject_flag); void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size); BlockDriverState *bdrv_find(const char *name); BlockDriverState *bdrv_next(BlockDriverState *bs); diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index 237657f..6cb8f0e 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -894,33 +894,22 @@ static void cmd_seek(IDEState *s, uint8_t* buf) static void cmd_start_stop_unit(IDEState *s, uint8_t* buf) { - int sense, err = 0; + int sense; bool start = buf[4] & 1; bool loej = buf[4] & 2; if (loej) { - err = bdrv_eject(s->bs, !start); - } - - switch (err) { - case 0: - ide_atapi_cmd_ok(s); - break; - case -EBUSY: - sense = SENSE_NOT_READY; - if (bdrv_is_inserted(s->bs)) { - sense = SENSE_ILLEGAL_REQUEST; + if (!start && s->tray_locked) { + sense = bdrv_is_inserted(s->bs) + ? SENSE_NOT_READY : SENSE_ILLEGAL_REQUEST; + ide_atapi_cmd_error(s, sense, ASC_MEDIA_REMOVAL_PREVENTED); + return; } - ide_atapi_cmd_error(s, sense, ASC_MEDIA_REMOVAL_PREVENTED); - break; - default: - ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT); - break; - } - - if (loej && !err) { + bdrv_eject(s->bs, !start); s->tray_open = !start; } + + ide_atapi_cmd_ok(s); } static void cmd_mechanism_status(IDEState *s, uint8_t* buf) diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 8ca69f2..d22a211 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -836,6 +836,9 @@ static void scsi_disk_emulate_start_stop(SCSIDiskReq *r) bool loej = req->cmd.buf[4] & 2; if (s->qdev.type == TYPE_ROM && loej) { + if (!start && s->tray_locked) { + return; + } bdrv_eject(s->bs, !start); s->tray_open = !start; } -- 1.7.6