File qemu-xen-upstream-allow-every-discard-range.patch of Package xen.6121

References: bsc#964427
---
 tools/qemu-xen-dir-remote/block.c |   24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

Index: xen-4.4.3-testing/tools/qemu-xen-dir-remote/block.c
===================================================================
--- xen-4.4.3-testing.orig/tools/qemu-xen-dir-remote/block.c
+++ xen-4.4.3-testing/tools/qemu-xen-dir-remote/block.c
@@ -2147,6 +2147,8 @@ static int bdrv_check_byte_request(Block
         return 0;
 
     len = bdrv_getlength(bs);
+    if (len < 0)
+        return -EIO;
 
     if (offset < 0)
         return -EIO;
@@ -4165,7 +4167,7 @@ static void coroutine_fn bdrv_discard_co
     rwco->ret = bdrv_co_discard(rwco->bs, rwco->sector_num, rwco->nb_sectors);
 }
 
-int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
+static int __bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
                                  int nb_sectors)
 {
     if (!bs->drv) {
@@ -4206,6 +4208,26 @@ int coroutine_fn bdrv_co_discard(BlockDr
     }
 }
 
+int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
+                                 int nb_sectors)
+{
+    int num, ret;
+    int limit = (INT_MAX / BDRV_SECTOR_SIZE) - 1;
+    int remaining = nb_sectors;
+    int64_t sector_offset = sector_num;
+
+    do {
+        num = remaining > limit ? limit : remaining;
+        ret = __bdrv_co_discard(bs, sector_offset, num);
+        if (ret < 0)
+            break;
+        remaining -= num;
+        sector_offset += num;
+    } while (remaining > 0);
+
+    return ret;
+}
+
 int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
 {
     Coroutine *co;
openSUSE Build Service is sponsored by