ae23c9
From 87240c5fcfb3e3ba68c5c87d2175f2dd98921a7e Mon Sep 17 00:00:00 2001
ae23c9
From: Max Reitz <mreitz@redhat.com>
ae23c9
Date: Wed, 3 Apr 2019 17:13:15 +0100
ae23c9
Subject: [PATCH 08/11] block/file-posix: do not fail on unlock bytes
ae23c9
ae23c9
RH-Author: Max Reitz <mreitz@redhat.com>
ae23c9
Message-id: <20190403171315.20841-9-mreitz@redhat.com>
ae23c9
Patchwork-id: 85406
ae23c9
O-Subject: [RHEL-8.1 qemu-kvm PATCH 8/8] block/file-posix: do not fail on unlock bytes
ae23c9
Bugzilla: 1694148
ae23c9
RH-Acked-by: John Snow <jsnow@redhat.com>
ae23c9
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
ae23c9
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
ae23c9
ae23c9
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
ae23c9
ae23c9
bdrv_replace_child() calls bdrv_check_perm() with error_abort on
ae23c9
loosening permissions. However file-locking operations may fail even
ae23c9
in this case, for example on NFS. And this leads to Qemu crash.
ae23c9
ae23c9
Let's avoid such errors. Note, that we ignore such things anyway on
ae23c9
permission update commit and abort.
ae23c9
ae23c9
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
ae23c9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ae23c9
(cherry picked from commit 696aaaed579ac5bf5fa336216909b46d3d8f07a8)
ae23c9
Signed-off-by: Max Reitz <mreitz@redhat.com>
ae23c9
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ae23c9
---
ae23c9
 block/file-posix.c | 12 ++++++++++++
ae23c9
 1 file changed, 12 insertions(+)
ae23c9
ae23c9
diff --git a/block/file-posix.c b/block/file-posix.c
ae23c9
index deecf58..5fb5a9a 100644
ae23c9
--- a/block/file-posix.c
ae23c9
+++ b/block/file-posix.c
ae23c9
@@ -800,6 +800,18 @@ static int raw_handle_perm_lock(BlockDriverState *bs,
ae23c9
 
ae23c9
     switch (op) {
ae23c9
     case RAW_PL_PREPARE:
ae23c9
+        if ((s->perm | new_perm) == s->perm &&
ae23c9
+            (s->shared_perm & new_shared) == s->shared_perm)
ae23c9
+        {
ae23c9
+            /*
ae23c9
+             * We are going to unlock bytes, it should not fail. If it fail due
ae23c9
+             * to some fs-dependent permission-unrelated reasons (which occurs
ae23c9
+             * sometimes on NFS and leads to abort in bdrv_replace_child) we
ae23c9
+             * can't prevent such errors by any check here. And we ignore them
ae23c9
+             * anyway in ABORT and COMMIT.
ae23c9
+             */
ae23c9
+            return 0;
ae23c9
+        }
ae23c9
         ret = raw_apply_lock_bytes(s, s->fd, s->perm | new_perm,
ae23c9
                                    ~s->shared_perm | ~new_shared,
ae23c9
                                    false, errp);
ae23c9
-- 
ae23c9
1.8.3.1
ae23c9