[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);
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-block] [PATCH 08/25] nbd: Handle blk_getlength() failure,
Paolo Bonzini <=