From nobody Fri Nov 14 00:46:06 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1583659831; cv=none; d=zohomail.com; s=zohoarc; b=M5WmXIEfxxVt8LzDSFEdmvRyT1Xt0A+Lwrz3fweBUPZbFgUzNvV5CmJnbfuvbtmv0l2YiJpMA3Dao+jt8DCFcdKuwOIeiXyV6mz6cyP8tGebvWIDCJsZCRp4+lskKeui36YF7eRYwYKH69dvBxQpmQBUUCcbxk33C/oL4xtM7iw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583659831; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=VRzrGYrU0uQ83yWnZjPo1jMoKASMgrj12IVnQYxdBHA=; b=AM5YCZP7r0y6wi9x/bxSmQtDZi3ng9rZIyioiQJpU/AtBW2PqhxT6EYsgSscItOcKPT+hS+vWlPVQ9vgyiLSpa+DxXItBcGLqWs7v6krv8jvRe7Iiy5mTLiLTIVkuTOXFQnaDVcMdoryd8kEmWDfbxMGIpFbICtSNWTFu2qoLZ0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1583659831231690.1960968091997; Sun, 8 Mar 2020 01:30:31 -0800 (PST) Received: from localhost ([::1]:56345 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jAsGU-0003p2-6T for importer@patchew.org; Sun, 08 Mar 2020 05:30:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56106) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jAsBV-0003Y2-KA for qemu-devel@nongnu.org; Sun, 08 Mar 2020 05:25:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jAsBT-0000E2-Ax for qemu-devel@nongnu.org; Sun, 08 Mar 2020 05:25:21 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:47156 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jAsBT-0000Di-5Z for qemu-devel@nongnu.org; Sun, 08 Mar 2020 05:25:19 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-256-vPk3KQvwMeaFQazH1FPU7A-1; Sun, 08 Mar 2020 05:25:14 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0AFA8801E53; Sun, 8 Mar 2020 09:25:14 +0000 (UTC) Received: from maximlenovopc.usersys.redhat.com (unknown [10.35.206.96]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9DB1C100E805; Sun, 8 Mar 2020 09:25:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1583659518; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VRzrGYrU0uQ83yWnZjPo1jMoKASMgrj12IVnQYxdBHA=; b=LrXYoHQDog39PjmR+Fyr9TWrB19GVjyUn6KKWxNG/pVyZox3vsd7urFclItdI5uO+GNiCW eT0PMix+EAQjiStGoC/0PrBHkDxAylG/Ld0jdAV0b6omWSEM0eZc5gpFaFoy0RX8UKjzWM ocOwQTRXCxlNrwzVuWjr8G115IJH/9s= X-MC-Unique: vPk3KQvwMeaFQazH1FPU7A-1 From: Maxim Levitsky To: qemu-devel@nongnu.org Subject: [PATCH v5 09/11] monitor/hmp: move remaining hmp_block* functions to block-hmp-cmds.c Date: Sun, 8 Mar 2020 11:24:38 +0200 Message-Id: <20200308092440.23564-10-mlevitsk@redhat.com> In-Reply-To: <20200308092440.23564-1-mlevitsk@redhat.com> References: <20200308092440.23564-1-mlevitsk@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Maxim Levitsky , qemu-block@nongnu.org, Markus Armbruster , "Dr. David Alan Gilbert" , Gerd Hoffmann , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Maxim Levitsky Reviewed-by: Dr. David Alan Gilbert --- block/monitor/block-hmp-cmds.c | 140 +++++++++++++++++++++++++++++++++ include/block/block-hmp-cmds.h | 9 +++ include/monitor/hmp.h | 6 -- monitor/hmp-cmds.c | 137 -------------------------------- 4 files changed, 149 insertions(+), 143 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 188374abbc..5beb7df2f7 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -52,6 +52,7 @@ #include "block/nbd.h" #include "block/block_int.h" #include "block/block-hmp-cmds.h" +#include "qemu-io.h" =20 void hmp_drive_add(Monitor *mon, const QDict *qdict) { @@ -454,3 +455,142 @@ void hmp_nbd_server_stop(Monitor *mon, const QDict *q= dict) qmp_nbd_server_stop(&err); hmp_handle_error(mon, err); } + +void hmp_block_resize(Monitor *mon, const QDict *qdict) +{ + const char *device =3D qdict_get_str(qdict, "device"); + int64_t size =3D qdict_get_int(qdict, "size"); + Error *err =3D NULL; + + qmp_block_resize(true, device, false, NULL, size, &err); + hmp_handle_error(mon, err); +} + +void hmp_block_stream(Monitor *mon, const QDict *qdict) +{ + Error *error =3D NULL; + const char *device =3D qdict_get_str(qdict, "device"); + const char *base =3D qdict_get_try_str(qdict, "base"); + int64_t speed =3D qdict_get_try_int(qdict, "speed", 0); + + qmp_block_stream(true, device, device, base !=3D NULL, base, false, NU= LL, + false, NULL, qdict_haskey(qdict, "speed"), speed, tru= e, + BLOCKDEV_ON_ERROR_REPORT, false, false, false, false, + &error); + + hmp_handle_error(mon, error); +} + +void hmp_block_passwd(Monitor *mon, const QDict *qdict) +{ + const char *device =3D qdict_get_str(qdict, "device"); + const char *password =3D qdict_get_str(qdict, "password"); + Error *err =3D NULL; + + qmp_block_passwd(true, device, false, NULL, password, &err); + hmp_handle_error(mon, err); +} + +void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict) +{ + Error *err =3D NULL; + char *device =3D (char *) qdict_get_str(qdict, "device"); + BlockIOThrottle throttle =3D { + .bps =3D qdict_get_int(qdict, "bps"), + .bps_rd =3D qdict_get_int(qdict, "bps_rd"), + .bps_wr =3D qdict_get_int(qdict, "bps_wr"), + .iops =3D qdict_get_int(qdict, "iops"), + .iops_rd =3D qdict_get_int(qdict, "iops_rd"), + .iops_wr =3D qdict_get_int(qdict, "iops_wr"), + }; + + /* + * qmp_block_set_io_throttle has separate parameters for the + * (deprecated) block device name and the qdev ID but the HMP + * version has only one, so we must decide which one to pass. + */ + if (blk_by_name(device)) { + throttle.has_device =3D true; + throttle.device =3D device; + } else { + throttle.has_id =3D true; + throttle.id =3D device; + } + + qmp_block_set_io_throttle(&throttle, &err); + hmp_handle_error(mon, err); +} + +void hmp_eject(Monitor *mon, const QDict *qdict) +{ + bool force =3D qdict_get_try_bool(qdict, "force", false); + const char *device =3D qdict_get_str(qdict, "device"); + Error *err =3D NULL; + + qmp_eject(true, device, false, NULL, true, force, &err); + hmp_handle_error(mon, err); +} + +void hmp_qemu_io(Monitor *mon, const QDict *qdict) +{ + BlockBackend *blk; + BlockBackend *local_blk =3D NULL; + bool qdev =3D qdict_get_try_bool(qdict, "qdev", false); + const char *device =3D qdict_get_str(qdict, "device"); + const char *command =3D qdict_get_str(qdict, "command"); + Error *err =3D NULL; + int ret; + + if (qdev) { + blk =3D blk_by_qdev_id(device, &err); + if (!blk) { + goto fail; + } + } else { + blk =3D blk_by_name(device); + if (!blk) { + BlockDriverState *bs =3D bdrv_lookup_bs(NULL, device, &err); + if (bs) { + blk =3D local_blk =3D blk_new(bdrv_get_aio_context(bs), + 0, BLK_PERM_ALL); + ret =3D blk_insert_bs(blk, bs, &err); + if (ret < 0) { + goto fail; + } + } else { + goto fail; + } + } + } + + /* + * Notably absent: Proper permission management. This is sad, but it s= eems + * almost impossible to achieve without changing the semantics and the= reby + * limiting the use cases of the qemu-io HMP command. + * + * In an ideal world we would unconditionally create a new BlockBacken= d for + * qemuio_command(), but we have commands like 'reopen' and want them = to + * take effect on the exact BlockBackend whose name the user passed in= stead + * of just on a temporary copy of it. + * + * Another problem is that deleting the temporary BlockBackend involves + * draining all requests on it first, but some qemu-iotests cases want= to + * issue multiple aio_read/write requests and expect them to complete = in + * the background while the monitor has already returned. + * + * This is also what prevents us from saving the original permissions = and + * restoring them later: We can't revoke permissions until all requests + * have completed, and we don't know when that is nor can we really let + * anything else run before we have revoken them to avoid race conditi= ons. + * + * What happens now is that command() in qemu-io-cmds.c can extend the + * permissions if necessary for the qemu-io command. And they simply s= tay + * extended, possibly resulting in a read-only guest device keeping wr= ite + * permissions. Ugly, but it appears to be the lesser evil. + */ + qemuio_command(blk, command); + +fail: + blk_unref(local_blk); + hmp_handle_error(mon, err); +} diff --git a/include/block/block-hmp-cmds.h b/include/block/block-hmp-cmds.h index 50ff802598..c2d18fba06 100644 --- a/include/block/block-hmp-cmds.h +++ b/include/block/block-hmp-cmds.h @@ -38,4 +38,13 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict= ); void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict); void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict); =20 +void hmp_block_resize(Monitor *mon, const QDict *qdict); +void hmp_block_stream(Monitor *mon, const QDict *qdict); +void hmp_block_passwd(Monitor *mon, const QDict *qdict); +void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict); +void hmp_eject(Monitor *mon, const QDict *qdict); + +void hmp_qemu_io(Monitor *mon, const QDict *qdict); + + #endif diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h index 736a969131..47a7cad734 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -58,9 +58,7 @@ void hmp_cont(Monitor *mon, const QDict *qdict); void hmp_system_wakeup(Monitor *mon, const QDict *qdict); void hmp_nmi(Monitor *mon, const QDict *qdict); void hmp_set_link(Monitor *mon, const QDict *qdict); -void hmp_block_passwd(Monitor *mon, const QDict *qdict); void hmp_balloon(Monitor *mon, const QDict *qdict); -void hmp_block_resize(Monitor *mon, const QDict *qdict); void hmp_loadvm(Monitor *mon, const QDict *qdict); void hmp_savevm(Monitor *mon, const QDict *qdict); void hmp_delvm(Monitor *mon, const QDict *qdict); @@ -80,10 +78,7 @@ void hmp_migrate_start_postcopy(Monitor *mon, const QDic= t *qdict); void hmp_x_colo_lost_heartbeat(Monitor *mon, const QDict *qdict); void hmp_set_password(Monitor *mon, const QDict *qdict); void hmp_expire_password(Monitor *mon, const QDict *qdict); -void hmp_eject(Monitor *mon, const QDict *qdict); void hmp_change(Monitor *mon, const QDict *qdict); -void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict); -void hmp_block_stream(Monitor *mon, const QDict *qdict); void hmp_migrate(Monitor *mon, const QDict *qdict); void hmp_device_add(Monitor *mon, const QDict *qdict); void hmp_device_del(Monitor *mon, const QDict *qdict); @@ -98,7 +93,6 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict); void hmp_chardev_change(Monitor *mon, const QDict *qdict); void hmp_chardev_remove(Monitor *mon, const QDict *qdict); void hmp_chardev_send_break(Monitor *mon, const QDict *qdict); -void hmp_qemu_io(Monitor *mon, const QDict *qdict); void hmp_cpu_add(Monitor *mon, const QDict *qdict); void hmp_object_add(Monitor *mon, const QDict *qdict); void hmp_object_del(Monitor *mon, const QDict *qdict); diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 978a6c9b36..99aa31aefa 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -48,7 +48,6 @@ #include "qom/object_interfaces.h" #include "ui/console.h" #include "block/qapi.h" -#include "qemu-io.h" #include "qemu/cutils.h" #include "qemu/error-report.h" #include "exec/ramlist.h" @@ -1312,16 +1311,6 @@ void hmp_set_link(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, err); } =20 -void hmp_block_passwd(Monitor *mon, const QDict *qdict) -{ - const char *device =3D qdict_get_str(qdict, "device"); - const char *password =3D qdict_get_str(qdict, "password"); - Error *err =3D NULL; - - qmp_block_passwd(true, device, false, NULL, password, &err); - hmp_handle_error(mon, err); -} - void hmp_balloon(Monitor *mon, const QDict *qdict) { int64_t value =3D qdict_get_int(qdict, "value"); @@ -1331,16 +1320,6 @@ void hmp_balloon(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, err); } =20 -void hmp_block_resize(Monitor *mon, const QDict *qdict) -{ - const char *device =3D qdict_get_str(qdict, "device"); - int64_t size =3D qdict_get_int(qdict, "size"); - Error *err =3D NULL; - - qmp_block_resize(true, device, false, NULL, size, &err); - hmp_handle_error(mon, err); -} - void hmp_loadvm(Monitor *mon, const QDict *qdict) { int saved_vm_running =3D runstate_is_running(); @@ -1840,15 +1819,6 @@ void hmp_expire_password(Monitor *mon, const QDict *= qdict) hmp_handle_error(mon, err); } =20 -void hmp_eject(Monitor *mon, const QDict *qdict) -{ - bool force =3D qdict_get_try_bool(qdict, "force", false); - const char *device =3D qdict_get_str(qdict, "device"); - Error *err =3D NULL; - - qmp_eject(true, device, false, NULL, true, force, &err); - hmp_handle_error(mon, err); -} =20 #ifdef CONFIG_VNC static void hmp_change_read_arg(void *opaque, const char *password, @@ -1906,49 +1876,6 @@ void hmp_change(Monitor *mon, const QDict *qdict) hmp_handle_error(mon, err); } =20 -void hmp_block_set_io_throttle(Monitor *mon, const QDict *qdict) -{ - Error *err =3D NULL; - char *device =3D (char *) qdict_get_str(qdict, "device"); - BlockIOThrottle throttle =3D { - .bps =3D qdict_get_int(qdict, "bps"), - .bps_rd =3D qdict_get_int(qdict, "bps_rd"), - .bps_wr =3D qdict_get_int(qdict, "bps_wr"), - .iops =3D qdict_get_int(qdict, "iops"), - .iops_rd =3D qdict_get_int(qdict, "iops_rd"), - .iops_wr =3D qdict_get_int(qdict, "iops_wr"), - }; - - /* qmp_block_set_io_throttle has separate parameters for the - * (deprecated) block device name and the qdev ID but the HMP - * version has only one, so we must decide which one to pass. */ - if (blk_by_name(device)) { - throttle.has_device =3D true; - throttle.device =3D device; - } else { - throttle.has_id =3D true; - throttle.id =3D device; - } - - qmp_block_set_io_throttle(&throttle, &err); - hmp_handle_error(mon, err); -} - -void hmp_block_stream(Monitor *mon, const QDict *qdict) -{ - Error *error =3D NULL; - const char *device =3D qdict_get_str(qdict, "device"); - const char *base =3D qdict_get_try_str(qdict, "base"); - int64_t speed =3D qdict_get_try_int(qdict, "speed", 0); - - qmp_block_stream(true, device, device, base !=3D NULL, base, false, NU= LL, - false, NULL, qdict_haskey(qdict, "speed"), speed, tru= e, - BLOCKDEV_ON_ERROR_REPORT, false, false, false, false, - &error); - - hmp_handle_error(mon, error); -} - typedef struct HMPMigrationStatus { QEMUTimer *timer; @@ -2241,70 +2168,6 @@ void hmp_chardev_send_break(Monitor *mon, const QDic= t *qdict) hmp_handle_error(mon, local_err); } =20 -void hmp_qemu_io(Monitor *mon, const QDict *qdict) -{ - BlockBackend *blk; - BlockBackend *local_blk =3D NULL; - bool qdev =3D qdict_get_try_bool(qdict, "qdev", false); - const char* device =3D qdict_get_str(qdict, "device"); - const char* command =3D qdict_get_str(qdict, "command"); - Error *err =3D NULL; - int ret; - - if (qdev) { - blk =3D blk_by_qdev_id(device, &err); - if (!blk) { - goto fail; - } - } else { - blk =3D blk_by_name(device); - if (!blk) { - BlockDriverState *bs =3D bdrv_lookup_bs(NULL, device, &err); - if (bs) { - blk =3D local_blk =3D blk_new(bdrv_get_aio_context(bs), - 0, BLK_PERM_ALL); - ret =3D blk_insert_bs(blk, bs, &err); - if (ret < 0) { - goto fail; - } - } else { - goto fail; - } - } - } - - /* - * Notably absent: Proper permission management. This is sad, but it s= eems - * almost impossible to achieve without changing the semantics and the= reby - * limiting the use cases of the qemu-io HMP command. - * - * In an ideal world we would unconditionally create a new BlockBacken= d for - * qemuio_command(), but we have commands like 'reopen' and want them = to - * take effect on the exact BlockBackend whose name the user passed in= stead - * of just on a temporary copy of it. - * - * Another problem is that deleting the temporary BlockBackend involves - * draining all requests on it first, but some qemu-iotests cases want= to - * issue multiple aio_read/write requests and expect them to complete = in - * the background while the monitor has already returned. - * - * This is also what prevents us from saving the original permissions = and - * restoring them later: We can't revoke permissions until all requests - * have completed, and we don't know when that is nor can we really let - * anything else run before we have revoken them to avoid race conditi= ons. - * - * What happens now is that command() in qemu-io-cmds.c can extend the - * permissions if necessary for the qemu-io command. And they simply s= tay - * extended, possibly resulting in a read-only guest device keeping wr= ite - * permissions. Ugly, but it appears to be the lesser evil. - */ - qemuio_command(blk, command); - -fail: - blk_unref(local_blk); - hmp_handle_error(mon, err); -} - void hmp_object_del(Monitor *mon, const QDict *qdict) { const char *id =3D qdict_get_str(qdict, "id"); --=20 2.17.2