All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] block: report errno when flock fcntl fails
@ 2021-01-07 17:55 David Edmondson
  2021-01-07 18:03 ` David Edmondson
  0 siblings, 1 reply; 2+ messages in thread
From: David Edmondson @ 2021-01-07 17:55 UTC (permalink / raw)
  To: qemu-devel
  Cc: Kevin Wolf, Vladimir Sementsov-Ogievskiy, qemu-block,
	Philippe Mathieu-Daudé,
	Max Reitz, David Edmondson

When a call to fcntl(2) for the purpose of manipulating file locks
fails with an error other than EAGAIN or EACCES, report the error
returned by fcntl.

EAGAIN or EACCES are elided as they are considered to be common
failures, indicating that a conflicting lock is held by another
process.

Signed-off-by: David Edmondson <david.edmondson@oracle.com>
---
v3:
- Remove the now unnecessary updates to the test framework (Max).
- Elide the error detail for EAGAIN or EACCES when locking (Kevin,
  sort-of Max).
- Philippe and Vladimir sent Reviewed-by, but things have changed
  noticeably, so I didn't add them (dme).

 block/file-posix.c         | 52 +++++++++++++++++++++-----
 tests/qemu-iotests/153.out | 76 +++++++++++++++++++-------------------
 tests/qemu-iotests/182.out |  2 +-
 3 files changed, 81 insertions(+), 49 deletions(-)

diff --git a/block/file-posix.c b/block/file-posix.c
index 00cdaaa2d4..c5142f7ffa 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -836,7 +836,13 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
         if ((perm_lock_bits & bit) && !(locked_perm & bit)) {
             ret = qemu_lock_fd(fd, off, 1, false);
             if (ret) {
-                error_setg(errp, "Failed to lock byte %d", off);
+                int err = -ret;
+
+                if (err == EAGAIN || err == EACCES) {
+                    error_setg(errp, "Failed to lock byte %d", off);
+                } else {
+                    error_setg_errno(errp, err, "Failed to lock byte %d", off);
+                }
                 return ret;
             } else if (s) {
                 s->locked_perm |= bit;
@@ -844,7 +850,13 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
         } else if (unlock && (locked_perm & bit) && !(perm_lock_bits & bit)) {
             ret = qemu_unlock_fd(fd, off, 1);
             if (ret) {
-                error_setg(errp, "Failed to unlock byte %d", off);
+                int err = -ret;
+
+                if (err == EAGAIN || err == EACCES) {
+                    error_setg(errp, "Failed to lock byte %d", off);
+                } else {
+                    error_setg_errno(errp, err, "Failed to lock byte %d", off);
+                }
                 return ret;
             } else if (s) {
                 s->locked_perm &= ~bit;
@@ -857,7 +869,13 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
         if ((shared_perm_lock_bits & bit) && !(locked_shared_perm & bit)) {
             ret = qemu_lock_fd(fd, off, 1, false);
             if (ret) {
-                error_setg(errp, "Failed to lock byte %d", off);
+                int err = -ret;
+
+                if (err == EAGAIN || err == EACCES) {
+                    error_setg(errp, "Failed to lock byte %d", off);
+                } else {
+                    error_setg_errno(errp, err, "Failed to lock byte %d", off);
+                }
                 return ret;
             } else if (s) {
                 s->locked_shared_perm |= bit;
@@ -866,7 +884,7 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
                    !(shared_perm_lock_bits & bit)) {
             ret = qemu_unlock_fd(fd, off, 1);
             if (ret) {
-                error_setg(errp, "Failed to unlock byte %d", off);
+                error_setg_errno(errp, -ret, "Failed to unlock byte %d", off);
                 return ret;
             } else if (s) {
                 s->locked_shared_perm &= ~bit;
@@ -890,9 +908,16 @@ static int raw_check_lock_bytes(int fd, uint64_t perm, uint64_t shared_perm,
             ret = qemu_lock_fd_test(fd, off, 1, true);
             if (ret) {
                 char *perm_name = bdrv_perm_names(p);
-                error_setg(errp,
-                           "Failed to get \"%s\" lock",
-                           perm_name);
+                int err = -ret;
+
+                if (err == EAGAIN || err == EACCES) {
+                    error_setg(errp, "Failed to get \"%s\" lock",
+                               perm_name);
+                } else {
+                    error_setg_errno(errp, err,
+                                     "Failed to get \"%s\" lock",
+                                     perm_name);
+                }
                 g_free(perm_name);
                 return ret;
             }
@@ -905,9 +930,16 @@ static int raw_check_lock_bytes(int fd, uint64_t perm, uint64_t shared_perm,
             ret = qemu_lock_fd_test(fd, off, 1, true);
             if (ret) {
                 char *perm_name = bdrv_perm_names(p);
-                error_setg(errp,
-                           "Failed to get shared \"%s\" lock",
-                           perm_name);
+                int err = -ret;
+
+                if (err == EAGAIN || err == EACCES) {
+                    error_setg(errp, "Failed to get shared \"%s\" lock",
+                               perm_name);
+                } else {
+                    error_setg_errno(errp, err,
+                                     "Failed to get shared \"%s\" lock",
+                                     perm_name);
+                }
                 g_free(perm_name);
                 return ret;
             }
diff --git a/tests/qemu-iotests/153.out b/tests/qemu-iotests/153.out
index ff8e55864a..14da13a1a5 100644
--- a/tests/qemu-iotests/153.out
+++ b/tests/qemu-iotests/153.out
@@ -11,11 +11,11 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t
 == Launching QEMU, opts: '' ==
 
 == Launching another QEMU, opts: '' ==
-QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock
+QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Launching another QEMU, opts: 'read-only=on' ==
-QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,read-only=on: Failed to get shared "write" lock
+QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,read-only=on: Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Launching another QEMU, opts: 'read-only=on,force-share=on' ==
@@ -23,77 +23,77 @@ Is another process using the image [TEST_DIR/t.qcow2]?
 == Running utility commands  ==
 
 _qemu_io_wrapper -c read 0 512 TEST_DIR/t.qcow2
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_io_wrapper -r -c read 0 512 TEST_DIR/t.qcow2
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_io_wrapper -c open  TEST_DIR/t.qcow2 -c read 0 512
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 no file open, try 'help open'
 
 _qemu_io_wrapper -c open -r  TEST_DIR/t.qcow2 -c read 0 512
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 no file open, try 'help open'
 
 _qemu_img_wrapper info TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper check TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper compare TEST_DIR/t.qcow2 TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper map TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper amend -o size=32M TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper commit TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper resize TEST_DIR/t.qcow2 32M
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper rebase TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper snapshot -l TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper convert TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.convert
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper dd if=TEST_DIR/t.qcow2 of=TEST_DIR/t.qcow2.convert bs=512 count=1
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper bench -c 1 TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper bench -w -c 1 TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper create -f qcow2 TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
-qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 file format: IMGFMT
 backing file format: IMGFMT
@@ -132,7 +132,7 @@ qemu-img: unrecognized option '-U'
 Try 'qemu-img --help' for more information
 
 _qemu_img_wrapper rebase -U TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper snapshot -l -U TEST_DIR/t.qcow2
@@ -158,7 +158,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t
 == Launching QEMU, opts: 'read-only=on' ==
 
 == Launching another QEMU, opts: '' ==
-QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock
+QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Launching another QEMU, opts: 'read-only=on' ==
@@ -168,13 +168,13 @@ Is another process using the image [TEST_DIR/t.qcow2]?
 == Running utility commands  ==
 
 _qemu_io_wrapper -c read 0 512 TEST_DIR/t.qcow2
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_io_wrapper -r -c read 0 512 TEST_DIR/t.qcow2
 
 _qemu_io_wrapper -c open  TEST_DIR/t.qcow2 -c read 0 512
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 no file open, try 'help open'
 
@@ -189,19 +189,19 @@ _qemu_img_wrapper compare TEST_DIR/t.qcow2 TEST_DIR/t.qcow2
 _qemu_img_wrapper map TEST_DIR/t.qcow2
 
 _qemu_img_wrapper amend -o size=32M TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper commit TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper resize TEST_DIR/t.qcow2 32M
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper rebase TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper snapshot -l TEST_DIR/t.qcow2
@@ -213,11 +213,11 @@ _qemu_img_wrapper dd if=TEST_DIR/t.qcow2 of=TEST_DIR/t.qcow2.convert bs=512 coun
 _qemu_img_wrapper bench -c 1 TEST_DIR/t.qcow2
 
 _qemu_img_wrapper bench -w -c 1 TEST_DIR/t.qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper create -f qcow2 TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
-qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 file format: IMGFMT
 backing file format: IMGFMT
@@ -256,7 +256,7 @@ qemu-img: unrecognized option '-U'
 Try 'qemu-img --help' for more information
 
 _qemu_img_wrapper rebase -U TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
-qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
+qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 _qemu_img_wrapper snapshot -l -U TEST_DIR/t.qcow2
@@ -377,17 +377,17 @@ qemu-img: Could not open 'TEST_DIR/t.qcow2': force-share=on can only be used wit
 Round done
 
 == Two devices with the same image (read-only=off - read-only=off) ==
-QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock
+QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Two devices with the same image (read-only=off - read-only=on) ==
-QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=on: Failed to get shared "write" lock
+QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=on: Failed to get shared "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Two devices with the same image (read-only=off - read-only=on,force-share=on) ==
 
 == Two devices with the same image (read-only=on - read-only=off) ==
-QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock
+QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Two devices with the same image (read-only=on - read-only=on) ==
@@ -408,13 +408,13 @@ Formatting 'TEST_DIR/t.IMGFMT.c', fmt=IMGFMT size=33554432 backing_file=TEST_DIR
 == Two devices sharing the same file in backing chain ==
 
 == Backing image also as an active device ==
-QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock
+QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Backing image also as an active device (ro) ==
 
 == Symbolic link ==
-QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock
+QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 == Active commit to intermediate layer should work when base in use ==
@@ -430,7 +430,7 @@ Adding drive
 {"return": "OKrn"}
 
 _qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 Creating overlay with qemu-img when the guest is running should be allowed
 
@@ -455,7 +455,7 @@ _qemu_img_wrapper info TEST_DIR/t.qcow2
 {"return": ""}
 
 _qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
-qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
+qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 Closing the other
 { 'execute': 'human-monitor-command',
diff --git a/tests/qemu-iotests/182.out b/tests/qemu-iotests/182.out
index 57f7265458..0e23f30f84 100644
--- a/tests/qemu-iotests/182.out
+++ b/tests/qemu-iotests/182.out
@@ -3,7 +3,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432
 Starting QEMU
 
 Starting a second QEMU using the same image should fail
-QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,id=drive0,file.locking=on: Failed to get "write" lock
+QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,id=drive0,file.locking=on: Failed to get "write" lock: Resource temporarily unavailable
 Is another process using the image [TEST_DIR/t.qcow2]?
 
 === Testing reopen ===
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v3] block: report errno when flock fcntl fails
  2021-01-07 17:55 [PATCH v3] block: report errno when flock fcntl fails David Edmondson
@ 2021-01-07 18:03 ` David Edmondson
  0 siblings, 0 replies; 2+ messages in thread
