From: Hanna Czenczek <[email protected]> nvme_compare() starts block accounting for the operation, but nvme_compare_data_cb() (and nvme_compare_mdata_cb()) do not always finalize the cookie. Specifically, there are a lot of error paths that do not call block_acct_failed().
Fix this by putting block_acct_done()/block_acct_failed() under the `out` labels of nvme_compare_data_cb() and nvme_compare_mdata_cb(). Signed-off-by: Hanna Czenczek <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Reviewed-by: Klaus Jensen <[email protected]> Reviewed-by: Michael S. Tsirkin <[email protected]> Reviewed-by: Stefan Hajnoczi <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Message-ID: <[email protected]> --- hw/nvme/ctrl.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index c56725947a..7478f0b33a 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -2389,7 +2389,6 @@ static void nvme_compare_mdata_cb(void *opaque, int ret) trace_pci_nvme_compare_mdata_cb(nvme_cid(req)); if (ret) { - block_acct_failed(stats, acct); req->status = NVME_UNRECOVERED_READ; trace_pci_nvme_err_aio(nvme_cid(req), strerror(-ret), req->status); @@ -2444,9 +2443,14 @@ static void nvme_compare_mdata_cb(void *opaque, int ret) goto out; } - block_acct_done(stats, acct); out: + if (req->status == NVME_SUCCESS) { + block_acct_done(stats, acct); + } else { + block_acct_failed(stats, acct); + } + qemu_iovec_destroy(&ctx->data.iov); g_free(ctx->data.bounce); @@ -2474,7 +2478,6 @@ static void nvme_compare_data_cb(void *opaque, int ret) trace_pci_nvme_compare_data_cb(nvme_cid(req)); if (ret) { - block_acct_failed(stats, acct); req->status = NVME_UNRECOVERED_READ; trace_pci_nvme_err_aio(nvme_cid(req), strerror(-ret), req->status); @@ -2513,9 +2516,13 @@ static void nvme_compare_data_cb(void *opaque, int ret) return; } - block_acct_done(stats, acct); - out: + if (req->status == NVME_SUCCESS) { + block_acct_done(stats, acct); + } else { + block_acct_failed(stats, acct); + } + qemu_iovec_destroy(&ctx->data.iov); g_free(ctx->data.bounce); g_free(ctx); -- MST
