All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices
@ 2011-01-24 12:32 Christoph Hellwig
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command Christoph Hellwig
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-24 12:32 UTC (permalink / raw)
  To: qemu-devel

This patchset adds support for online resizing of block devices.

The first patch adds a new resize monitor command which call into
the existing image resize code.  This is the meat of the series
and probably needs quite a bit of review and help as I'm not sure
about how to implement the error handling for monitor commands
correctly.  Am I really supposed to add a new QERR_ definition
for each possible error?  And if yes how am I supposed to define
them?  The macros for them aren't exactly self-explaining.

The second patch adds a way to tell drivers about a resize, and the
third one adds a guest notification for config changes to virtio-blk
which allows the guest to pick it up without a rescan.  I've just sent
the corresponding Linux guest driver patch to Rusty.

Changes from version 2 to version 3:
 - add missing braces
 - use device as the argument name for the device string
 - also rename the HMP version of the command to block_resize

Changes from version 1 to version 2:
 - also add a QMP command (block_resize)
 - use the o format for the size in the monitor command
 - fix typos
 - use QERR_UNDEFINED_ERROR for errors instead of unstructured strings
 - remove the CDROM hint check
 - add a reason argument to the change callback
---end quoted text---

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command
  2011-01-24 12:32 [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Christoph Hellwig
@ 2011-01-24 12:32 ` Christoph Hellwig
  2011-01-24 17:44   ` Marcelo Tosatti
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 2/3] block: tell drivers about an image resize Christoph Hellwig
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-24 12:32 UTC (permalink / raw)
  To: qemu-devel

Add a monitor command that allows resizing of block devices while
qemu is running.  It uses the existing bdrv_truncate method already
used by qemu-img to do it's work.  Compared to qemu-img the size
parsing is very simplicistic, but I think having a properly numering
object is more useful for non-humand monitor users than having
the units and relative resize parsing.

For SCSI devices the new size can be updated in Linux guests by
doing the following shell command:

	echo > /sys/class/scsi_device/0:0:0:0/device/rescan

For ATA devices I don't know of a way to update the block device
size in Linux system, and for virtio-blk the next two patches
will provide an automatic update of the size when this command
is issued on the host.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: qemu/hmp-commands.hx
===================================================================
--- qemu.orig/hmp-commands.hx	2011-01-24 11:55:36.744254374 +0100
+++ qemu/hmp-commands.hx	2011-01-24 11:56:23.619254094 +0100
@@ -53,6 +53,25 @@ Quit the emulator.
 ETEXI
 
     {
+        .name       = "block_resize",
+        .args_type  = "device:B,size:o",
+        .params     = "device size",
+        .help       = "resize a block image",
+        .user_print = monitor_user_noop,
+        .mhandler.cmd_new = do_block_resize,
+    },
+
+STEXI
+@item block_resize
+@findex block_resize
+Resize a block image while a guest is running.  Usually requires guest
+action to see the updated size.  Resize to a lower size is supported,
+but should be used with extreme caution.  Note that this command only
+resizes image files, it can not resize block devices like LVM volumes.
+ETEXI
+
+
+    {
         .name       = "eject",
         .args_type  = "force:-f,device:B",
         .params     = "[-f] device",
Index: qemu/blockdev.c
===================================================================
--- qemu.orig/blockdev.c	2011-01-24 11:56:20.903004129 +0100
+++ qemu/blockdev.c	2011-01-24 11:56:38.391254165 +0100
@@ -705,3 +705,33 @@ int do_drive_del(Monitor *mon, const QDi
 
     return 0;
 }
+
+/*
+ * XXX: replace the QERR_UNDEFINED_ERROR errors with real values once the
+ * existing QERR_ macro mess is cleaned up.  A good example for better
+ * error reports can be found in the qemu-img resize code.
+ */
+int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data)
+{
+    const char *device = qdict_get_str(qdict, "device");
+    int64_t size = qdict_get_int(qdict, "size");
+    BlockDriverState *bs;
+
+    bs = bdrv_find(device);
+    if (!bs) {
+        qerror_report(QERR_DEVICE_NOT_FOUND, device);
+        return -1;
+    }
+
+    if (size < 0) {
+        qerror_report(QERR_UNDEFINED_ERROR);
+        return -1;
+    }
+
+    if (bdrv_truncate(bs, size)) {
+        qerror_report(QERR_UNDEFINED_ERROR);
+        return -1;
+    }
+
+    return 0;
+}
Index: qemu/blockdev.h
===================================================================
--- qemu.orig/blockdev.h	2011-01-24 11:55:36.764254165 +0100
+++ qemu/blockdev.h	2011-01-24 11:56:23.627253465 +0100
@@ -53,5 +53,6 @@ int do_change_block(Monitor *mon, const
                     const char *filename, const char *fmt);
 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);
 
 #endif