From: David Edmondson @ 2021-01-07 18:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: Kevin Wolf, Vladimir Sementsov-Ogievskiy,
	Philippe Mathieu-Daudé,
	qemu-block, Max Reitz

Ugh, please ignore this one. I didn't remove the test changes, but the
tests passed, which I don't understand.

On Thursday, 2021-01-07 at 17:55:38 GMT, David Edmondson wrote:

> When a call to fcntl(2) for the purpose of manipulating file locks
> fails with an error other than EAGAIN or EACCES, report the error
> returned by fcntl.
>
> EAGAIN or EACCES are elided as they are considered to be common
> failures, indicating that a conflicting lock is held by another
> process.
>
> Signed-off-by: David Edmondson <david.edmondson@oracle.com>
> ---
> v3:
> - Remove the now unnecessary updates to the test framework (Max).
> - Elide the error detail for EAGAIN or EACCES when locking (Kevin,
>   sort-of Max).
> - Philippe and Vladimir sent Reviewed-by, but things have changed
>   noticeably, so I didn't add them (dme).
>
>  block/file-posix.c         | 52 +++++++++++++++++++++-----
>  tests/qemu-iotests/153.out | 76 +++++++++++++++++++-------------------
>  tests/qemu-iotests/182.out |  2 +-
>  3 files changed, 81 insertions(+), 49 deletions(-)
>
> diff --git a/block/file-posix.c b/block/file-posix.c
> index 00cdaaa2d4..c5142f7ffa 100644
> --- a/block/file-posix.c
> +++ b/block/file-posix.c
> @@ -836,7 +836,13 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
>          if ((perm_lock_bits & bit) && !(locked_perm & bit)) {
>              ret = qemu_lock_fd(fd, off, 1, false);
>              if (ret) {
> -                error_setg(errp, "Failed to lock byte %d", off);
> +                int err = -ret;
> +
> +                if (err == EAGAIN || err == EACCES) {
> +                    error_setg(errp, "Failed to lock byte %d", off);
> +                } else {
> +                    error_setg_errno(errp, err, "Failed to lock byte %d", off);
> +                }
>                  return ret;
>              } else if (s) {
>                  s->locked_perm |= bit;
> @@ -844,7 +850,13 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
>          } else if (unlock && (locked_perm & bit) && !(perm_lock_bits & bit)) {
>              ret = qemu_unlock_fd(fd, off, 1);
>              if (ret) {
> -                error_setg(errp, "Failed to unlock byte %d", off);
> +                int err = -ret;
> +
> +                if (err == EAGAIN || err == EACCES) {
> +                    error_setg(errp, "Failed to lock byte %d", off);
> +                } else {
> +                    error_setg_errno(errp, err, "Failed to lock byte %d", off);
> +                }
>                  return ret;
>              } else if (s) {
>                  s->locked_perm &= ~bit;
> @@ -857,7 +869,13 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
>          if ((shared_perm_lock_bits & bit) && !(locked_shared_perm & bit)) {
>              ret = qemu_lock_fd(fd, off, 1, false);
>              if (ret) {
> -                error_setg(errp, "Failed to lock byte %d", off);
> +                int err = -ret;
> +
> +                if (err == EAGAIN || err == EACCES) {
> +                    error_setg(errp, "Failed to lock byte %d", off);
> +                } else {
> +                    error_setg_errno(errp, err, "Failed to lock byte %d", off);
> +                }
>                  return ret;
>              } else if (s) {
>                  s->locked_shared_perm |= bit;
> @@ -866,7 +884,7 @@ static int raw_apply_lock_bytes(BDRVRawState *s, int fd,
>                     !(shared_perm_lock_bits & bit)) {
>              ret = qemu_unlock_fd(fd, off, 1);
>              if (ret) {
> -                error_setg(errp, "Failed to unlock byte %d", off);
> +                error_setg_errno(errp, -ret, "Failed to unlock byte %d", off);
>                  return ret;
>              } else if (s) {
>                  s->locked_shared_perm &= ~bit;
> @@ -890,9 +908,16 @@ static int raw_check_lock_bytes(int fd, uint64_t perm, uint64_t shared_perm,
>              ret = qemu_lock_fd_test(fd, off, 1, true);
>              if (ret) {
>                  char *perm_name = bdrv_perm_names(p);
> -                error_setg(errp,
> -                           "Failed to get \"%s\" lock",
> -                           perm_name);
> +                int err = -ret;
> +
> +                if (err == EAGAIN || err == EACCES) {
> +                    error_setg(errp, "Failed to get \"%s\" lock",
> +                               perm_name);
> +                } else {
> +                    error_setg_errno(errp, err,
> +                                     "Failed to get \"%s\" lock",
> +                                     perm_name);
> +                }
>                  g_free(perm_name);
>                  return ret;
>              }
> @@ -905,9 +930,16 @@ static int raw_check_lock_bytes(int fd, uint64_t perm, uint64_t shared_perm,
>              ret = qemu_lock_fd_test(fd, off, 1, true);
>              if (ret) {
>                  char *perm_name = bdrv_perm_names(p);
> -                error_setg(errp,
> -                           "Failed to get shared \"%s\" lock",
> -                           perm_name);
> +                int err = -ret;
> +
> +                if (err == EAGAIN || err == EACCES) {
> +                    error_setg(errp, "Failed to get shared \"%s\" lock",
> +                               perm_name);
> +                } else {
> +                    error_setg_errno(errp, err,
> +                                     "Failed to get shared \"%s\" lock",
> +                                     perm_name);
> +                }
>                  g_free(perm_name);
>                  return ret;
>              }
> diff --git a/tests/qemu-iotests/153.out b/tests/qemu-iotests/153.out
> index ff8e55864a..14da13a1a5 100644
> --- a/tests/qemu-iotests/153.out
> +++ b/tests/qemu-iotests/153.out
> @@ -11,11 +11,11 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t
>  == Launching QEMU, opts: '' ==
>  
>  == Launching another QEMU, opts: '' ==
> -QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock
> +QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Launching another QEMU, opts: 'read-only=on' ==
> -QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,read-only=on: Failed to get shared "write" lock
> +QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,read-only=on: Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Launching another QEMU, opts: 'read-only=on,force-share=on' ==
> @@ -23,77 +23,77 @@ Is another process using the image [TEST_DIR/t.qcow2]?
>  == Running utility commands  ==
>  
>  _qemu_io_wrapper -c read 0 512 TEST_DIR/t.qcow2
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_io_wrapper -r -c read 0 512 TEST_DIR/t.qcow2
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_io_wrapper -c open  TEST_DIR/t.qcow2 -c read 0 512
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  no file open, try 'help open'
>  
>  _qemu_io_wrapper -c open -r  TEST_DIR/t.qcow2 -c read 0 512
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  no file open, try 'help open'
>  
>  _qemu_img_wrapper info TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper check TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper compare TEST_DIR/t.qcow2 TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper map TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper amend -o size=32M TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper commit TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper resize TEST_DIR/t.qcow2 32M
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper rebase TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper snapshot -l TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper convert TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.convert
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper dd if=TEST_DIR/t.qcow2 of=TEST_DIR/t.qcow2.convert bs=512 count=1
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper bench -c 1 TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper bench -w -c 1 TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper create -f qcow2 TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
> -qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  file format: IMGFMT
>  backing file format: IMGFMT
> @@ -132,7 +132,7 @@ qemu-img: unrecognized option '-U'
>  Try 'qemu-img --help' for more information
>  
>  _qemu_img_wrapper rebase -U TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper snapshot -l -U TEST_DIR/t.qcow2
> @@ -158,7 +158,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432 backing_file=TEST_DIR/t
>  == Launching QEMU, opts: 'read-only=on' ==
>  
>  == Launching another QEMU, opts: '' ==
> -QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock
> +QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Launching another QEMU, opts: 'read-only=on' ==
> @@ -168,13 +168,13 @@ Is another process using the image [TEST_DIR/t.qcow2]?
>  == Running utility commands  ==
>  
>  _qemu_io_wrapper -c read 0 512 TEST_DIR/t.qcow2
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_io_wrapper -r -c read 0 512 TEST_DIR/t.qcow2
>  
>  _qemu_io_wrapper -c open  TEST_DIR/t.qcow2 -c read 0 512
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  no file open, try 'help open'
>  
> @@ -189,19 +189,19 @@ _qemu_img_wrapper compare TEST_DIR/t.qcow2 TEST_DIR/t.qcow2
>  _qemu_img_wrapper map TEST_DIR/t.qcow2
>  
>  _qemu_img_wrapper amend -o size=32M TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper commit TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper resize TEST_DIR/t.qcow2 32M
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper rebase TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper snapshot -l TEST_DIR/t.qcow2
> @@ -213,11 +213,11 @@ _qemu_img_wrapper dd if=TEST_DIR/t.qcow2 of=TEST_DIR/t.qcow2.convert bs=512 coun
>  _qemu_img_wrapper bench -c 1 TEST_DIR/t.qcow2
>  
>  _qemu_img_wrapper bench -w -c 1 TEST_DIR/t.qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper create -f qcow2 TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
> -qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-img: TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  file format: IMGFMT
>  backing file format: IMGFMT
> @@ -256,7 +256,7 @@ qemu-img: unrecognized option '-U'
>  Try 'qemu-img --help' for more information
>  
>  _qemu_img_wrapper rebase -U TEST_DIR/t.qcow2 -b TEST_DIR/t.qcow2.base -F qcow2
> -qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock
> +qemu-img: Could not open 'TEST_DIR/t.qcow2': Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  _qemu_img_wrapper snapshot -l -U TEST_DIR/t.qcow2
> @@ -377,17 +377,17 @@ qemu-img: Could not open 'TEST_DIR/t.qcow2': force-share=on can only be used wit
>  Round done
>  
>  == Two devices with the same image (read-only=off - read-only=off) ==
> -QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock
> +QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Two devices with the same image (read-only=off - read-only=on) ==
> -QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=on: Failed to get shared "write" lock
> +QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=on: Failed to get shared "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Two devices with the same image (read-only=off - read-only=on,force-share=on) ==
>  
>  == Two devices with the same image (read-only=on - read-only=off) ==
> -QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock
> +QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2,read-only=off: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Two devices with the same image (read-only=on - read-only=on) ==
> @@ -408,13 +408,13 @@ Formatting 'TEST_DIR/t.IMGFMT.c', fmt=IMGFMT size=33554432 backing_file=TEST_DIR
>  == Two devices sharing the same file in backing chain ==
>  
>  == Backing image also as an active device ==
> -QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock
> +QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Backing image also as an active device (ro) ==
>  
>  == Symbolic link ==
> -QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock
> +QEMU_PROG: -drive if=none,file=TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  == Active commit to intermediate layer should work when base in use ==
> @@ -430,7 +430,7 @@ Adding drive
>  {"return": "OKrn"}
>  
>  _qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  Creating overlay with qemu-img when the guest is running should be allowed
>  
> @@ -455,7 +455,7 @@ _qemu_img_wrapper info TEST_DIR/t.qcow2
>  {"return": ""}
>  
>  _qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
> -qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
> +qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  Closing the other
>  { 'execute': 'human-monitor-command',
> diff --git a/tests/qemu-iotests/182.out b/tests/qemu-iotests/182.out
> index 57f7265458..0e23f30f84 100644
> --- a/tests/qemu-iotests/182.out
> +++ b/tests/qemu-iotests/182.out
> @@ -3,7 +3,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33554432
>  Starting QEMU
>  
>  Starting a second QEMU using the same image should fail
> -QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,id=drive0,file.locking=on: Failed to get "write" lock
> +QEMU_PROG: -drive file=TEST_DIR/t.qcow2,if=none,id=drive0,file.locking=on: Failed to get "write" lock: Resource temporarily unavailable
>  Is another process using the image [TEST_DIR/t.qcow2]?
>  
>  === Testing reopen ===
> -- 
> 2.29.2

dme.
-- 
Music has magic, it's good clear syncopation.


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-01-07 18:05 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-07 17:55 [PATCH v3] block: report errno when flock fcntl fails David Edmondson
2021-01-07 18:03 ` David Edmondson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.