[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 18/18] block/nfs: fix mutex assertion in nfs_file_clo
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PULL 18/18] block/nfs: fix mutex assertion in nfs_file_close() |
Date: |
Tue, 8 Aug 2017 15:58:38 +0200 |
From: Jeff Cody <address@hidden>
Commit c096358e747e88fc7364e40e3c354ee0bb683960 introduced assertion
checks for when qemu_mutex() functions are called without the
corresponding qemu_mutex_init() having initialized the mutex.
This uncovered a latent bug in qemu's nfs driver - in
nfs_client_close(), the NFSClient structure is overwritten with zeros,
prior to the mutex being destroyed.
Go ahead and destroy the mutex in nfs_client_close(), and change where
we call qemu_mutex_init() so that it is correctly balanced.
There are also a couple of memory leaks obscured by the memset, so this
fixes those as well.
Finally, we should be able to get rid of the memset(), as it isn't
necessary.
Cc: address@hidden
Signed-off-by: Jeff Cody <address@hidden>
Reviewed-by: Peter Lieven <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: John Snow <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/nfs.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/block/nfs.c b/block/nfs.c
index d8db419957..bec16b72a6 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -433,19 +433,23 @@ static void nfs_client_close(NFSClient *client)
if (client->context) {
if (client->fh) {
nfs_close(client->context, client->fh);
+ client->fh = NULL;
}
aio_set_fd_handler(client->aio_context, nfs_get_fd(client->context),
false, NULL, NULL, NULL, NULL);
nfs_destroy_context(client->context);
+ client->context = NULL;
}
- memset(client, 0, sizeof(NFSClient));
+ g_free(client->path);
+ qemu_mutex_destroy(&client->mutex);
+ qapi_free_NFSServer(client->server);
+ client->server = NULL;
}
static void nfs_file_close(BlockDriverState *bs)
{
NFSClient *client = bs->opaque;
nfs_client_close(client);
- qemu_mutex_destroy(&client->mutex);
}
static NFSServer *nfs_config(QDict *options, Error **errp)
@@ -498,6 +502,7 @@ static int64_t nfs_client_open(NFSClient *client, QDict
*options,
struct stat st;
char *file = NULL, *strp = NULL;
+ qemu_mutex_init(&client->mutex);
opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
qemu_opts_absorb_qdict(opts, options, &local_err);
if (local_err) {
@@ -660,7 +665,7 @@ static int nfs_file_open(BlockDriverState *bs, QDict
*options, int flags,
if (ret < 0) {
return ret;
}
- qemu_mutex_init(&client->mutex);
+
bs->total_sectors = ret;
ret = 0;
return ret;
--
2.13.4
- [Qemu-block] [PULL 08/18] block/null: Remove 'filename' option, (continued)
- [Qemu-block] [PULL 08/18] block/null: Remove 'filename' option, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 09/18] vmdk: Fix error handling/reporting of vmdk_check, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 07/18] block: drop bdrv_set_key from BlockDriver, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 10/18] block: respect error code from bdrv_getlength in handle_aiocb_write_zeroes, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 11/18] parallels: respect error code of bdrv_getlength() in allocate_clusters(), Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 12/18] parallels: drop check that bdrv_truncate() is working, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 13/18] block: Fix order in bdrv_replace_child(), Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 14/18] block: Allow reopen rw without BDRV_O_ALLOW_RDWR, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 16/18] qemu-io: Allow reopen read-write, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 15/18] block: Set BDRV_O_ALLOW_RDWR during rw reopen, Kevin Wolf, 2017/08/08
- [Qemu-block] [PULL 18/18] block/nfs: fix mutex assertion in nfs_file_close(),
Kevin Wolf <=
- [Qemu-block] [PULL 17/18] qemu-iotests: Test reopen between read-only and read-write, Kevin Wolf, 2017/08/08
- Re: [Qemu-block] [PULL 00/18] Block layer patches for 2.10.0-rc2, Peter Maydell, 2017/08/08