76daa3
From 1ffa7d12a15fdc4f1bbed59bf5d3292ac2b574b3 Mon Sep 17 00:00:00 2001
76daa3
From: Jeffrey Cody <jcody@redhat.com>
76daa3
Date: Mon, 12 Jun 2017 14:46:56 +0200
76daa3
Subject: [PATCH 11/13] block: fix external snapshot abort permission error
76daa3
76daa3
RH-Author: Jeffrey Cody <jcody@redhat.com>
76daa3
Message-id: <14e6e82657b93fb6bec16eddce051ced36db5ff9.1497278737.git.jcody@redhat.com>
76daa3
Patchwork-id: 75593
76daa3
O-Subject: [RHEV-7.4 qemu-kvm-rhev PATCH 1/1] block: fix external snapshot abort permission error
76daa3
Bugzilla: 1447184
76daa3
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
76daa3
RH-Acked-by: Max Reitz <mreitz@redhat.com>
76daa3
RH-Acked-by: John Snow <jsnow@redhat.com>
76daa3
76daa3
In external_snapshot_abort(), we try to undo what was done in
76daa3
external_snapshot_prepare() calling bdrv_replace_node() to swap the
76daa3
nodes back.  However, we receive a permissions error as writers are
76daa3
blocked on the old node, which is now the new node backing file.
76daa3
76daa3
An easy fix (initially suggested by Kevin Wolf) is to call
76daa3
bdrv_set_backing_hd() on the new node, to set the backing node to NULL.
76daa3
76daa3
Signed-off-by: Jeff Cody <jcody@redhat.com>
76daa3
Reviewed-by: Eric Blake <eblake@redhat.com>
76daa3
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
76daa3
(cherry picked from commit 719fc28c80a22ab9f1533d775bae09c14442bbbe)
76daa3
Signed-off-by: Jeff Cody <jcody@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 blockdev.c | 4 ++++
76daa3
 1 file changed, 4 insertions(+)
76daa3
76daa3
diff --git a/blockdev.c b/blockdev.c
76daa3
index 4432143..a3a0731 100644
76daa3
--- a/blockdev.c
76daa3
+++ b/blockdev.c
76daa3
@@ -1847,7 +1847,11 @@ static void external_snapshot_abort(BlkActionState *common)
76daa3
                              DO_UPCAST(ExternalSnapshotState, common, common);
76daa3
     if (state->new_bs) {
76daa3
         if (state->overlay_appended) {
76daa3
+            bdrv_ref(state->old_bs);   /* we can't let bdrv_set_backind_hd()
76daa3
+                                          close state->old_bs; we need it */
76daa3
+            bdrv_set_backing_hd(state->new_bs, NULL, &error_abort);
76daa3
             bdrv_replace_node(state->new_bs, state->old_bs, &error_abort);
76daa3
+            bdrv_unref(state->old_bs); /* bdrv_replace_node() ref'ed old_bs */
76daa3
         }
76daa3
     }
76daa3
 }
76daa3
-- 
76daa3
1.8.3.1
76daa3