qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [PATCH v3] block/rbd: increase dynamically the image si


From: Stefano Garzarella
Subject: Re: [Qemu-block] [PATCH v3] block/rbd: increase dynamically the image size
Date: Tue, 25 Jun 2019 12:47:29 +0200

Ping.

Thanks,
Stefano

On Tue, May 21, 2019 at 10:56 AM Stefano Garzarella <address@hidden> wrote:
>
> Kindly ping.
>
> Thanks,
> Stefano
>
> On Thu, May 09, 2019 at 04:59:27PM +0200, Stefano Garzarella wrote:
> > RBD APIs don't allow us to write more than the size set with
> > rbd_create() or rbd_resize().
> > In order to support growing images (eg. qcow2), we resize the
> > image before write operations that exceed the current size.
> >
> > Signed-off-by: Stefano Garzarella <address@hidden>
> > ---
> > v3:
> >   - add 'image_size' field in the BDRVRBDState to keep track of the
> >     current size of the RBD image [Jason, Kevin]
> > ---
> >  block/rbd.c | 42 +++++++++++++++++++++++++++++++++++++++---
> >  1 file changed, 39 insertions(+), 3 deletions(-)
> >
> > diff --git a/block/rbd.c b/block/rbd.c
> > index 0c549c9935..b0355a2ce0 100644
> > --- a/block/rbd.c
> > +++ b/block/rbd.c
> > @@ -102,6 +102,7 @@ typedef struct BDRVRBDState {
> >      rbd_image_t image;
> >      char *image_name;
> >      char *snap;
> > +    uint64_t image_size;
> >  } BDRVRBDState;
> >
> >  static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
> > @@ -777,6 +778,14 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict 
> > *options, int flags,
> >          goto failed_open;
> >      }
> >
> > +    r = rbd_get_size(s->image, &s->image_size);
> > +    if (r < 0) {
> > +        error_setg_errno(errp, -r, "error getting image size from %s",
> > +                         s->image_name);
> > +        rbd_close(s->image);
> > +        goto failed_open;
> > +    }
> > +
> >      /* If we are using an rbd snapshot, we must be r/o, otherwise
> >       * leave as-is */
> >      if (s->snap != NULL) {
> > @@ -833,6 +842,22 @@ static void qemu_rbd_close(BlockDriverState *bs)
> >      rados_shutdown(s->cluster);
> >  }
> >
> > +/* Resize the RBD image and update the 'image_size' with the current size 
> > */
> > +static int qemu_rbd_resize(BlockDriverState *bs, uint64_t size)
> > +{
> > +    BDRVRBDState *s = bs->opaque;
> > +    int r;
> > +
> > +    r = rbd_resize(s->image, size);
> > +    if (r < 0) {
> > +        return r;
> > +    }
> > +
> > +    s->image_size = size;
> > +
> > +    return 0;
> > +}
> > +
> >  static const AIOCBInfo rbd_aiocb_info = {
> >      .aiocb_size = sizeof(RBDAIOCB),
> >  };
> > @@ -934,13 +959,25 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
> >      }
> >
> >      switch (cmd) {
> > -    case RBD_AIO_WRITE:
> > +    case RBD_AIO_WRITE: {
> > +        /*
> > +         * RBD APIs don't allow us to write more than actual size, so in 
> > order
> > +         * to support growing images, we resize the image before write
> > +         * operations that exceed the current size.
> > +         */
> > +        if (off + size > s->image_size) {
> > +            r = qemu_rbd_resize(bs, off + size);
> > +            if (r < 0) {
> > +                goto failed_completion;
> > +            }
> > +        }
> >  #ifdef LIBRBD_SUPPORTS_IOVEC
> >              r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
> >  #else
> >              r = rbd_aio_write(s->image, off, size, rcb->buf, c);
> >  #endif
> >          break;
> > +    }
> >      case RBD_AIO_READ:
> >  #ifdef LIBRBD_SUPPORTS_IOVEC
> >              r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
> > @@ -1051,7 +1088,6 @@ static int coroutine_fn 
> > qemu_rbd_co_truncate(BlockDriverState *bs,
> >                                               PreallocMode prealloc,
> >                                               Error **errp)
> >  {
> > -    BDRVRBDState *s = bs->opaque;
> >      int r;
> >
> >      if (prealloc != PREALLOC_MODE_OFF) {
> > @@ -1060,7 +1096,7 @@ static int coroutine_fn 
> > qemu_rbd_co_truncate(BlockDriverState *bs,
> >          return -ENOTSUP;
> >      }
> >
> > -    r = rbd_resize(s->image, offset);
> > +    r = qemu_rbd_resize(bs, offset);
> >      if (r < 0) {
> >          error_setg_errno(errp, -r, "Failed to resize file");
> >          return r;
> > --
> > 2.20.1
> >
> >
>
> --
>
> Stefano Garzarella
> Software Engineer @ Red Hat



-- 
Stefano Garzarella
Software Engineer, Virt Team
Red Hat



reply via email to

[Prev in Thread] Current Thread [Next in Thread]