26ba25
From 9cecd3548e9275e7de21801b90c277c7b04cabb4 Mon Sep 17 00:00:00 2001
26ba25
From: Max Reitz <mreitz@redhat.com>
26ba25
Date: Mon, 18 Jun 2018 16:12:09 +0200
26ba25
Subject: [PATCH 042/268] block: Support BDRV_REQ_WRITE_UNCHANGED in filters
26ba25
26ba25
RH-Author: Max Reitz <mreitz@redhat.com>
26ba25
Message-id: <20180618161212.14444-8-mreitz@redhat.com>
26ba25
Patchwork-id: 80767
26ba25
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH 07/10] block: Support BDRV_REQ_WRITE_UNCHANGED in filters
26ba25
Bugzilla: 1518738
26ba25
RH-Acked-by: John Snow <jsnow@redhat.com>
26ba25
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
26ba25
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
26ba25
26ba25
Update the rest of the filter drivers to support
26ba25
BDRV_REQ_WRITE_UNCHANGED.  They already forward write request flags to
26ba25
their children, so we just have to announce support for it.
26ba25
26ba25
This patch does not cover the replication driver because that currently
26ba25
does not support flags at all, and because it just grabs the WRITE
26ba25
permission for its children when it can, so we should be fine just
26ba25
submitting the incoming WRITE_UNCHANGED requests as normal writes.
26ba25
26ba25
It also does not cover format drivers for similar reasons.  They all use
26ba25
bdrv_format_default_perms() as their .bdrv_child_perm() implementation
26ba25
so they just always grab the WRITE permission for their file children
26ba25
whenever possible.  In addition, it often would be difficult to
26ba25
ascertain whether incoming unchanging writes end up as unchanging writes
26ba25
in their files.  So we just leave them as normal potentially changing
26ba25
writes.
26ba25
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
26ba25
Reviewed-by: Alberto Garcia <berto@igalia.com>
26ba25
Message-id: 20180421132929.21610-7-mreitz@redhat.com
26ba25
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
(cherry picked from commit 228345bf5db8bc97d1c64f062e138d389065d1ab)
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
26ba25
---
26ba25
 block/blkdebug.c     |  9 +++++----
26ba25
 block/blkreplay.c    |  3 +++
26ba25
 block/blkverify.c    |  3 +++
26ba25
 block/copy-on-read.c | 10 ++++++----
26ba25
 block/mirror.c       |  2 ++
26ba25
 block/raw-format.c   |  9 +++++----
26ba25
 block/throttle.c     |  6 ++++--
26ba25
 7 files changed, 28 insertions(+), 14 deletions(-)
26ba25
26ba25
diff --git a/block/blkdebug.c b/block/blkdebug.c
26ba25
index 053372c..526af2a 100644
26ba25
--- a/block/blkdebug.c
26ba25
+++ b/block/blkdebug.c
26ba25
@@ -398,10 +398,11 @@ static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,
26ba25
         goto out;
26ba25
     }
26ba25
 