Index: qemu/qmp-commands.hx
===================================================================
--- qemu.orig/qmp-commands.hx	2011-01-24 11:55:36.771253955 +0100
+++ qemu/qmp-commands.hx	2011-01-24 11:56:23.632253884 +0100
@@ -601,6 +601,34 @@ Example:
 -> { "execute": "netdev_del", "arguments": { "id": "netdev1" } }
 <- { "return": {} }
 
+
+EQMP
+
+    {
+        .name       = "block_resize",
+        .args_type  = "device:B,size:o",
+        .params     = "device size",
+        .help       = "resize a block image",
+        .user_print = monitor_user_noop,
+        .mhandler.cmd_new = do_block_resize,
+    },
+
+SQMP
+block_resize
+------------
+
+Resize a block image while a guest is running.
+
+Arguments:
+
+- "device": the device's ID, must be unique (json-string)
+- "size": new size
+
+Example:
+
+-> { "execute": "block_resize", "arguments": { "device": "scratch", "size": 1073741824 } }
+<- { "return": {} }
+
 EQMP
 
     {

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 2/3] block: tell drivers about an image resize
  2011-01-24 12:32 [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Christoph Hellwig
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command Christoph Hellwig
@ 2011-01-24 12:32 ` Christoph Hellwig
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes Christoph Hellwig
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-24 12:32 UTC (permalink / raw)
  To: qemu-devel

Extend the change_cb callback with a reason argument, and use it
to tell drivers about size changes.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: qemu/block.c
===================================================================
--- qemu.orig/block.c	2011-01-24 11:56:20.899004129 +0100
+++ qemu/block.c	2011-01-24 11:56:39.796004269 +0100
@@ -645,7 +645,7 @@ int bdrv_open(BlockDriverState *bs, cons
         /* call the change callback */
         bs->media_changed = 1;
         if (bs->change_cb)
-            bs->change_cb(bs->change_opaque);
+            bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
     }
 
     return 0;
@@ -684,7 +684,7 @@ void bdrv_close(BlockDriverState *bs)
         /* call the change callback */
         bs->media_changed = 1;
         if (bs->change_cb)
-            bs->change_cb(bs->change_opaque);
+            bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
     }
 }
 
@@ -1135,6 +1135,9 @@ int bdrv_truncate(BlockDriverState *bs,
     ret = drv->bdrv_truncate(bs, offset);
     if (ret == 0) {
         ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
+        if (bs->change_cb) {
+            bs->change_cb(bs->change_opaque, CHANGE_SIZE);
+        }
     }
     return ret;
 }
@@ -1366,7 +1369,8 @@ int bdrv_enable_write_cache(BlockDriverS
 
 /* XXX: no longer used */
 void bdrv_set_change_cb(BlockDriverState *bs,
-                        void (*change_cb)(void *opaque), void *opaque)
+                        void (*change_cb)(void *opaque, int reason),
+                        void *opaque)
 {
     bs->change_cb = change_cb;
     bs->change_opaque = opaque;
@@ -1411,7 +1415,7 @@ int bdrv_set_key(BlockDriverState *bs, c
         /* call the change callback now, we skipped it on open */
         bs->media_changed = 1;
         if (bs->change_cb)
-            bs->change_cb(bs->change_opaque);
+            bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
     }
     return ret;
 }
Index: qemu/block.h
===================================================================
--- qemu.orig/block.h	2011-01-24 11:52:25.248004200 +0100
+++ qemu/block.h	2011-01-24 11:56:39.797004269 +0100
@@ -182,7 +182,8 @@ int bdrv_is_locked(BlockDriverState *bs)
 void bdrv_set_locked(BlockDriverState *bs, int locked);
 int bdrv_eject(BlockDriverState *bs, int eject_flag);
 void bdrv_set_change_cb(BlockDriverState *bs,
-                        void (*change_cb)(void *opaque), void *opaque);
+                        void (*change_cb)(void *opaque, int reason),
+                        void *opaque);
 void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
 BlockDriverState *bdrv_find(const char *name);
 BlockDriverState *bdrv_next(BlockDriverState *bs);
Index: qemu/block_int.h
===================================================================
--- qemu.orig/block_int.h	2011-01-24 11:52:25.255004060 +0100
+++ qemu/block_int.h	2011-01-24 11:56:39.801004059 +0100
@@ -153,7 +153,7 @@ struct BlockDriverState {
     int valid_key; /* if true, a valid encryption key has been set */
     int sg;        /* if true, the device is a /dev/sg* */
     /* event callback when inserting/removing */
-    void (*change_cb)(void *opaque);
+    void (*change_cb)(void *opaque, int reason);
     void *change_opaque;
 
     BlockDriver *drv; /* NULL means no media */
@@ -203,6 +203,9 @@ struct BlockDriverState {
     void *private;
 };
 
+#define CHANGE_MEDIA	0x01
+#define CHANGE_SIZE	0x02
+
 struct BlockDriverAIOCB {
     AIOPool *pool;
     BlockDriverState *bs;
Index: qemu/hw/ide/core.c
===================================================================
--- qemu.orig/hw/ide/core.c	2011-01-24 11:56:20.904004339 +0100
+++ qemu/hw/ide/core.c	2011-01-24 11:56:39.807004199 +0100
@@ -1584,11 +1584,15 @@ static void ide_cfata_metadata_write(IDE
 }
 
 /* called when the inserted state of the media has changed */
-static void cdrom_change_cb(void *opaque)
+static void cdrom_change_cb(void *opaque, int reason)
 {
     IDEState *s = opaque;
     uint64_t nb_sectors;
 
+    if (!(reason & CHANGE_MEDIA)) {
+        return;
+    }
+
     bdrv_get_geometry(s->bs, &nb_sectors);
     s->nb_sectors = nb_sectors;
 
Index: qemu/hw/sd.c
===================================================================
--- qemu.orig/hw/sd.c	2011-01-24 11:52:25.281004130 +0100
+++ qemu/hw/sd.c	2011-01-24 11:56:39.813007971 +0100
@@ -422,9 +422,14 @@ static void sd_reset(SDState *sd, BlockD
     sd->pwd_len = 0;
 }
 
-static void sd_cardchange(void *opaque)
+static void sd_cardchange(void *opaque, int reason)
 {
     SDState *sd = opaque;
+
+    if (!(reason & CHANGE_MEDIA)) {
+        return;
+    }
+
     qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
     if (bdrv_is_inserted(sd->bdrv)) {
         sd_reset(sd, sd->bdrv);

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes
  2011-01-24 12:32 [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Christoph Hellwig
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command Christoph Hellwig
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 2/3] block: tell drivers about an image resize Christoph Hellwig
@ 2011-01-24 12:32 ` Christoph Hellwig
  2011-01-26 10:32 ` [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Kevin Wolf
  2011-01-26 10:49 ` Stefan Hajnoczi
  4 siblings, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-24 12:32 UTC (permalink / raw)
  To: qemu-devel

Raise a config change interrupt when the size changed.  This allows
virtio-blk guest drivers to read-read the information from the
config space once it got the config chaged interrupt.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: qemu/hw/virtio-blk.c
===================================================================
--- qemu.orig/hw/virtio-blk.c	2011-01-20 10:32:50.455032625 +0100
+++ qemu/hw/virtio-blk.c	2011-01-24 11:56:42.833004269 +0100
@@ -504,6 +504,15 @@ static int virtio_blk_load(QEMUFile *f,
     return 0;
 }
 
+static void virtio_blk_change_cb(void *opaque, int reason)
+{
+    VirtIOBlock *s = opaque;
+
+    if (reason & CHANGE_SIZE) {
+        virtio_notify_config(&s->vdev);
+    }
+}
+
 VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf)
 {
     VirtIOBlock *s;
@@ -546,6 +555,7 @@ VirtIODevice *virtio_blk_init(DeviceStat
     register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
                     virtio_blk_save, virtio_blk_load, s);
     bdrv_set_removable(s->bs, 0);
+    bdrv_set_change_cb(s->bs, virtio_blk_change_cb, s);
     s->bs->buffer_alignment = conf->logical_block_size;
 
     add_boot_device_path(conf->bootindex, dev, "/disk@0,0");

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command Christoph Hellwig
@ 2011-01-24 17:44   ` Marcelo Tosatti
  2011-01-25 12:01     ` Kevin Wolf
  0 siblings, 1 reply; 12+ messages in thread
From: Marcelo Tosatti @ 2011-01-24 17:44 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: qemu-devel

On Mon, Jan 24, 2011 at 01:32:33PM +0100, Christoph Hellwig wrote:
> Add a monitor command that allows resizing of block devices while
> qemu is running.  It uses the existing bdrv_truncate method already
> used by qemu-img to do it's work.  Compared to qemu-img the size
> parsing is very simplicistic, but I think having a properly numering
> object is more useful for non-humand monitor users than having
> the units and relative resize parsing.
> 
> For SCSI devices the new size can be updated in Linux guests by
> doing the following shell command:
> 
> 	echo > /sys/class/scsi_device/0:0:0:0/device/rescan
> 
> For ATA devices I don't know of a way to update the block device
> size in Linux system, and for virtio-blk the next two patches
> will provide an automatic update of the size when this command
> is issued on the host.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> Index: qemu/hmp-commands.hx
> ===================================================================
> --- qemu.orig/hmp-commands.hx	2011-01-24 11:55:36.744254374 +0100
> +++ qemu/hmp-commands.hx	2011-01-24 11:56:23.619254094 +0100
> @@ -53,6 +53,25 @@ Quit the emulator.
>  ETEXI
>  
>      {
> +        .name       = "block_resize",
> +        .args_type  = "device:B,size:o",
> +        .params     = "device size",
> +        .help       = "resize a block image",
> +        .user_print = monitor_user_noop,
> +        .mhandler.cmd_new = do_block_resize,
> +    },
> +
> +STEXI
> +@item block_resize
> +@findex block_resize
> +Resize a block image while a guest is running.  Usually requires guest
> +action to see the updated size.  Resize to a lower size is supported,
> +but should be used with extreme caution.  Note that this command only
> +resizes image files, it can not resize block devices like LVM volumes.
> +ETEXI
> +
> +
> +    {
>          .name       = "eject",
>          .args_type  = "force:-f,device:B",
>          .params     = "[-f] device",
> Index: qemu/blockdev.c
> ===================================================================
> --- qemu.orig/blockdev.c	2011-01-24 11:56:20.903004129 +0100
> +++ qemu/blockdev.c	2011-01-24 11:56:38.391254165 +0100
> @@ -705,3 +705,33 @@ int do_drive_del(Monitor *mon, const QDi
>  
>      return 0;
>  }
> +
> +/*
> + * XXX: replace the QERR_UNDEFINED_ERROR errors with real values once the
> + * existing QERR_ macro mess is cleaned up.  A good example for better
> + * error reports can be found in the qemu-img resize code.
> + */
> +int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data)
> +{
> +    const char *device = qdict_get_str(qdict, "device");
> +    int64_t size = qdict_get_int(qdict, "size");
> +    BlockDriverState *bs;
> +
> +    bs = bdrv_find(device);
> +    if (!bs) {
> +        qerror_report(QERR_DEVICE_NOT_FOUND, device);
> +        return -1;
> +    }
> +
> +    if (size < 0) {
> +        qerror_report(QERR_UNDEFINED_ERROR);
> +        return -1;
> +    }
> +
> +    if (bdrv_truncate(bs, size)) {
> +        qerror_report(QERR_UNDEFINED_ERROR);
> +        return -1;
> +    }

Can't resize if block migration is in progress. Don't see a problem 
with simply disallowing resize in that case.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command
  2011-01-24 17:44   ` Marcelo Tosatti
@ 2011-01-25 12:01     ` Kevin Wolf
  2011-01-25 18:05       ` Christoph Hellwig
  0 siblings, 1 reply; 12+ messages in thread
From: Kevin Wolf @ 2011-01-25 12:01 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: Christoph Hellwig, qemu-devel

Am 24.01.2011 18:44, schrieb Marcelo Tosatti:
> On Mon, Jan 24, 2011 at 01:32:33PM +0100, Christoph Hellwig wrote:
>> Add a monitor command that allows resizing of block devices while
>> qemu is running.  It uses the existing bdrv_truncate method already
>> used by qemu-img to do it's work.  Compared to qemu-img the size
>> parsing is very simplicistic, but I think having a properly numering
>> object is more useful for non-humand monitor users than having
>> the units and relative resize parsing.
>>
>> For SCSI devices the new size can be updated in Linux guests by
>> doing the following shell command:
>>
>> 	echo > /sys/class/scsi_device/0:0:0:0/device/rescan
>>
>> For ATA devices I don't know of a way to update the block device
>> size in Linux system, and for virtio-blk the next two patches
>> will provide an automatic update of the size when this command
>> is issued on the host.
>>
>> Signed-off-by: Christoph Hellwig <hch@lst.de>
>>
>> Index: qemu/hmp-commands.hx
>> ===================================================================
>> --- qemu.orig/hmp-commands.hx	2011-01-24 11:55:36.744254374 +0100
>> +++ qemu/hmp-commands.hx	2011-01-24 11:56:23.619254094 +0100
>> @@ -53,6 +53,25 @@ Quit the emulator.
>>  ETEXI
>>  
>>      {
>> +        .name       = "block_resize",
>> +        .args_type  = "device:B,size:o",
>> +        .params     = "device size",
>> +        .help       = "resize a block image",
>> +        .user_print = monitor_user_noop,
>> +        .mhandler.cmd_new = do_block_resize,
>> +    },
>> +
>> +STEXI
>> +@item block_resize
>> +@findex block_resize
>> +Resize a block image while a guest is running.  Usually requires guest
>> +action to see the updated size.  Resize to a lower size is supported,
>> +but should be used with extreme caution.  Note that this command only
>> +resizes image files, it can not resize block devices like LVM volumes.
>> +ETEXI
>> +
>> +
>> +    {
>>          .name       = "eject",
>>          .args_type  = "force:-f,device:B",
>>          .params     = "[-f] device",
>> Index: qemu/blockdev.c
>> ===================================================================
>> --- qemu.orig/blockdev.c	2011-01-24 11:56:20.903004129 +0100
>> +++ qemu/blockdev.c	2011-01-24 11:56:38.391254165 +0100
>> @@ -705,3 +705,33 @@ int do_drive_del(Monitor *mon, const QDi
>>  
>>      return 0;
>>  }
>> +
>> +/*
>> + * XXX: replace the QERR_UNDEFINED_ERROR errors with real values once the
>> + * existing QERR_ macro mess is cleaned up.  A good example for better
>> + * error reports can be found in the qemu-img resize code.
>> + */
>> +int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data)
>> +{
>> +    const char *device = qdict_get_str(qdict, "device");
>> +    int64_t size = qdict_get_int(qdict, "size");
>> +    BlockDriverState *bs;
>> +
>> +    bs = bdrv_find(device);
>> +    if (!bs) {
>> +        qerror_report(QERR_DEVICE_NOT_FOUND, device);
>> +        return -1;
>> +    }
>> +
>> +    if (size < 0) {
>> +        qerror_report(QERR_UNDEFINED_ERROR);
>> +        return -1;
>> +    }
>> +
>> +    if (bdrv_truncate(bs, size)) {
>> +        qerror_report(QERR_UNDEFINED_ERROR);
>> +        return -1;
>> +    }
> 
> Can't resize if block migration is in progress. Don't see a problem 
> with simply disallowing resize in that case.

Then we should add a check to bdrv_truncate.

Kevin

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command
  2011-01-25 12:01     ` Kevin Wolf
@ 2011-01-25 18:05       ` Christoph Hellwig
  2011-01-26 11:56         ` Marcelo Tosatti
  0 siblings, 1 reply; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-25 18:05 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: Marcelo Tosatti, Christoph Hellwig, qemu-devel

On Tue, Jan 25, 2011 at 01:01:04PM +0100, Kevin Wolf wrote:
> > Can't resize if block migration is in progress. Don't see a problem 
> > with simply disallowing resize in that case.
> 
> Then we should add a check to bdrv_truncate.

What check exactly would that be anyway?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices
  2011-01-24 12:32 [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Christoph Hellwig
                   ` (2 preceding siblings ...)
  2011-01-24 12:32 ` [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes Christoph Hellwig
@ 2011-01-26 10:32 ` Kevin Wolf
  2011-01-26 10:49 ` Stefan Hajnoczi
  4 siblings, 0 replies; 12+ messages in thread
From: Kevin Wolf @ 2011-01-26 10:32 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: qemu-devel

Am 24.01.2011 13:32, schrieb Christoph Hellwig:
> This patchset adds support for online resizing of block devices.
> 
> The first patch adds a new resize monitor command which call into
> the existing image resize code.  This is the meat of the series
> and probably needs quite a bit of review and help as I'm not sure
> about how to implement the error handling for monitor commands
> correctly.  Am I really supposed to add a new QERR_ definition
> for each possible error?  And if yes how am I supposed to define
> them?  The macros for them aren't exactly self-explaining.
> 
> The second patch adds a way to tell drivers about a resize, and the
> third one adds a guest notification for config changes to virtio-blk
> which allows the guest to pick it up without a rescan.  I've just sent
> the corresponding Linux guest driver patch to Rusty.
> 
> Changes from version 2 to version 3:
>  - add missing braces
>  - use device as the argument name for the device string
>  - also rename the HMP version of the command to block_resize
> 
> Changes from version 1 to version 2:
>  - also add a QMP command (block_resize)
>  - use the o format for the size in the monitor command
>  - fix typos
>  - use QERR_UNDEFINED_ERROR for errors instead of unstructured strings
>  - remove the CDROM hint check
>  - add a reason argument to the change callback
> ---end quoted text---

Thanks, applied all to the block branch.

Kevin

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices
  2011-01-24 12:32 [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Christoph Hellwig
                   ` (3 preceding siblings ...)
  2011-01-26 10:32 ` [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Kevin Wolf
@ 2011-01-26 10:49 ` Stefan Hajnoczi
  4 siblings, 0 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2011-01-26 10:49 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: qemu-devel

On Mon, Jan 24, 2011 at 12:32 PM, Christoph Hellwig <hch@lst.de> wrote:
> The second patch adds a way to tell drivers about a resize, and the
> third one adds a guest notification for config changes to virtio-blk
> which allows the guest to pick it up without a rescan.  I've just sent
> the corresponding Linux guest driver patch to Rusty.

Did you CC any lists?  I didn't see it on
virtualization@lists.linux-foundation.org.

Stefan

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command
  2011-01-25 18:05       ` Christoph Hellwig
@ 2011-01-26 11:56         ` Marcelo Tosatti
  0 siblings, 0 replies; 12+ messages in thread
From: Marcelo Tosatti @ 2011-01-26 11:56 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Kevin Wolf, qemu-devel

On Tue, Jan 25, 2011 at 07:05:37PM +0100, Christoph Hellwig wrote:
> On Tue, Jan 25, 2011 at 01:01:04PM +0100, Kevin Wolf wrote:
> > > Can't resize if block migration is in progress. Don't see a problem 
> > > with simply disallowing resize in that case.
> > 
> > Then we should add a check to bdrv_truncate.
> 
> What check exactly would that be anyway?

Need to add the information to BlockDriver state. drive_del is also
broken, it can be fixed later. Patch looks good to me.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes
  2011-01-19 17:02 [Qemu-devel] [PATCH 0/3 v2] " Christoph Hellwig
@ 2011-01-19 17:03 ` Christoph Hellwig
  0 siblings, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-19 17:03 UTC (permalink / raw)
  To: qemu-devel

Raise a config change interrupt when the size changed.  This allows
virtio-blk guest drivers to read-read the information from the
config space once it got the config chaged interrupt.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: qemu/hw/virtio-blk.c
===================================================================
--- qemu.orig/hw/virtio-blk.c	2011-01-19 17:47:10.335004828 +0100
+++ qemu/hw/virtio-blk.c	2011-01-19 17:50:10.748272881 +0100
@@ -504,6 +504,15 @@ static int virtio_blk_load(QEMUFile *f,
     return 0;
 }
 
+static void virtio_blk_change_cb(void *opaque, int reason)
+{
+    VirtIOBlock *s = opaque;
+
+    if (reason & CHANGE_SIZE) {
+        virtio_notify_config(&s->vdev);
+    }
+}
+
 VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf)
 {
     VirtIOBlock *s;
@@ -546,6 +555,7 @@ VirtIODevice *virtio_blk_init(DeviceStat
     register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
                     virtio_blk_save, virtio_blk_load, s);
     bdrv_set_removable(s->bs, 0);
+    bdrv_set_change_cb(s->bs, virtio_blk_change_cb, s);
     s->bs->buffer_alignment = conf->logical_block_size;
 
     add_boot_device_path(conf->bootindex, dev, "/disk@0,0");

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes
  2011-01-14 16:20 [Qemu-devel] [PATCH 0/3] allow online resizing of block devices Christoph Hellwig
@ 2011-01-14 16:21 ` Christoph Hellwig
  0 siblings, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2011-01-14 16:21 UTC (permalink / raw)
  To: qemu-devel

Raise a config change interrupt when the size changed.  This allows
virtio-blk guest drivers to read-read the information from the
config space once it got the config chaged interrupt.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: qemu/hw/virtio-blk.c
===================================================================
--- qemu.orig/hw/virtio-blk.c	2011-01-14 17:00:07.468262896 +0100
+++ qemu/hw/virtio-blk.c	2011-01-14 17:07:06.897257239 +0100
@@ -504,6 +504,16 @@ static int virtio_blk_load(QEMUFile *f,
     return 0;
 }
 
+static void virtio_blk_change_cb(void *opaque)
+{
+    VirtIOBlock *s = opaque;
+
+    if (s->bs->size_changed) {
+        virtio_notify_config(&s->vdev);
+        s->bs->size_changed = 0;
+    }
+}
+
 VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf)
 {
     VirtIOBlock *s;
@@ -546,6 +556,7 @@ VirtIODevice *virtio_blk_init(DeviceStat
     register_savevm(dev, "virtio-blk", virtio_blk_id++, 2,
                     virtio_blk_save, virtio_blk_load, s);
     bdrv_set_removable(s->bs, 0);
+    bdrv_set_change_cb(s->bs, virtio_blk_change_cb, s);
     s->bs->buffer_alignment = conf->logical_block_size;
 
     add_boot_device_path(conf->bootindex, dev, "/disk@0,0");

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2011-01-26 12:01 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-24 12:32 [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Christoph Hellwig
2011-01-24 12:32 ` [Qemu-devel] [PATCH 1/3] block: add block_resize monitor command Christoph Hellwig
2011-01-24 17:44   ` Marcelo Tosatti
2011-01-25 12:01     ` Kevin Wolf
2011-01-25 18:05       ` Christoph Hellwig
2011-01-26 11:56         ` Marcelo Tosatti
2011-01-24 12:32 ` [Qemu-devel] [PATCH 2/3] block: tell drivers about an image resize Christoph Hellwig
2011-01-24 12:32 ` [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes Christoph Hellwig
2011-01-26 10:32 ` [Qemu-devel] [PATCH 0/3 v3] allow online resizing of block devices Kevin Wolf
2011-01-26 10:49 ` Stefan Hajnoczi
  -- strict thread matches above, loose matches on Subject: below --
2011-01-19 17:02 [Qemu-devel] [PATCH 0/3 v2] " Christoph Hellwig
2011-01-19 17:03 ` [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes Christoph Hellwig
2011-01-14 16:20 [Qemu-devel] [PATCH 0/3] allow online resizing of block devices Christoph Hellwig
2011-01-14 16:21 ` [Qemu-devel] [PATCH 3/3] virtio-blk: tell the guest about size changes Christoph Hellwig

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.