[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] block/rbd: workaround for ceph issue #53784
From: |
Peter Lieven |
Subject: |
[PATCH 2/2] block/rbd: workaround for ceph issue #53784 |
Date: |
Mon, 10 Jan 2022 12:41:54 +0100 |
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;
}
--
2.25.1
- [PATCH 0/2] block/rbd: fixes for bdrv_co_block_status, Peter Lieven, 2022/01/10
- [PATCH 2/2] block/rbd: workaround for ceph issue #53784,
Peter Lieven <=
- Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784, Ilya Dryomov, 2022/01/12
- Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784, Peter Lieven, 2022/01/12
- Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784, Ilya Dryomov, 2022/01/12
- Message not available
- Message not available
- Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784, Peter Lieven, 2022/01/12
- Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784, Ilya Dryomov, 2022/01/12
- Re: [PATCH 2/2] block/rbd: workaround for ceph issue #53784, Peter Lieven, 2022/01/12
[PATCH 1/2] block/rbd: fix handling of holes in .bdrv_co_block_status, Peter Lieven, 2022/01/10