On Tue, Jul 20, 2010 at 09:00:39PM +0200, J. Roeleveld wrote:
> > >
> > > Hmm.. I don't seem to be able to find them.
> > > Care to send them again?
> > >
> > > -- Pasi
> >
> > I will dig this up and send it out.
> >
> > Regards,
> >
> > K. Y
> >
>
>
> found this in my archives:
>
Thanks, but unfortunately this is not the patch that adds useful
status/resize information printing..
The patch you attached is already merged into Jeremy's xen.git kernel trees.
-- Pasi
>
> The attached patch supports dynamic resizing of vbds. This patch fixes a bug
> in
> the previous version of this patch that was sent out. With this patch you can
> perform "online" resizing of file systems that support online resizing.
>
> Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
> Subject: Propagate changed size of VBDs
> References: bnc#583677
> Patch-mainline: n/a
>
> Support dynamic resizing of virtual block devices. This patch supports
> both file backed block devices as well as physical devices that can be
> dynamically resized on the host side.
>
> Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
>
> Index: linux/drivers/xen/blkback/blkback.c
> ===================================================================
> --- linux.orig/drivers/xen/blkback/blkback.c 2010-03-18 14:17:28.000000000
> -0600
> +++ linux/drivers/xen/blkback/blkback.c 2010-03-18 14:17:33.000000000
> -0600
> @@ -209,6 +209,7 @@ static void print_stats(blkif_t *blkif)
> int blkif_schedule(void *arg)
> {
> blkif_t *blkif = arg;
> + struct vbd *vbd = &blkif->vbd;
>
> blkif_get(blkif);
>
> @@ -218,6 +219,8 @@ int blkif_schedule(void *arg)
> while (!kthread_should_stop()) {
> if (try_to_freeze())
> continue;
> + if (unlikely(vbd->size != vbd_size(vbd)))
> + vbd_resize(blkif);
>
> wait_event_interruptible(
> blkif->wq,
> Index: linux/drivers/xen/blkback/vbd.c
> ===================================================================
> --- linux.orig/drivers/xen/blkback/vbd.c 2010-03-18 14:17:28.000000000
> -0600
> +++ linux/drivers/xen/blkback/vbd.c 2010-03-18 14:17:33.000000000 -0600
> @@ -73,6 +73,7 @@ int vbd_create(blkif_t *blkif, blkif_vde
> }
>
> vbd->bdev = bdev;
> + vbd->size = vbd_size(vbd);
>
> if (vbd->bdev->bd_disk == NULL) {
> DPRINTK("vbd_creat: device %08x doesn't exist.\n",
> @@ -120,3 +121,45 @@ int vbd_translate(struct phys_req *req,
> out:
> return rc;
> }
> +
> +void vbd_resize(blkif_t *blkif)
> +{
> + struct vbd *vbd = &blkif->vbd;
> + struct xenbus_transaction xbt;
> + int err;
> + struct xenbus_device *dev = blkif->be->dev;
> + unsigned long long new_size = vbd_size(vbd);
> +
> + printk(KERN_INFO "VBD Resize: new size %Lu\n", new_size);
> + vbd->size = new_size;
> +again:
> + err = xenbus_transaction_start(&xbt);
> + if (err) {
> + printk(KERN_WARNING "Error starting transaction");
> + return;
> + }
> + err = xenbus_printf(xbt, dev->nodename, "sectors", "%Lu",
> + vbd_size(vbd));
> + if (err) {
> + printk(KERN_WARNING "Error writing new size");
> + goto abort;
> + }
> + /*
> + * Write the current state; we will use this to synchronize
> + * the front-end. If the current state is "connected" the
> + * front-end will get the new size information online.
> + */
> + err = xenbus_printf(xbt, dev->nodename, "state", "%d", dev->state);
> + if (err) {
> + printk(KERN_WARNING "Error writing the state");
> + goto abort;
> + }
> +
> + err = xenbus_transaction_end(xbt, 0);
> + if (err == -EAGAIN)
> + goto again;
> + if (err)
> + printk(KERN_WARNING "Error ending transaction");
> +abort:
> + xenbus_transaction_end(xbt, 1);
> +}
> Index: linux/drivers/xen/blkback/common.h
> ===================================================================
> --- linux.orig/drivers/xen/blkback/common.h 2010-03-18 14:17:28.000000000
> -0600
> +++ linux/drivers/xen/blkback/common.h 2010-03-18 14:17:33.000000000
> -0600
> @@ -56,6 +56,7 @@ struct vbd {
> unsigned char type; /* VDISK_xxx */
> u32 pdevice; /* phys device that this vbd maps to */
> struct block_device *bdev;
> + sector_t size; /* Cached size parameter */
> };
>
> struct backend_info;
> @@ -116,6 +117,7 @@ blkif_t *blkif_alloc(domid_t domid);
> void blkif_disconnect(blkif_t *blkif);
> void blkif_free(blkif_t *blkif);
> int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int
> evtchn);
> +void vbd_resize(blkif_t *blkif);
>
> #define blkif_get(_b) (atomic_inc(&(_b)->refcnt))
> #define blkif_put(_b) \
> Index: linux/drivers/xen/blkfront/blkfront.c
> ===================================================================
> --- linux.orig/drivers/xen/blkfront/blkfront.c 2010-03-18
> 14:17:28.000000000 -0600
> +++ linux/drivers/xen/blkfront/blkfront.c 2010-03-18 14:17:33.000000000
> -0600
> @@ -328,9 +328,25 @@ static void connect(struct blkfront_info
> unsigned int binfo;
> int err;
>
> - if ((info->connected == BLKIF_STATE_CONNECTED) ||
> - (info->connected == BLKIF_STATE_SUSPENDED) )
> + switch (info->connected) {
> + case BLKIF_STATE_CONNECTED:
> + /*
> + * Potentially, the back-end may be signalling
> + * a capacity change; update the capacity.
> + */
> + err = xenbus_scanf(XBT_NIL, info->xbdev->otherend,
> + "sectors", "%Lu", §ors);
> + if (XENBUS_EXIST_ERR(err))
> + return;
> + printk(KERN_INFO "Setting capacity to %Lu\n",
> + sectors);
> + set_capacity(info->gd, sectors);
> + revalidate_disk(info->gd);
> +
> + /* fall through */
> + case BLKIF_STATE_SUSPENDED:
> return;
> + }
>
> DPRINTK("blkfront.c:connect:%s.\n", info->xbdev->otherend);
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|