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