Blame SOURCES/kvm-block-Move-request-tracking-to-children-in-copy-offl.patch

357786
From fba2d77758d680a147862f26d57bb984d73f7700 Mon Sep 17 00:00:00 2001
357786
From: John Snow <jsnow@redhat.com>
357786
Date: Tue, 24 Jul 2018 12:43:07 +0200
357786
Subject: [PATCH 64/89] block: Move request tracking to children in copy
357786
 offloading
357786
357786
RH-Author: John Snow <jsnow@redhat.com>
357786
Message-id: <20180718225511.14878-14-jsnow@redhat.com>
357786
Patchwork-id: 81393
357786
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 13/35] block: Move request tracking to children in copy offloading
357786
Bugzilla: 1207657
357786
RH-Acked-by: Eric Blake <eblake@redhat.com>
357786
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
357786
RH-Acked-by: Fam Zheng <famz@redhat.com>
357786
357786
From: Fam Zheng <famz@redhat.com>
357786
357786
in_flight and tracked requests need to be tracked in every layer during
357786
recursion. For now the only user is qemu-img convert where overlapping
357786
requests and IOThreads don't exist, therefore this change doesn't make
357786
much difference form user point of view, but it is incorrect as part of
357786
the API. Fix it.
357786
357786
Reported-by: Kevin Wolf <kwolf@redhat.com>
357786
Signed-off-by: Fam Zheng <famz@redhat.com>
357786
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
357786
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
357786
(cherry picked from commit 37aec7d75eb0d035a0db4f2cf9ad8b1b0c10f91b)
357786
Signed-off-by: John Snow <jsnow@redhat.com>
357786
---
357786
 block/io.c | 60 +++++++++++++++++++++++++++++-------------------------------
357786
 1 file changed, 29 insertions(+), 31 deletions(-)
357786
357786
diff --git a/block/io.c b/block/io.c
357786
index ac36d1c..136a5d0 100644
357786
--- a/block/io.c
357786
+++ b/block/io.c
357786
@@ -2847,6 +2847,9 @@ static int coroutine_fn bdrv_co_copy_range_internal(BdrvChild *src,
357786
                                                     BdrvRequestFlags flags,
357786
                                                     bool recurse_src)
357786
 {
357786
+    BdrvTrackedRequest src_req, dst_req;
357786
+    BlockDriverState *src_bs = src->bs;
357786
+    BlockDriverState *dst_bs = dst->bs;
357786
     int ret;
357786
 
357786
     if (!src || !dst || !src->bs || !dst->bs) {
357786
@@ -2870,17 +2873,32 @@ static int coroutine_fn bdrv_co_copy_range_internal(BdrvChild *src,
357786
         || src->bs->encrypted || dst->bs->encrypted) {
357786
         return -ENOTSUP;
357786
     }
357786
+
357786
+    bdrv_inc_in_flight(src_bs);
357786
+    bdrv_inc_in_flight(dst_bs);
357786
+    tracked_request_begin(&src_req, src_bs, src_offset,
357786
+                          bytes, BDRV_TRACKED_READ);
357786
+    tracked_request_begin(&dst_req, dst_bs, dst_offset,
357786
+                          bytes, BDRV_TRACKED_WRITE);
357786
+
357786
+    wait_serialising_requests(&src_req);
357786
+    wait_serialising_requests(&dst_req);
357786
     if (recurse_src) {
357786
-        return src->bs->drv->bdrv_co_copy_range_from(src->bs,
357786
-                                                     src, src_offset,
357786
-                                                     dst, dst_offset,
357786
-                                                     bytes, flags);
357786
+        ret = src->bs->drv->bdrv_co_copy_range_from(src->bs,
357786
+                                                    src, src_offset,
357786
+                                                    dst, dst_offset,
357786
+                                                    bytes, flags);
357786
     } else {
357786
-        return dst->bs->drv->bdrv_co_copy_range_to(dst->bs,
357786
-                                                   src, src_offset,
357786
-                                                   dst, dst_offset,
357786
-                                                   bytes, flags);
357786
+        ret = dst->bs->drv->bdrv_co_copy_range_to(dst->bs,
357786
+                                                  src, src_offset,
357786
+                                                  dst, dst_offset,
357786
+                                                  bytes, flags);
357786
     }
357786
+    tracked_request_end(&src_req);
357786
+    tracked_request_end(&dst_req);
357786
+    bdrv_dec_in_flight(src_bs);
357786
+    bdrv_dec_in_flight(dst_bs);
357786
+    return ret;
357786
 }
357786
 
357786
 /* Copy range from @src to @dst.
357786
@@ -2911,29 +2929,9 @@ int coroutine_fn bdrv_co_copy_range(BdrvChild *src, uint64_t src_offset,
357786
                                     BdrvChild *dst, uint64_t dst_offset,
357786
                                     uint64_t bytes, BdrvRequestFlags flags)
357786
 {
357786
-    BdrvTrackedRequest src_req, dst_req;
357786
-    BlockDriverState *src_bs = src->bs;
357786
-    BlockDriverState *dst_bs = dst->bs;
357786
-    int ret;
357786
-
357786
-    bdrv_inc_in_flight(src_bs);
357786
-    bdrv_inc_in_flight(dst_bs);
357786
-    tracked_request_begin(&src_req, src_bs, src_offset,
357786
-                          bytes, BDRV_TRACKED_READ);
357786
-    tracked_request_begin(&dst_req, dst_bs, dst_offset,
357786
-                          bytes, BDRV_TRACKED_WRITE);
357786
-
357786
-    wait_serialising_requests(&src_req);
357786
-    wait_serialising_requests(&dst_req);
357786
-    ret = bdrv_co_copy_range_from(src, src_offset,
357786
-                                  dst, dst_offset,
357786
-                                  bytes, flags);
357786
-
357786
-    tracked_request_end(&src_req);
357786
-    tracked_request_end(&dst_req);
357786
-    bdrv_dec_in_flight(src_bs);
357786
-    bdrv_dec_in_flight(dst_bs);
357786
-    return ret;
357786
+    return bdrv_co_copy_range_from(src, src_offset,
357786
+                                   dst, dst_offset,
357786
+                                   bytes, flags);
357786
 }
357786
 
357786
 static void bdrv_parent_cb_resize(BlockDriverState *bs)
357786
-- 
357786
1.8.3.1
357786