mirror of
https://git.proxmox.com/git/pve-qemu
synced 2025-08-15 13:30:04 +00:00

Fix the two issues reported in the community forum[0][1], i.e. regression in LSI-53c895a controller and ignored boot order for USB storage (only possible via custom arguments in Proxmox VE), both causing boot failures, and pick up fixes for VirtIO, ARM emulation, char IO device and a graph lock fix for the block layer. The block-copy patches that serve as a preparation for fleecing are moved to the extra folder, because the graph lock fix requires them to be present first. They have been applied upstream in the meantime and should drop out with the rebase on 9.1. [0]: https://forum.proxmox.com/threads/149772/post-679433 [1]: https://forum.proxmox.com/threads/149772/post-683459 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
146 lines
5.3 KiB
Diff
146 lines
5.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|
Date: Mon, 6 Apr 2020 12:16:50 +0200
|
|
Subject: [PATCH] PVE: [Up+Config] file-posix: make locking optiono on create
|
|
|
|
Otherwise creating images on nfs/cifs can be problematic.
|
|
|
|
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|
---
|
|
block/file-posix.c | 59 ++++++++++++++++++++++++++++++--------------
|
|
qapi/block-core.json | 7 +++++-
|
|
2 files changed, 46 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/block/file-posix.c b/block/file-posix.c
|
|
index 43bc0bd520..60e98c87f1 100644
|
|
--- a/block/file-posix.c
|
|
+++ b/block/file-posix.c
|
|
@@ -2876,6 +2876,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|
int fd;
|
|
uint64_t perm, shared;
|
|
int result = 0;
|
|
+ bool locked = false;
|
|
|
|
/* Validate options and set default values */
|
|
assert(options->driver == BLOCKDEV_DRIVER_FILE);
|
|
@@ -2916,19 +2917,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|
perm = BLK_PERM_WRITE | BLK_PERM_RESIZE;
|
|
shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE;
|
|
|
|
- /* Step one: Take locks */
|
|
- result = raw_apply_lock_bytes(NULL, fd, perm, ~shared, false, errp);
|
|
- if (result < 0) {
|
|
- goto out_close;
|
|
- }
|
|
+ if (file_opts->locking != ON_OFF_AUTO_OFF) {
|
|
+ /* Step one: Take locks */
|
|
+ result = raw_apply_lock_bytes(NULL, fd, perm, ~shared, false, errp);
|
|
+ if (result < 0) {
|
|
+ goto out_close;
|
|
+ }
|
|
+ locked = true;
|
|
|
|
- /* Step two: Check that nobody else has taken conflicting locks */
|
|
- result = raw_check_lock_bytes(fd, perm, shared, errp);
|
|
- if (result < 0) {
|
|
- error_append_hint(errp,
|
|
- "Is another process using the image [%s]?\n",
|
|
- file_opts->filename);
|
|
- goto out_unlock;
|
|
+ /* Step two: Check that nobody else has taken conflicting locks */
|
|
+ result = raw_check_lock_bytes(fd, perm, shared, errp);
|
|
+ if (result < 0) {
|
|
+ error_append_hint(errp,
|
|
+ "Is another process using the image [%s]?\n",
|
|
+ file_opts->filename);
|
|
+ goto out_unlock;
|
|
+ }
|
|
}
|
|
|
|
/* Clear the file by truncating it to 0 */
|
|
@@ -2982,13 +2986,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|
}
|
|
|
|
out_unlock:
|
|
- raw_apply_lock_bytes(NULL, fd, 0, 0, true, &local_err);
|
|
- if (local_err) {
|
|
- /* The above call should not fail, and if it does, that does
|
|
- * not mean the whole creation operation has failed. So
|
|
- * report it the user for their convenience, but do not report
|
|
- * it to the caller. */
|
|
- warn_report_err(local_err);
|
|
+ if (locked) {
|
|
+ raw_apply_lock_bytes(NULL, fd, 0, 0, true, &local_err);
|
|
+ if (local_err) {
|
|
+ /* The above call should not fail, and if it does, that does
|
|
+ * not mean the whole creation operation has failed. So
|
|
+ * report it the user for their convenience, but do not report
|
|
+ * it to the caller. */
|
|
+ warn_report_err(local_err);
|
|
+ }
|
|
}
|
|
|
|
out_close:
|
|
@@ -3012,6 +3018,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
|
PreallocMode prealloc;
|
|
char *buf = NULL;
|
|
Error *local_err = NULL;
|
|
+ OnOffAuto locking;
|
|
|
|
/* Skip file: protocol prefix */
|
|
strstart(filename, "file:", &filename);
|
|
@@ -3034,6 +3041,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ locking = qapi_enum_parse(&OnOffAuto_lookup,
|
|
+ qemu_opt_get(opts, "locking"),
|
|
+ ON_OFF_AUTO_AUTO, &local_err);
|
|
+ if (local_err) {
|
|
+ error_propagate(errp, local_err);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ if (locking == ON_OFF_AUTO_AUTO) {
|
|
+ locking = ON_OFF_AUTO_OFF;
|
|
+ }
|
|
+
|
|
options = (BlockdevCreateOptions) {
|
|
.driver = BLOCKDEV_DRIVER_FILE,
|
|
.u.file = {
|
|
@@ -3045,6 +3064,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
|
.nocow = nocow,
|
|
.has_extent_size_hint = has_extent_size_hint,
|
|
.extent_size_hint = extent_size_hint,
|
|
+ .has_locking = true,
|
|
+ .locking = locking,
|
|
},
|
|
};
|
|
return raw_co_create(&options, errp);
|
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
|
index 905da8be72..3db587a6e4 100644
|
|
--- a/qapi/block-core.json
|
|
+++ b/qapi/block-core.json
|
|
@@ -4956,6 +4956,10 @@
|
|
# @extent-size-hint: Extent size hint to add to the image file; 0 for
|
|
# not adding an extent size hint (default: 1 MB, since 5.1)
|
|
#
|
|
+# @locking: whether to enable file locking. If set to 'auto', only
|
|
+# enable when Open File Descriptor (OFD) locking API is available
|
|
+# (default: auto).
|
|
+#
|
|
# Since: 2.12
|
|
##
|
|
{ 'struct': 'BlockdevCreateOptionsFile',
|
|
@@ -4963,7 +4967,8 @@
|
|
'size': 'size',
|
|
'*preallocation': 'PreallocMode',
|
|
'*nocow': 'bool',
|
|
- '*extent-size-hint': 'size'} }
|
|
+ '*extent-size-hint': 'size',
|
|
+ '*locking': 'OnOffAuto' } }
|
|
|
|
##
|
|
# @BlockdevCreateOptionsGluster:
|