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

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