From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56422) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vl870-0003zv-I9 for qemu-devel@nongnu.org; Mon, 25 Nov 2013 21:10:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vl86t-0001QJ-1U for qemu-devel@nongnu.org; Mon, 25 Nov 2013 21:10:50 -0500 Received: from mx1.redhat.com ([209.132.183.28]:24824) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vl86s-0001Q9-PB for qemu-devel@nongnu.org; Mon, 25 Nov 2013 21:10:42 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rAQ2AfOV018173 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 25 Nov 2013 21:10:42 -0500 Message-ID: <52940316.9030305@redhat.com> Date: Tue, 26 Nov 2013 10:10:30 +0800 From: Fam Zheng MIME-Version: 1.0 References: <1385097894-1380-1-git-send-email-famz@redhat.com> <1385097894-1380-5-git-send-email-famz@redhat.com> <529385AF.5000309@redhat.com> In-Reply-To: <529385AF.5000309@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v4 4/7] block: Add checks of blocker in block operations List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: kwolf@redhat.com, hbrock@redhat.com, qemu-devel@nongnu.org, rjones@redhat.com, imain@redhat.com, stefanha@redhat.com On 2013=E5=B9=B411=E6=9C=8826=E6=97=A5 01:15, Paolo Bonzini wrote: > Il 22/11/2013 06:24, Fam Zheng ha scritto: >> Before operate on a BlockDriverState, respective types are checked >> against bs->op_blockers and it will error out if there's a blocker. > > How did you choose them? I understand blocking change (and eject?), bu= t > not blocking set-io-throttle. > > In particular, this means that old in_use users, which did not block > commands such as nbd-server-add, will now block it. > Right, I'll drop nbd, passwd and throttle checks. Fam > >> Signed-off-by: Fam Zheng >> --- >> blockdev-nbd.c | 4 ++++ >> blockdev.c | 25 +++++++++++++++++++++++++ >> 2 files changed, 29 insertions(+) >> >> diff --git a/blockdev-nbd.c b/blockdev-nbd.c >> index 922cf56..c49feae 100644 >> --- a/blockdev-nbd.c >> +++ b/blockdev-nbd.c >> @@ -92,6 +92,10 @@ void qmp_nbd_server_add(const char *device, bool ha= s_writable, bool writable, >> return; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_NBD_SERVER_ADD, errp)) { >> + return; >> + } >> + >> if (!has_writable) { >> writable =3D false; >> } >> diff --git a/blockdev.c b/blockdev.c >> index eb55b74..1921d27 100644 >> --- a/blockdev.c >> +++ b/blockdev.c >> @@ -1001,6 +1001,11 @@ SnapshotInfo *qmp_blockdev_snapshot_delete_inte= rnal_sync(const char *device, >> return NULL; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE= , >> + errp)) { >> + return NULL; >> + } >> + >> ret =3D bdrv_snapshot_find_by_id_and_name(bs, id, name, &sn, &lo= cal_err); >> if (error_is_set(&local_err)) { >> error_propagate(errp, local_err); >> @@ -1098,6 +1103,10 @@ static void internal_snapshot_prepare(BlkTransa= ctionState *common, >> return; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, errp)= ) { >> + return; >> + } >> + >> if (!bdrv_is_inserted(bs)) { >> error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, device); >> return; >> @@ -1485,6 +1494,10 @@ void qmp_block_passwd(const char *device, const= char *password, Error **errp) >> return; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_PASSWD, errp)) { >> + return; >> + } >> + >> err =3D bdrv_set_key(bs, password); >> if (err =3D=3D -EINVAL) { >> error_set(errp, QERR_DEVICE_NOT_ENCRYPTED, bdrv_get_device_n= ame(bs)); >> @@ -1536,6 +1549,10 @@ void qmp_change_blockdev(const char *device, co= nst char *filename, >> return; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_CHANGE, errp)) { >> + return; >> + } >> + >> if (format) { >> drv =3D bdrv_find_whitelisted_format(format, bs->read_only); >> if (!drv) { >> @@ -1586,6 +1603,10 @@ void qmp_block_set_io_throttle(const char *devi= ce, int64_t bps, int64_t bps_rd, >> return; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_SET_IO_THROTTLE, errp)) = { >> + return; >> + } >> + >> memset(&cfg, 0, sizeof(cfg)); >> cfg.buckets[THROTTLE_BPS_TOTAL].avg =3D bps; >> cfg.buckets[THROTTLE_BPS_READ].avg =3D bps_rd; >> @@ -1684,6 +1705,10 @@ void qmp_block_resize(const char *device, int64= _t size, Error **errp) >> return; >> } >> >> + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_RESIZE, errp)) { >> + return; >> + } >> + >> if (size < 0) { >> error_set(errp, QERR_INVALID_PARAMETER_VALUE, "size", "a >0 = size"); >> return; >> >