26ba25
-    bs->supported_write_flags = BDRV_REQ_FUA &
26ba25
-        bs->file->bs->supported_write_flags;
26ba25
-    bs->supported_zero_flags = (BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &
26ba25
-        bs->file->bs->supported_zero_flags;
26ba25
+    bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED |
26ba25
+        (BDRV_REQ_FUA & bs->file->bs->supported_write_flags);
26ba25
+    bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED |
26ba25
+        ((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &
26ba25
+            bs->file->bs->supported_zero_flags);
26ba25
     ret = -EINVAL;
26ba25
 
26ba25
     /* Set alignment overrides */
26ba25
diff --git a/block/blkreplay.c b/block/blkreplay.c
26ba25
index fe5a9b4..b016dbe 100755
26ba25
--- a/block/blkreplay.c
26ba25
+++ b/block/blkreplay.c
26ba25
@@ -35,6 +35,9 @@ static int blkreplay_open(BlockDriverState *bs, QDict *options, int flags,
26ba25
         goto fail;
26ba25
     }
26ba25
 
26ba25
+    bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED;
26ba25
+    bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED;
26ba25
+
26ba25
     ret = 0;
26ba25
 fail:
26ba25
     return ret;
26ba25
diff --git a/block/blkverify.c b/block/blkverify.c
26ba25
index 754cc9e..da97ee5 100644
26ba25
--- a/block/blkverify.c
26ba25
+++ b/block/blkverify.c
26ba25
@@ -141,6 +141,9 @@ static int blkverify_open(BlockDriverState *bs, QDict *options, int flags,
26ba25
         goto fail;
26ba25
     }
26ba25
 
26ba25
+    bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED;
26ba25
+    bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED;
26ba25
+
26ba25
     ret = 0;
26ba25
 fail:
26ba25
     qemu_opts_del(opts);
26ba25
diff --git a/block/copy-on-read.c b/block/copy-on-read.c
26ba25
index 823ec75..6a97208 100644
26ba25
--- a/block/copy-on-read.c
26ba25
+++ b/block/copy-on-read.c
26ba25
@@ -33,11 +33,13 @@ static int cor_open(BlockDriverState *bs, QDict *options, int flags,
26ba25
         return -EINVAL;
26ba25
     }
26ba25
 
26ba25
-    bs->supported_write_flags = BDRV_REQ_FUA &
26ba25
-                                    bs->file->bs->supported_write_flags;
26ba25
+    bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED |
26ba25
+                                (BDRV_REQ_FUA &
26ba25
+                                    bs->file->bs->supported_write_flags);
26ba25
 
26ba25
-    bs->supported_zero_flags = (BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &
26ba25
-                                    bs->file->bs->supported_zero_flags;
26ba25
+    bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED |
26ba25
+                               ((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &
26ba25
+                                    bs->file->bs->supported_zero_flags);
26ba25
 
26ba25
     return 0;
26ba25
 }
26ba25
diff --git a/block/mirror.c b/block/mirror.c
26ba25
index 99da9c0..003f957 100644
26ba25
--- a/block/mirror.c
26ba25
+++ b/block/mirror.c
26ba25
@@ -1152,6 +1152,8 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,
26ba25
         mirror_top_bs->implicit = true;
26ba25
     }
26ba25
     mirror_top_bs->total_sectors = bs->total_sectors;
26ba25
+    mirror_top_bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED;
26ba25
+    mirror_top_bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED;
26ba25
     bdrv_set_aio_context(mirror_top_bs, bdrv_get_aio_context(bs));
26ba25
 
26ba25
     /* bdrv_append takes ownership of the mirror_top_bs reference, need to keep
26ba25
diff --git a/block/raw-format.c b/block/raw-format.c
26ba25
index a378547..fe33693 100644
26ba25
--- a/block/raw-format.c
26ba25
+++ b/block/raw-format.c
26ba25
@@ -415,10 +415,11 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
26ba25
     }
26ba25
 
26ba25
     bs->sg = bs->file->bs->sg;
26ba25
-    bs->supported_write_flags = BDRV_REQ_FUA &
26ba25
-        bs->file->bs->supported_write_flags;
26ba25
-    bs->supported_zero_flags = (BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &
26ba25
-        bs->file->bs->supported_zero_flags;
26ba25
+    bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED |
26ba25
+        (BDRV_REQ_FUA & bs->file->bs->supported_write_flags);
26ba25
+    bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED |
26ba25
+        ((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &
26ba25
+            bs->file->bs->supported_zero_flags);
26ba25
 
26ba25
     if (bs->probed && !bdrv_is_read_only(bs)) {
26ba25
         fprintf(stderr,
26ba25
diff --git a/block/throttle.c b/block/throttle.c
26ba25
index 95ed06a..e298827 100644
26ba25
--- a/block/throttle.c
26ba25
+++ b/block/throttle.c
26ba25
@@ -81,8 +81,10 @@ static int throttle_open(BlockDriverState *bs, QDict *options,
26ba25
     if (!bs->file) {
26ba25
         return -EINVAL;
26ba25
     }
26ba25
-    bs->supported_write_flags = bs->file->bs->supported_write_flags;
26ba25
-    bs->supported_zero_flags = bs->file->bs->supported_zero_flags;
26ba25
+    bs->supported_write_flags = bs->file->bs->supported_write_flags |
26ba25
+                                BDRV_REQ_WRITE_UNCHANGED;
26ba25
+    bs->supported_zero_flags = bs->file->bs->supported_zero_flags |
26ba25
+                               BDRV_REQ_WRITE_UNCHANGED;
26ba25
 
26ba25
     return throttle_configure_tgm(bs, tgm, options, errp);
26ba25
 }
26ba25
-- 
26ba25
1.8.3.1
26ba25