From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:41899) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJq4e-0006AI-QV for qemu-devel@nongnu.org; Fri, 28 Oct 2011 13:18:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJq4d-0004cl-OR for qemu-devel@nongnu.org; Fri, 28 Oct 2011 13:18:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55428) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJq4d-0004cf-Ds for qemu-devel@nongnu.org; Fri, 28 Oct 2011 13:18:31 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p9SHIUvO024115 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Oct 2011 13:18:30 -0400 Message-ID: <4EAAE4A0.7090507@redhat.com> Date: Fri, 28 Oct 2011 19:21:36 +0200 From: Kevin Wolf MIME-Version: 1.0 References: <1319540020-32484-1-git-send-email-pbonzini@redhat.com> <1319540020-32484-7-git-send-email-pbonzini@redhat.com> In-Reply-To: <1319540020-32484-7-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 6/8] block: add eject request callback List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org, Markus Armbruster Am 25.10.2011 12:53, schrieb Paolo Bonzini: > Signed-off-by: Paolo Bonzini > --- > block.c | 7 +++++++ > block.h | 7 +++++++ > blockdev.c | 8 +++++--- > 3 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/block.c b/block.c > index 9873b57..53e21ba 100644 > --- a/block.c > +++ b/block.c > @@ -821,6 +821,13 @@ bool bdrv_dev_has_removable_media(BlockDriverState *bs) > return !bs->dev || (bs->dev_ops && bs->dev_ops->change_media_cb); > } > > +void bdrv_dev_eject_request(BlockDriverState *bs, bool force) > +{ > + if (bs->dev_ops && bs->dev_ops->eject_request_cb) { > + bs->dev_ops->eject_request_cb(bs->dev_opaque, force); > + } > +} > + > bool bdrv_dev_is_tray_open(BlockDriverState *bs) > { > if (bs->dev_ops && bs->dev_ops->is_tray_open) { > diff --git a/block.h b/block.h > index e77988e..d3c3d62 100644 > --- a/block.h > +++ b/block.h > @@ -39,6 +39,12 @@ typedef struct BlockDevOps { > */ > void (*change_media_cb)(void *opaque, bool load); > /* > + * Runs when an eject request is issued from the monitor, the tray > + * is closed, and the medium is locked. > + * Device models with removable media must implement this callback. > + */ > + void (*eject_request_cb)(void *opaque, bool force); > + /* > * Is the virtual tray open? > * Device models implement this only when the device has a tray. > */ > @@ -116,6 +122,7 @@ void bdrv_detach_dev(BlockDriverState *bs, void *dev); > void *bdrv_get_attached_dev(BlockDriverState *bs); > void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops, > void *opaque); > +void bdrv_dev_eject_request(BlockDriverState *bs, bool force); > bool bdrv_dev_has_removable_media(BlockDriverState *bs); > bool bdrv_dev_is_tray_open(BlockDriverState *bs); > bool bdrv_dev_is_medium_locked(BlockDriverState *bs); > diff --git a/blockdev.c b/blockdev.c > index 0827bf7..4cf333a 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -635,9 +635,11 @@ static int eject_device(Monitor *mon, BlockDriverState *bs, int force) > qerror_report(QERR_DEVICE_NOT_REMOVABLE, bdrv_get_device_name(bs)); > return -1; > } > - if (!force && !bdrv_dev_is_tray_open(bs) > - && bdrv_dev_is_medium_locked(bs)) { > - qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs)); > + if (bdrv_dev_is_medium_locked(bs) && !bdrv_dev_is_tray_open(bs)) { > + bdrv_dev_eject_request(bs, force); > + if (!force) { > + qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs)); > + } > return -1; > } > bdrv_close(bs); Now force doesn't force any more. It avoids the error message, but doesn't forcefully close the BlockDriverState any more. Intentional? If so, why is it a good idea? Kevin