Commit 2178a569 authored by Eric Blake's avatar Eric Blake
Browse files

nbd/server: Fix blockstatus trace



Don't increment remaining_bytes until we know that we will actually be
including the current block status extent in the reply; otherwise, the
value traced will include a bytes value that is oversized by the
length of the next block status extent which did not get sent because
it instead ended the loop.

Fixes: fb7afc79
Signed-off-by: default avatarEric Blake <eblake@redhat.com>
Message-Id: <20190403030526.12258-2-eblake@redhat.com>
Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
parent 2c573106
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -1880,17 +1880,12 @@ static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset,

        flags = (ret & BDRV_BLOCK_ALLOCATED ? 0 : NBD_STATE_HOLE) |
                (ret & BDRV_BLOCK_ZERO      ? NBD_STATE_ZERO : 0);
        offset += num;
        remaining_bytes -= num;

        if (first_extent) {
            extent->flags = flags;
            extent->length = num;
            first_extent = false;
            continue;
        }

        if (flags == extent->flags) {
        } else if (flags == extent->flags) {
            /* extend current extent */
            extent->length += num;
        } else {
@@ -1903,6 +1898,8 @@ static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset,
            extent->flags = flags;
            extent->length = num;
        }
        offset += num;
        remaining_bytes -= num;
    }

    extents_end = extent + 1;