nbd patches for 2020-02-26

- ensure multiple meta contexts work
 - allow leading / in export names
 - fix a failure path memory leak
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCAAdFiEEccLMIrHEYCkn0vOqp6FrSiUnQ2oFAl5XIP8ACgkQp6FrSiUn
 Q2qgWQf/avHGRCHHkvOQ6UIgwtp4FSQ8u2MVYOq9FGjeg2xOEYND1aZtGGQB5+4/
 ZntVtMFNLz2pbyx61Wtg1bcczujC5p9pEZ+DtgQ9x+2fqCVaaGYwrXy/zgP2eoUI
 L8F0YOTJRGmPKDCVOwLNnuISSvwnI/QWK8iCE15HtBx1eEaWovO3gRAAvPlvVVZd
 YR7ZNTWueltx7oQf56YGj3tPrNXfDz8eU7ZmBtAs7cO6V8ZJI8mVIZQ7LvsBFUT9
 aW674jV8UEorDFiZjWYRMI8hq/YKjU2GvoHoMb4cLdpXc9PdymC1gXxlV5vHaQqo
 EGaZlSUFRJmq/ao6pzJsmgZBrX/iPw==
 =sv4e
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2020-02-26' into staging

nbd patches for 2020-02-26

- ensure multiple meta contexts work
- allow leading / in export names
- fix a failure path memory leak

# gpg: Signature made Thu 27 Feb 2020 01:53:03 GMT
# gpg:                using RSA key 71C2CC22B1C4602927D2F3AAA7A16B4A2527436A
# gpg: Good signature from "Eric Blake <eblake@redhat.com>" [full]
# gpg:                 aka "Eric Blake (Free Software Programmer) <ebb9@byu.net>" [full]
# gpg:                 aka "[jpeg image of size 6874]" [full]
# Primary key fingerprint: 71C2 CC22 B1C4 6029 27D2  F3AA A7A1 6B4A 2527 436A

* remotes/ericb/tags/pull-nbd-2020-02-26:
  block/nbd: fix memory leak in nbd_open()
  block/nbd: extract the common cleanup code
  nbd-client: Support leading / in NBD URI
  nbd: Fix regression with multiple meta contexts

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-02-27 18:16:03 +00:00
commit a7cfd219d5
2 changed files with 30 additions and 15 deletions

View File

@ -95,6 +95,19 @@ typedef struct BDRVNBDState {
static int nbd_client_connect(BlockDriverState *bs, Error **errp); static int nbd_client_connect(BlockDriverState *bs, Error **errp);
static void nbd_clear_bdrvstate(BDRVNBDState *s)
{
object_unref(OBJECT(s->tlscreds));
qapi_free_SocketAddress(s->saddr);
s->saddr = NULL;
g_free(s->export);
s->export = NULL;
g_free(s->tlscredsid);
s->tlscredsid = NULL;
g_free(s->x_dirty_bitmap);
s->x_dirty_bitmap = NULL;
}
static void nbd_channel_error(BDRVNBDState *s, int ret) static void nbd_channel_error(BDRVNBDState *s, int ret)
{ {
if (ret == -EIO) { if (ret == -EIO) {
@ -1528,8 +1541,10 @@ static int nbd_parse_uri(const char *filename, QDict *options)
goto out; goto out;
} }
p = uri->path ? uri->path : "/"; p = uri->path ? uri->path : "";
p += strspn(p, "/"); if (p[0] == '/') {
p++;
}
if (p[0]) { if (p[0]) {
qdict_put_str(options, "export", p); qdict_put_str(options, "export", p);
} }
@ -1877,11 +1892,7 @@ static int nbd_process_options(BlockDriverState *bs, QDict *options,
error: error:
if (ret < 0) { if (ret < 0) {
object_unref(OBJECT(s->tlscreds)); nbd_clear_bdrvstate(s);
qapi_free_SocketAddress(s->saddr);
g_free(s->export);
g_free(s->tlscredsid);
g_free(s->x_dirty_bitmap);
} }
qemu_opts_del(opts); qemu_opts_del(opts);
return ret; return ret;
@ -1904,6 +1915,7 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
ret = nbd_client_connect(bs, errp); ret = nbd_client_connect(bs, errp);
if (ret < 0) { if (ret < 0) {
nbd_clear_bdrvstate(s);
return ret; return ret;
} }
/* successfully connected */ /* successfully connected */
@ -1960,12 +1972,7 @@ static void nbd_close(BlockDriverState *bs)
BDRVNBDState *s = bs->opaque; BDRVNBDState *s = bs->opaque;
nbd_client_close(bs); nbd_client_close(bs);
nbd_clear_bdrvstate(s);
object_unref(OBJECT(s->tlscreds));
qapi_free_SocketAddress(s->saddr);
g_free(s->export);
g_free(s->tlscredsid);
g_free(s->x_dirty_bitmap);
} }
static int64_t nbd_getlength(BlockDriverState *bs) static int64_t nbd_getlength(BlockDriverState *bs)

View File

@ -2384,15 +2384,23 @@ static coroutine_fn int nbd_handle_request(NBDClient *client,
!client->export_meta.bitmap, !client->export_meta.bitmap,
NBD_META_ID_BASE_ALLOCATION, NBD_META_ID_BASE_ALLOCATION,
errp); errp);
} else { /* client->export_meta.bitmap */ if (ret < 0) {
return ret;
}
}
if (client->export_meta.bitmap) {
ret = nbd_co_send_bitmap(client, request->handle, ret = nbd_co_send_bitmap(client, request->handle,
client->exp->export_bitmap, client->exp->export_bitmap,
request->from, request->len, request->from, request->len,
dont_fragment, dont_fragment,
true, NBD_META_ID_DIRTY_BITMAP, errp); true, NBD_META_ID_DIRTY_BITMAP, errp);
if (ret < 0) {
return ret;
}
} }
return ret; return 0;
} else { } else {
return nbd_send_generic_reply(client, request->handle, -EINVAL, return nbd_send_generic_reply(client, request->handle, -EINVAL,
"CMD_BLOCK_STATUS not negotiated", "CMD_BLOCK_STATUS not negotiated",