[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv3 08/20] block: honour BlockLimits in bdrv_co_discar
From: |
Peter Lieven |
Subject: |
[Qemu-devel] [PATCHv3 08/20] block: honour BlockLimits in bdrv_co_discard |
Date: |
Tue, 24 Sep 2013 15:35:02 +0200 |
Signed-off-by: Peter Lieven <address@hidden>
---
block.c | 37 ++++++++++++++++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
diff --git a/block.c b/block.c
index 580570a..784e545 100644
--- a/block.c
+++ b/block.c
@@ -4224,6 +4224,11 @@ static void coroutine_fn bdrv_discard_co_entry(void
*opaque)
rwco->ret = bdrv_co_discard(rwco->bs, rwco->sector_num, rwco->nb_sectors);
}
+/* if no limit is specified in the BlockLimits use a default
+ * of 32768 512-byte sectors (16 MiB) per request.
+ */
+#define MAX_DISCARD_DEFAULT 32768
+
int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
int nb_sectors)
{
@@ -4245,7 +4250,37 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs,
int64_t sector_num,
}
if (bs->drv->bdrv_co_discard) {
- return bs->drv->bdrv_co_discard(bs, sector_num, nb_sectors);
+ int max_discard = bs->bl.max_discard ?
+ bs->bl.max_discard : MAX_DISCARD_DEFAULT;
+
+ while (nb_sectors > 0) {
+ int ret;
+ int num = nb_sectors;
+
+ /* align request */
+ if (bs->bl.discard_alignment &&
+ num >= bs->bl.discard_alignment &&
+ sector_num % bs->bl.discard_alignment) {
+ if (num > bs->bl.discard_alignment) {
+ num = bs->bl.discard_alignment;
+ }
+ num -= sector_num % bs->bl.discard_alignment;
+ }
+
+ /* limit request size */
+ if (num > max_discard) {
+ num = max_discard;
+ }
+
+ ret = bs->drv->bdrv_co_discard(bs, sector_num, num);
+ if (ret) {
+ return ret;
+ }
+
+ sector_num += num;
+ nb_sectors -= num;
+ }
+ return 0;
} else if (bs->drv->bdrv_aio_discard) {
BlockDriverAIOCB *acb;
CoroutineIOCompletion co = {
--
1.7.9.5
- [Qemu-devel] [PATCHv3 00/20] block: logical block provisioning enhancements, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 04/20] block: introduce bdrv_has_discard_zeroes and bdrv_has_discard_write_zeroes, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 01/20] block: make BdrvRequestFlags public, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 02/20] block: add flags to bdrv_*_write_zeroes, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 03/20] block: introduce BDRV_REQ_MAY_UNMAP request flag, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 05/20] block/raw: add bdrv_has_discard_zeroes and bdrv_has_discard_write_zeroes, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 06/20] block: add BlockLimits structure to BlockDriverState, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 07/20] block: honour BlockLimits in bdrv_co_do_write_zeroes, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 08/20] block: honour BlockLimits in bdrv_co_discard,
Peter Lieven <=
- [Qemu-devel] [PATCHv3 11/20] iscsi: add bdrv_has_discard_zeroes and bdrv_has_discard_write_zeroes, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 13/20] block: introduce bdrv_zeroize, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 12/20] iscsi: add bdrv_co_write_zeroes, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 10/20] iscsi: set limits in BlockDriverState, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 14/20] block/get_block_status: set *pnum = 0 on error, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 09/20] iscsi: simplify iscsi_co_discard, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 16/20] block/get_block_status: avoid redundant callouts on raw devices, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 18/20] qemu-img: add support for fully allocated images, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 20/20] block/raw: copy BlockLimits on raw_open, Peter Lieven, 2013/09/24
- [Qemu-devel] [PATCHv3 15/20] block/get_block_status: avoid segfault if there is no backing_hd, Peter Lieven, 2013/09/24