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