From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35990) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGC6P-0006yV-5L for qemu-devel@nongnu.org; Tue, 27 Jan 2015 14:47:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YGC6O-0002CN-3F for qemu-devel@nongnu.org; Tue, 27 Jan 2015 14:47:09 -0500 Received: from mx1.redhat.com ([209.132.183.28]:34019) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YGC6N-0002CI-Sb for qemu-devel@nongnu.org; Tue, 27 Jan 2015 14:47:08 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t0RJl7Af011664 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 27 Jan 2015 14:47:07 -0500 From: Max Reitz Date: Tue, 27 Jan 2015 14:46:05 -0500 Message-Id: <1422387983-32153-33-git-send-email-mreitz@redhat.com> In-Reply-To: <1422387983-32153-1-git-send-email-mreitz@redhat.com> References: <1422387983-32153-1-git-send-email-mreitz@redhat.com> Subject: [Qemu-devel] [PATCH RESEND 32/50] blockdev: Check BB validity in eject and change List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Fam Zheng , Jeff Cody , Markus Armbruster , Max Reitz , Stefan Hajnoczi , John Snow Both commands will be reimplemented in a follow-up to this patch so this does not need to be nice, it just has to work. Signed-off-by: Max Reitz --- blockdev.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/blockdev.c b/blockdev.c index 7f4470f..f3091df 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1756,10 +1756,10 @@ static void eject_device(BlockBackend *blk, int force, Error **errp) BlockDriverState *bs = blk_bs(blk); AioContext *aio_context; - aio_context = bdrv_get_aio_context(bs); + aio_context = blk_get_aio_context(blk); aio_context_acquire(aio_context); - if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) { + if (bs && bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) { goto out; } if (!blk_dev_has_removable_media(blk)) { @@ -1777,7 +1777,9 @@ static void eject_device(BlockBackend *blk, int force, Error **errp) } } - bdrv_close(bs); + if (bs) { + bdrv_close(bs); + } out: aio_context_release(aio_context); @@ -1830,18 +1832,21 @@ out: } /* Assumes AioContext is held */ -static void qmp_bdrv_open_encrypted(BlockDriverState *bs, const char *filename, +static void qmp_bdrv_open_encrypted(BlockDriverState **pbs, + const char *filename, int bdrv_flags, BlockDriver *drv, const char *password, Error **errp) { + BlockDriverState *bs; Error *local_err = NULL; int ret; - ret = bdrv_open(&bs, filename, NULL, NULL, bdrv_flags, drv, &local_err); + ret = bdrv_open(pbs, filename, NULL, NULL, bdrv_flags, drv, &local_err); if (ret < 0) { error_propagate(errp, local_err); return; } + bs = *pbs; if (bdrv_key_required(bs)) { if (password) { @@ -1865,6 +1870,7 @@ void qmp_change_blockdev(const char *device, const char *filename, AioContext *aio_context; BlockDriver *drv = NULL; int bdrv_flags; + bool new_bs; Error *err = NULL; blk = blk_by_name(device); @@ -1873,12 +1879,13 @@ void qmp_change_blockdev(const char *device, const char *filename, return; } bs = blk_bs(blk); + new_bs = !bs; - aio_context = bdrv_get_aio_context(bs); + aio_context = blk_get_aio_context(blk); aio_context_acquire(aio_context); if (format) { - drv = bdrv_find_whitelisted_format(format, bs->read_only); + drv = bdrv_find_whitelisted_format(format, blk_is_read_only(blk)); if (!drv) { error_set(errp, QERR_INVALID_BLOCK_FORMAT, format); goto out; @@ -1891,10 +1898,18 @@ void qmp_change_blockdev(const char *device, const char *filename, goto out; } - bdrv_flags = bdrv_is_read_only(bs) ? 0 : BDRV_O_RDWR; - bdrv_flags |= bdrv_is_snapshot(bs) ? BDRV_O_SNAPSHOT : 0; + bdrv_flags = blk_is_read_only(blk) ? 0 : BDRV_O_RDWR; + bdrv_flags |= blk_get_root_state(blk)->open_flags & ~BDRV_O_RDWR; - qmp_bdrv_open_encrypted(bs, filename, bdrv_flags, drv, NULL, errp); + qmp_bdrv_open_encrypted(&bs, filename, bdrv_flags, drv, NULL, &err); + if (err) { + error_propagate(errp, err); + } else if (new_bs) { + blk_insert_bs(blk, bs); + /* Has been sent automatically by bdrv_open() if blk_bs(blk) was not + * NULL */ + blk_dev_change_media_cb(blk, true); + } out: aio_context_release(aio_context); -- 2.1.0