qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784


From: Stefano Garzarella
Subject: Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784
Date: Mon, 10 Jan 2022 15:18:54 +0100

On Mon, Jan 10, 2022 at 12:41:54PM +0100, Peter Lieven wrote:
librbd had a bug until early 2022 that affected all versions of ceph that
supported fast-diff. This bug results in reporting of incorrect offsets
if the offset parameter to rbd_diff_iterate2 is not object aligned.
Work around this bug by rounding down the offset to object boundaries.

Fixes: https://tracker.ceph.com/issues/53784
Cc: qemu-stable@nongnu.org
Signed-off-by: Peter Lieven <pl@kamp.de>
---
block/rbd.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/block/rbd.c b/block/rbd.c
index 5e9dc91d81..260cb9f4b4 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -1333,6 +1333,7 @@ static int coroutine_fn 
qemu_rbd_co_block_status(BlockDriverState *bs,
    int status, r;
    RBDDiffIterateReq req = { .offs = offset };
    uint64_t features, flags;
+    int64_t head;

    assert(offset + bytes <= s->image_size);

@@ -1360,6 +1361,19 @@ static int coroutine_fn 
qemu_rbd_co_block_status(BlockDriverState *bs,
        return status;
    }

+    /*
+     * librbd had a bug until early 2022 that affected all versions of ceph 
that
+     * supported fast-diff. This bug results in reporting of incorrect offsets
+     * if the offset parameter to rbd_diff_iterate2 is not object aligned.
+     * Work around this bug by rounding down the offset to object boundaries.
+     *
+     * See: https://tracker.ceph.com/issues/53784
+     */
+    head = offset & (s->object_size - 1);
+    offset -= head;
+    req.offs -= head;
+    bytes += head;
+
    r = rbd_diff_iterate2(s->image, NULL, offset, bytes, true, true,
                          qemu_rbd_diff_iterate_cb, &req);
    if (r < 0 && r != QEMU_RBD_EXIT_DIFF_ITERATE2) {
@@ -1379,7 +1393,8 @@ static int coroutine_fn 
qemu_rbd_co_block_status(BlockDriverState *bs,
        status = BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID;
    }

-    *pnum = req.bytes;
+    assert(req.bytes > head);
+    *pnum = req.bytes - head;
    return status;
}

Thanks for the workaround!

I just tested this patch for the issue reported in this BZ [1] and the test now works correctly!

Tested-by: Stefano Garzarella <sgarzare@redhat.com>

[1] https://bugzilla.redhat.com/show_bug.cgi?id=2034791




reply via email to

[Prev in Thread] Current Thread [Next in Thread]