Notable changes:
* bdrv_co_p{discard,readv,writev,write_zeroes} function signatures
  changed, to using int64_t for offsets/bytes and some still had int
  rather than BrdvRequestFlags for the flags.
* job_cancel_sync now has a force parameter. Commit messages in
  73895f3838cd7fdaf185cf1dbc47be58844a966f
  4cfb3f05627ad82af473e7f7ae113c3884cd04e3
  sound like using force=true makes more sense.
* Added 3 patches coming in via qemu-stable tag, most important one is
  to work around a librbd issue.
* Added another 3 patches from qemu-devel to fix issue leading to
  crash when live migrating with iothread.
* cluster_size calculation helper changed (see patch pve/0026).
* QAPI's if conditionals now use 'CONFIG_FOO' rather than
  'defined(CONFIG_FOO)'
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
		
	
			
		
			
				
	
	
		
			135 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.9 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 |  3 ++-
 | 
						|
 2 files changed, 42 insertions(+), 20 deletions(-)
 | 
						|
 | 
						|
diff --git a/block/file-posix.c b/block/file-posix.c
 | 
						|
index 821405fd02..e3b6c3c524 100644
 | 
						|
--- a/block/file-posix.c
 | 
						|
+++ b/block/file-posix.c
 | 
						|
@@ -2465,6 +2465,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);
 | 
						|
@@ -2505,19 +2506,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 */
 | 
						|
@@ -2571,13 +2575,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:
 | 
						|
@@ -2602,6 +2608,7 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
 | 
						|
     PreallocMode prealloc;
 | 
						|
     char *buf = NULL;
 | 
						|
     Error *local_err = NULL;
 | 
						|
+    OnOffAuto locking;
 | 
						|
 
 | 
						|
     /* Skip file: protocol prefix */
 | 
						|
     strstart(filename, "file:", &filename);
 | 
						|
@@ -2624,6 +2631,18 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
 | 
						|
         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     = {
 | 
						|
@@ -2635,6 +2654,8 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
 | 
						|
             .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 da5dca1e3b..cd69af921e 100644
 | 
						|
--- a/qapi/block-core.json
 | 
						|
+++ b/qapi/block-core.json
 | 
						|
@@ -4466,7 +4466,8 @@
 | 
						|
             'size':                 'size',
 | 
						|
             '*preallocation':       'PreallocMode',
 | 
						|
             '*nocow':               'bool',
 | 
						|
-            '*extent-size-hint':    'size'} }
 | 
						|
+            '*extent-size-hint':    'size',
 | 
						|
+            '*locking':         'OnOffAuto' } }
 | 
						|
 
 | 
						|
 ##
 | 
						|
 # @BlockdevCreateOptionsGluster:
 |