merge: make file locking optional also on creation
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
parent
0775f12b63
commit
c36c53f829
130
debian/patches/pve/0028-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
vendored
Normal file
130
debian/patches/pve/0028-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
vendored
Normal file
@ -0,0 +1,130 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Date: Fri, 26 Apr 2019 09:15:28 +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>
|
||||
---
|
||||
block/file-posix.c | 53 ++++++++++++++++++++++++++++++++++++----------------
|
||||
qapi/block-core.json | 3 ++-
|
||||
2 files changed, 39 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 431a9dddc6..be34698d04 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -2175,6 +2175,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);
|
||||
@@ -2208,16 +2209,19 @@ 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(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(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) {
|
||||
- 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) {
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Clear the file by truncating it to 0 */
|
||||
@@ -2250,13 +2254,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
- raw_apply_lock_bytes(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. */
|
||||
- error_report_err(local_err);
|
||||
+ if (locked) {
|
||||
+ raw_apply_lock_bytes(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. */
|
||||
+ error_report_err(local_err);
|
||||
+ }
|
||||
}
|
||||
|
||||
out_close:
|
||||
@@ -2277,6 +2283,7 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
PreallocMode prealloc;
|
||||
char *buf = NULL;
|
||||
Error *local_err = NULL;
|
||||
+ OnOffAuto locking;
|
||||
|
||||
/* Skip file: protocol prefix */
|
||||
strstart(filename, "file:", &filename);
|
||||
@@ -2294,6 +2301,18 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
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 = {
|
||||
@@ -2303,6 +2322,8 @@ static int coroutine_fn raw_co_create_opts(const char *filename, QemuOpts *opts,
|
||||
.preallocation = prealloc,
|
||||
.has_nocow = true,
|
||||
.nocow = nocow,
|
||||
+ .has_locking = true,
|
||||
+ .locking = locking,
|
||||
},
|
||||
};
|
||||
return raw_co_create(&options, errp);
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 9c3c2d4917..db859e20fa 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -3879,7 +3879,8 @@
|
||||
'data': { 'filename': 'str',
|
||||
'size': 'size',
|
||||
'*preallocation': 'PreallocMode',
|
||||
- '*nocow': 'bool' } }
|
||||
+ '*nocow': 'bool',
|
||||
+ '*locking': 'OnOffAuto' } }
|
||||
|
||||
##
|
||||
# @BlockdevCreateOptionsGluster:
|
||||
--
|
||||
2.11.0
|
||||
|
1
debian/patches/series
vendored
1
debian/patches/series
vendored
@ -25,5 +25,6 @@ pve/0024-PVE-vma-add-cache-option-to-device-map.patch
|
||||
pve/0025-PVE-vma-remove-forced-NO_FLUSH-option.patch
|
||||
pve/0026-PVE-Add-dummy-id-command-line-parameter.patch
|
||||
pve/0027-PVE-Config-Revert-target-i386-disable-LINT0-after-re.patch
|
||||
pve/0028-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch
|
||||
extra/0001-monitor-guard-iothread-access-by-mon-use_io_thread.patch
|
||||
extra/0002-monitor-delay-monitor-iothread-creation.patch
|
||||
|
Loading…
Reference in New Issue
Block a user