mirror of
https://git.yoctoproject.org/poky
synced 2026-05-08 17:19:20 +00:00
qemu: backport patches to fix boot failure
Backport two patches to fix the following error when booting qemu. Failed to unlock byte 100 (From OE-Core rev: 91eee8b08cd52f49bb1c8f8c680607b3f3a52d24) Signed-off-by: Chen Qi <Qi.Chen@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
From ca749954b09b89e22cd69c4949fb7e689b057963 Mon Sep 17 00:00:00 2001
|
||||
From: Fam Zheng <famz@redhat.com>
|
||||
Date: Fri, 11 Aug 2017 19:44:46 +0800
|
||||
Subject: [PATCH 1/2] osdep: Add runtime OFD lock detection
|
||||
|
||||
Build time check of OFD lock is not sufficient and can cause image open
|
||||
errors when the runtime environment doesn't support it.
|
||||
|
||||
Add a helper function to probe it at runtime, additionally. Also provide
|
||||
a qemu_has_ofd_lock() for callers to check the status.
|
||||
|
||||
Signed-off-by: Fam Zheng <famz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
|
||||
---
|
||||
include/qemu/osdep.h | 1 +
|
||||
util/osdep.c | 66 ++++++++++++++++++++++++++++++++++++++++++++--------
|
||||
2 files changed, 57 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
|
||||
index 3b74f6fcb2..6855b94bbf 100644
|
||||
--- a/include/qemu/osdep.h
|
||||
+++ b/include/qemu/osdep.h
|
||||
@@ -357,6 +357,7 @@ int qemu_dup(int fd);
|
||||
int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive);
|
||||
int qemu_unlock_fd(int fd, int64_t start, int64_t len);
|
||||
int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive);
|
||||
+bool qemu_has_ofd_lock(void);
|
||||
|
||||
#if defined(__HAIKU__) && defined(__i386__)
|
||||
#define FMT_pid "%ld"
|
||||
diff --git a/util/osdep.c b/util/osdep.c
|
||||
index a2863c8e53..a479fedc4a 100644
|
||||
--- a/util/osdep.c
|
||||
+++ b/util/osdep.c
|
||||
@@ -38,14 +38,6 @@ extern int madvise(caddr_t, size_t, int);
|
||||
#include "qemu/error-report.h"
|
||||
#include "monitor/monitor.h"
|
||||
|
||||
-#ifdef F_OFD_SETLK
|
||||
-#define QEMU_SETLK F_OFD_SETLK
|
||||
-#define QEMU_GETLK F_OFD_GETLK
|
||||
-#else
|
||||
-#define QEMU_SETLK F_SETLK
|
||||
-#define QEMU_GETLK F_GETLK
|
||||
-#endif
|
||||
-
|
||||
static bool fips_enabled = false;
|
||||
|
||||
static const char *hw_version = QEMU_HW_VERSION;
|
||||
@@ -82,6 +74,10 @@ int qemu_madvise(void *addr, size_t len, int advice)
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
+
|
||||
+static int fcntl_op_setlk = -1;
|
||||
+static int fcntl_op_getlk = -1;
|
||||
+
|
||||
/*
|
||||
* Dups an fd and sets the flags
|
||||
*/
|
||||
@@ -149,6 +145,54 @@ static int qemu_parse_fdset(const char *param)
|
||||
return qemu_parse_fd(param);
|
||||
}
|
||||
|
||||
+static void qemu_probe_lock_ops(void)
|
||||
+{
|
||||
+ if (fcntl_op_setlk == -1) {
|
||||
+#ifdef F_OFD_SETLK
|
||||
+ int fd;
|
||||
+ int ret;
|
||||
+ struct flock fl = {
|
||||
+ .l_whence = SEEK_SET,
|
||||
+ .l_start = 0,
|
||||
+ .l_len = 0,
|
||||
+ .l_type = F_WRLCK,
|
||||
+ };
|
||||
+
|
||||
+ fd = open("/dev/null", O_RDWR);
|
||||
+ if (fd < 0) {
|
||||
+ fprintf(stderr,
|
||||
+ "Failed to open /dev/null for OFD lock probing: %s\n",
|
||||
+ strerror(errno));
|
||||
+ fcntl_op_setlk = F_SETLK;
|
||||
+ fcntl_op_getlk = F_GETLK;
|
||||
+ return;
|
||||
+ }
|
||||
+ ret = fcntl(fd, F_OFD_GETLK, &fl);
|
||||
+ close(fd);
|
||||
+ if (!ret) {
|
||||
+ fcntl_op_setlk = F_OFD_SETLK;
|
||||
+ fcntl_op_getlk = F_OFD_GETLK;
|
||||
+ } else {
|
||||
+ fcntl_op_setlk = F_SETLK;
|
||||
+ fcntl_op_getlk = F_GETLK;
|
||||
+ }
|
||||
+#else
|
||||
+ fcntl_op_setlk = F_SETLK;
|
||||
+ fcntl_op_getlk = F_GETLK;
|
||||
+#endif
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+bool qemu_has_ofd_lock(void)
|
||||
+{
|
||||
+ qemu_probe_lock_ops();
|
||||
+#ifdef F_OFD_SETLK
|
||||
+ return fcntl_op_setlk == F_OFD_SETLK;
|
||||
+#else
|
||||
+ return false;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)
|
||||
{
|
||||
int ret;
|
||||
@@ -158,7 +202,8 @@ static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)
|
||||
.l_len = len,
|
||||
.l_type = fl_type,
|
||||
};
|
||||
- ret = fcntl(fd, QEMU_SETLK, &fl);
|
||||
+ qemu_probe_lock_ops();
|
||||
+ ret = fcntl(fd, fcntl_op_setlk, &fl);
|
||||
return ret == -1 ? -errno : 0;
|
||||
}
|
||||
|
||||
@@ -181,7 +226,8 @@ int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive)
|
||||
.l_len = len,
|
||||
.l_type = exclusive ? F_WRLCK : F_RDLCK,
|
||||
};
|
||||
- ret = fcntl(fd, QEMU_GETLK, &fl);
|
||||
+ qemu_probe_lock_ops();
|
||||
+ ret = fcntl(fd, fcntl_op_getlk, &fl);
|
||||
if (ret == -1) {
|
||||
return -errno;
|
||||
} else {
|
||||
--
|
||||
2.11.0
|
||||
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
From 2b218f5dbcca5fe728b1852d161d7a21fd02b2f5 Mon Sep 17 00:00:00 2001
|
||||
From: Fam Zheng <famz@redhat.com>
|
||||
Date: Fri, 11 Aug 2017 19:44:47 +0800
|
||||
Subject: [PATCH 2/2] file-posix: Do runtime check for ofd lock API
|
||||
|
||||
It is reported that on Windows Subsystem for Linux, ofd operations fail
|
||||
with -EINVAL. In other words, QEMU binary built with system headers that
|
||||
exports F_OFD_SETLK doesn't necessarily run in an environment that
|
||||
actually supports it:
|
||||
|
||||
$ qemu-system-aarch64 ... -drive file=test.vhdx,if=none,id=hd0 \
|
||||
-device virtio-blk-pci,drive=hd0
|
||||
qemu-system-aarch64: -drive file=test.vhdx,if=none,id=hd0: Failed to unlock byte 100
|
||||
qemu-system-aarch64: -drive file=test.vhdx,if=none,id=hd0: Failed to unlock byte 100
|
||||
qemu-system-aarch64: -drive file=test.vhdx,if=none,id=hd0: Failed to lock byte 100
|
||||
|
||||
As a matter of fact this is not WSL specific. It can happen when running
|
||||
a QEMU compiled against a newer glibc on an older kernel, such as in
|
||||
a containerized environment.
|
||||
|
||||
Let's do a runtime check to cope with that.
|
||||
|
||||
Reported-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Fam Zheng <famz@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
|
||||
---
|
||||
block/file-posix.c | 19 ++++++++-----------
|
||||
1 file changed, 8 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index f4de022ae0..cb3bfce147 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -457,22 +457,19 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||
switch (locking) {
|
||||
case ON_OFF_AUTO_ON:
|
||||
s->use_lock = true;
|
||||
-#ifndef F_OFD_SETLK
|
||||
- fprintf(stderr,
|
||||
- "File lock requested but OFD locking syscall is unavailable, "
|
||||
- "falling back to POSIX file locks.\n"
|
||||
- "Due to the implementation, locks can be lost unexpectedly.\n");
|
||||
-#endif
|
||||
+ if (!qemu_has_ofd_lock()) {
|
||||
+ fprintf(stderr,
|
||||
+ "File lock requested but OFD locking syscall is "
|
||||
+ "unavailable, falling back to POSIX file locks.\n"
|
||||
+ "Due to the implementation, locks can be lost "
|
||||
+ "unexpectedly.\n");
|
||||
+ }
|
||||
break;
|
||||
case ON_OFF_AUTO_OFF:
|
||||
s->use_lock = false;
|
||||
break;
|
||||
case ON_OFF_AUTO_AUTO:
|
||||
-#ifdef F_OFD_SETLK
|
||||
- s->use_lock = true;
|
||||
-#else
|
||||
- s->use_lock = false;
|
||||
-#endif
|
||||
+ s->use_lock = qemu_has_ofd_lock();
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
--
|
||||
2.11.0
|
||||
|
||||
@@ -24,6 +24,8 @@ SRC_URI = "http://wiki.qemu-project.org/download/${BP}.tar.bz2 \
|
||||
file://0003-Introduce-condition-in-TPM-backend-for-notification.patch \
|
||||
file://0004-Add-support-for-VM-suspend-resume-for-TPM-TIS-v2.9.patch \
|
||||
file://apic-fixup-fallthrough-to-PIC.patch \
|
||||
file://0001-osdep-Add-runtime-OFD-lock-detection.patch \
|
||||
file://0002-file-posix-Do-runtime-check-for-ofd-lock-API.patch \
|
||||
"
|
||||
|
||||
SRC_URI_append_class-native = " \
|
||||
|
||||
Reference in New Issue
Block a user