From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:32886) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QXcaI-0004mY-U8 for qemu-devel@nongnu.org; Fri, 17 Jun 2011 13:11:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QXcaG-0001OZ-U6 for qemu-devel@nongnu.org; Fri, 17 Jun 2011 13:11:54 -0400 Received: from e23smtp09.au.ibm.com ([202.81.31.142]:56870) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QXcaF-0001No-QF for qemu-devel@nongnu.org; Fri, 17 Jun 2011 13:11:52 -0400 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [202.81.31.246]) by e23smtp09.au.ibm.com (8.14.4/8.13.1) with ESMTP id p5HHBWDd002807 for ; Sat, 18 Jun 2011 03:11:32 +1000 Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p5HHAZam1081432 for ; Sat, 18 Jun 2011 03:10:38 +1000 Received: from d23av01.au.ibm.com (loopback [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p5HHBTwr017294 for ; Sat, 18 Jun 2011 03:11:29 +1000 Message-ID: <4DFB8D8F.7050000@in.ibm.com> Date: Fri, 17 Jun 2011 22:53:27 +0530 From: Supriya Kannery MIME-Version: 1.0 References: <20110617163710.2933.89020.sendpatchset@skannery> <20110617163806.2933.39799.sendpatchset@skannery> In-Reply-To: <20110617163806.2933.39799.sendpatchset@skannery> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [V2 3/3] Command "block_set" for dynamic block params change List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Supriya Kannery Cc: Kevin Wolf , qemu-devel@nongnu.org, Christoph Hellwig Resending block_set command patch to avoid mismatch between "paramname" defined for human monitor and "name" used in do_block_set for reading name of block device parameter. --- New command "block_set" added for dynamically changing any of the block device parameters. For now, dynamic setting of hostcache params using block_set is implemented. Other block device parameter changes can be integrated in similar lines. Signed-off-by: Supriya Kannery --- block.c | 41 +++++++++++++++++++++++++++++++++++++++++ block.h | 2 ++ blockdev.c | 32 ++++++++++++++++++++++++++++++++ blockdev.h | 1 + hmp-commands.hx | 15 +++++++++++++++ qmp-commands.hx | 30 +++++++++++++++++++++++++++++- 6 files changed, 120 insertions(+), 1 deletion(-) Index: qemu/hmp-commands.hx =================================================================== --- qemu.orig/hmp-commands.hx +++ qemu/hmp-commands.hx @@ -70,6 +70,21 @@ but should be used with extreme caution. resizes image files, it can not resize block devices like LVM volumes. ETEXI + { + .name = "block_set", + .args_type = "device:B,name:s,enable:b", + .params = "device name enable", + .help = "On/Off block device parameters like hostcache", + .user_print = monitor_user_noop, + .mhandler.cmd_new = do_block_set, + }, + +STEXI +@item block_set +@findex block_set +Change block device params (eg:"hostcache"=on/off) while guest is running. +ETEXI + { .name = "eject", Index: qemu/qmp-commands.hx =================================================================== --- qemu.orig/qmp-commands.hx +++ qemu/qmp-commands.hx @@ -693,7 +693,35 @@ Example: EQMP - { + { + .name = "block_set", + .args_type = "device:B,name:s,enable:b", + .params = "device name enable", + .help = "Enable/Disable block device params like hostcache", + .user_print = monitor_user_noop, + .mhandler.cmd_new = do_block_set, + }, + +SQMP +block_set +--------- + +Change various block device parameters like hostcache. + +Arguments: + +- "device": the device's ID, must be unique (json-string) +- "name": name of the parameter to be changed" (json-string) +- "enable": value to be set for the parameter, 'true' or 'false' (json-bool) + +Example: + +-> { "execute": "block_set", "arguments": { "device": "ide0-hd0", "name": "hostcache", "enable": true } } +<- { "return": {} } + +EQMP + + { .name = "balloon", .args_type = "value:M", .params = "target", Index: qemu/blockdev.c =================================================================== --- qemu.orig/blockdev.c +++ qemu/blockdev.c @@ -797,3 +797,35 @@ int do_block_resize(Monitor *mon, const return 0; } + + +/* + * Handle changes to block device settings, like hostcache, + * while guest is running. +*/ +int do_block_set(Monitor *mon, const QDict *qdict, QObject **ret_data) +{ + const char *device = qdict_get_str(qdict, "device"); + const char *name = qdict_get_str(qdict, "name"); + int enable = qdict_get_bool(qdict, "enable"); + BlockDriverState *bs; + + bs = bdrv_find(device); + if (!bs) { + qerror_report(QERR_DEVICE_NOT_FOUND, device); + return -1; + } + + if (!(strcmp(name, "hostcache"))) { + if (bdrv_is_inserted(bs)) { + /* cache change applicable only if device inserted */ + return bdrv_change_hostcache(bs, enable); + } else { + qerror_report(QERR_DEVICE_NOT_INSERTED, device); + return -1; + } + } + + return 0; +} + Index: qemu/block.c =================================================================== --- qemu.orig/block.c +++ qemu/block.c @@ -651,6 +651,33 @@ unlink_and_fail: return ret; } +int bdrv_reopen(BlockDriverState *bs, int bdrv_flags) +{ + BlockDriver *drv = bs->drv; + int ret = 0; + + /* No need to reopen as no change in flags */ + if (bdrv_flags == bs->open_flags) + return 0; + + /* Quiesce IO for the given block device */ + qemu_aio_flush(); + bdrv_flush(bs); + + bdrv_close(bs); + ret = bdrv_open(bs, bs->filename, bdrv_flags, drv); + + /* + * A failed attempt to reopen the image file must lead to 'abort()' + */ + if (ret != 0) { + qerror_report(QERR_REOPEN_FILE_FAILED, bs->filename); + abort(); + } + + return ret; +} + void bdrv_close(BlockDriverState *bs) { if (bs->drv) { @@ -691,6 +718,20 @@ void bdrv_close_all(void) } } +int bdrv_change_hostcache(BlockDriverState *bs, bool enable_host_cache) +{ + int bdrv_flags = bs->open_flags; + + /* set hostcache flags (without changing WCE/flush bits) */ + if (enable_host_cache) + bdrv_flags &= ~BDRV_O_NOCACHE; + else + bdrv_flags |= BDRV_O_NOCACHE; + + /* Reopen file with changed set of flags */ + return bdrv_reopen(bs, bdrv_flags); +} + /* make a BlockDriverState anonymous by removing from bdrv_state list. Also, NULL terminate the device_name to prevent double remove */ void bdrv_make_anon(BlockDriverState *bs) Index: qemu/block.h =================================================================== --- qemu.orig/block.h +++ qemu/block.h @@ -71,6 +71,7 @@ void bdrv_delete(BlockDriverState *bs); int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags); int bdrv_open(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv); +int bdrv_reopen(BlockDriverState *bs, int bdrv_flags); void bdrv_close(BlockDriverState *bs); int bdrv_attach(BlockDriverState *bs, DeviceState *qdev); void bdrv_detach(BlockDriverState *bs, DeviceState *qdev); @@ -96,6 +97,7 @@ void bdrv_commit_all(void); int bdrv_change_backing_file(BlockDriverState *bs, const char *backing_file, const char *backing_fmt); void bdrv_register(BlockDriver *bdrv); +int bdrv_change_hostcache(BlockDriverState *bs, bool enable_host_cache); typedef struct BdrvCheckResult { Index: qemu/blockdev.h =================================================================== --- qemu.orig/blockdev.h +++ qemu/blockdev.h @@ -65,5 +65,6 @@ int do_change_block(Monitor *mon, const int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data); +int do_block_set(Monitor *mon, const QDict *qdict, QObject **ret_data); #endif