59 lines
2.3 KiB
Diff
59 lines
2.3 KiB
Diff
|
From cc7dbe3ae92a2bb1557df184493a331fe2381003 Mon Sep 17 00:00:00 2001
|
||
|
From: Max Reitz <mreitz@redhat.com>
|
||
|
Date: Wed, 3 Apr 2019 17:53:52 +0100
|
||
|
Subject: [PATCH 9/9] block/file-posix: do not fail on unlock bytes
|
||
|
|
||
|
RH-Author: Max Reitz <mreitz@redhat.com>
|
||
|
Message-id: <20190403175352.27439-2-mreitz@redhat.com>
|
||
|
Patchwork-id: 85408
|
||
|
O-Subject: [RHEL-AV-8.0.1 qemu-kvm PATCH 1/1] block/file-posix: do not fail on unlock bytes
|
||
|
Bugzilla: 1652572
|
||
|
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||
|
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@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 07bbdab..f0af144 100644
|
||
|
--- a/block/file-posix.c
|
||
|
+++ b/block/file-posix.c
|
||
|
@@ -812,6 +812,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
|
||
|
|