[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel][PATCH]: Support dynamic resizing of vbds / print additional information patch



On Wed, Jul 28, 2010 at 12:59:56PM -0600, Ky Srinivasan wrote:
> Pasi,
> 
> I am attaching a patch that prints additional information when a vbd is 
> resized. Note that on the domu side, the generic block layer already prints 
> information on the device that is being resized.
> 
> Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
> 

Thanks.

Jeremy: Please merge this patch.

-- Pasi

> 
> >>> On 7/20/2010 at  3:06 PM, in message 
> >>> <20100720190656.GT17817@xxxxxxxxxxx>, Pasi
> Kärkkäinen<pasik@xxxxxx> wrote: 
> > 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", &sectors);
> >> +          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
> 

> Subject: Print additional information when a vbd is resized.
> 
> Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
> 
> 
> Index: linux/drivers/xen/blkback/vbd.c
> ===================================================================
> --- linux.orig/drivers/xen/blkback/vbd.c      2010-05-20 04:07:00.000000000 
> -0600
> +++ linux/drivers/xen/blkback/vbd.c   2010-07-28 11:26:06.000000000 -0600
> @@ -130,6 +130,8 @@ void vbd_resize(blkif_t *blkif)
>       struct xenbus_device *dev = blkif->be->dev;
>       unsigned long long new_size = vbd_size(vbd);
>  
> +     printk(KERN_INFO "VBD Resize: Domid: %d, Device: (%d, %d)\n",
> +             blkif->domid, MAJOR(vbd->pdevice), MINOR(vbd->pdevice));
>       printk(KERN_INFO "VBD Resize: new size %Lu\n", new_size);
>       vbd->size = new_size;
>  again:
> Index: linux/drivers/xen/blkfront/blkfront.c
> ===================================================================
> --- linux.orig/drivers/xen/blkfront/blkfront.c        2010-05-20 
> 04:07:00.000000000 -0600
> +++ linux/drivers/xen/blkfront/blkfront.c     2010-07-28 12:10:26.000000000 
> -0600
> @@ -340,7 +340,7 @@ static void connect(struct blkfront_info
>                                  "sectors", "%Lu", &sectors);
>               if (XENBUS_EXIST_ERR(err))
>                       return;
> -             printk(KERN_INFO "Setting capacity to %Lu\n",
> +             printk(KERN_INFO "Changing capacity to %Lu sectors\n",
>                      sectors);
>               set_capacity(info->gd, sectors);
>               revalidate_disk(info->gd);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.