qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [PATCH 08/25] nbd: Handle blk_getlength() failure


From: Paolo Bonzini
Subject: Re: [Qemu-block] [PATCH 08/25] nbd: Handle blk_getlength() failure
Date: Wed, 11 Mar 2015 12:26:38 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0


On 25/02/2015 19:08, Max Reitz wrote:
> Signed-off-by: Max Reitz <address@hidden>
> ---
>  blockdev-nbd.c      |  6 +++++-
>  include/block/nbd.h |  3 ++-
>  nbd.c               | 19 ++++++++++++++++---
>  qemu-nbd.c          | 10 +++++++++-
>  4 files changed, 32 insertions(+), 6 deletions(-)
> 
> diff --git a/blockdev-nbd.c b/blockdev-nbd.c
> index eb5f9a0..46482a8 100644
> --- a/blockdev-nbd.c
> +++ b/blockdev-nbd.c
> @@ -80,7 +80,11 @@ void qmp_nbd_server_add(const char *device, bool 
> has_writable, bool writable,
>          writable = false;
>      }
>  
> -    exp = nbd_export_new(blk, 0, -1, writable ? 0 : NBD_FLAG_READ_ONLY, 
> NULL);
> +    exp = nbd_export_new(blk, 0, -1, writable ? 0 : NBD_FLAG_READ_ONLY, NULL,
> +                         errp);
> +    if (!exp) {
> +        return;
> +    }
>  
>      nbd_export_set_name(exp, device);
>  }
> diff --git a/include/block/nbd.h b/include/block/nbd.h
> index ca9a5ac..2c20138 100644
> --- a/include/block/nbd.h
> +++ b/include/block/nbd.h
> @@ -86,7 +86,8 @@ typedef struct NBDExport NBDExport;
>  typedef struct NBDClient NBDClient;
>  
>  NBDExport *nbd_export_new(BlockBackend *blk, off_t dev_offset, off_t size,
> -                          uint32_t nbdflags, void (*close)(NBDExport *));
> +                          uint32_t nbdflags, void (*close)(NBDExport *),
> +                          Error **errp);
>  void nbd_export_close(NBDExport *exp);
>  void nbd_export_get(NBDExport *exp);
>  void nbd_export_put(NBDExport *exp);
> diff --git a/nbd.c b/nbd.c
> index ad0948b..ddc2bd8 100644
> --- a/nbd.c
> +++ b/nbd.c
> @@ -986,21 +986,30 @@ static void nbd_eject_notifier(Notifier *n, void *data)
>  }
>  
>  NBDExport *nbd_export_new(BlockBackend *blk, off_t dev_offset, off_t size,
> -                          uint32_t nbdflags, void (*close)(NBDExport *))
> +                          uint32_t nbdflags, void (*close)(NBDExport *),
> +                          Error **errp)
>  {
> -    NBDEjectNotifier *n = g_new0(NBDEjectNotifier, 1);
> +    NBDEjectNotifier *n;

This hunk doesn't apply yet, but I've fixed it up.

Paolo

>      NBDExport *exp = g_malloc0(sizeof(NBDExport));
>      exp->refcount = 1;
>      QTAILQ_INIT(&exp->clients);
>      exp->blk = blk;
>      exp->dev_offset = dev_offset;
>      exp->nbdflags = nbdflags;
> -    exp->size = size == -1 ? blk_getlength(blk) : size;
> +    exp->size = size < 0 ? blk_getlength(blk) : size;
> +    if (exp->size < 0) {
> +        error_setg_errno(errp, -exp->size,
> +                         "Failed to determine the NBD export's length");
> +        goto fail;
> +    }
> +    exp->size -= exp->size % BDRV_SECTOR_SIZE;
> +
>      exp->close = close;
>      exp->ctx = blk_get_aio_context(blk);
>      blk_ref(blk);
>      blk_add_aio_context_notifier(blk, blk_aio_attached, blk_aio_detach, exp);
>  
> +    n = g_new0(NBDEjectNotifier, 1);
>      n->n.notify = nbd_eject_notifier;
>      n->exp = exp;
>      QTAILQ_INSERT_TAIL(&eject_notifiers, n, next);
> @@ -1014,6 +1023,10 @@ NBDExport *nbd_export_new(BlockBackend *blk, off_t 
> dev_offset, off_t size,
>       */
>      blk_invalidate_cache(blk, NULL);
>      return exp;
> +
> +fail:
> +    g_free(exp);
> +    return NULL;
>  }
>  
>  NBDExport *nbd_export_find(const char *name)
> diff --git a/qemu-nbd.c b/qemu-nbd.c
> index cfdc4dc..9b9d40d 100644
> --- a/qemu-nbd.c
> +++ b/qemu-nbd.c
> @@ -721,6 +721,10 @@ int main(int argc, char **argv)
>  
>      bs->detect_zeroes = detect_zeroes;
>      fd_size = blk_getlength(blk);
> +    if (fd_size < 0) {
> +        errx(EXIT_FAILURE, "Failed to determine the image length: %s",
> +             strerror(-fd_size));
> +    }
>  
>      if (partition != -1) {
>          ret = find_partition(blk, partition, &dev_offset, &fd_size);
> @@ -730,7 +734,11 @@ int main(int argc, char **argv)
>          }
>      }
>  
> -    exp = nbd_export_new(blk, dev_offset, fd_size, nbdflags, 
> nbd_export_closed);
> +    exp = nbd_export_new(blk, dev_offset, fd_size, nbdflags, 
> nbd_export_closed,
> +                         &local_err);
> +    if (!exp) {
> +        errx(EXIT_FAILURE, "%s", error_get_pretty(local_err));
> +    }
>  
>      if (sockpath) {
>          fd = unix_socket_incoming(sockpath);
> 




reply via email to

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