mirror of
https://github.com/qemu/qemu.git
synced 2024-11-23 19:03:38 +08:00
nbd: Handle blk_getlength() failure
Signed-off-by: Max Reitz <mreitz@redhat.com> Message-Id: <1424887718-10800-9-git-send-email-mreitz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
892f5a5270
commit
98f44bbe70
@ -105,7 +105,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);
|
||||
|
||||
|
@ -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);
|
||||
|
16
nbd.c
16
nbd.c
@ -966,7 +966,8 @@ static void blk_aio_detach(void *opaque)
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
NBDExport *exp = g_malloc0(sizeof(NBDExport));
|
||||
exp->refcount = 1;
|
||||
@ -974,7 +975,14 @@ NBDExport *nbd_export_new(BlockBackend *blk, off_t dev_offset, off_t size,
|
||||
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);
|
||||
@ -986,6 +994,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)
|
||||
|
10
qemu-nbd.c
10
qemu-nbd.c
@ -717,6 +717,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);
|
||||
@ -726,7 +730,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);
|
||||
|
Loading…
Reference in New Issue
Block a user