Message ID | 20210107175538.381304-1-david.edmondson@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] block: report errno when flock fcntl fails | expand |
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.
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 ===
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(-)