[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-commits] [qemu/qemu] 3d9330: MAINTAINERS: add Vladimir as co-maint
From: |
Peter Maydell |
Subject: |
[Qemu-commits] [qemu/qemu] 3d9330: MAINTAINERS: add Vladimir as co-maintainer of NBD |
Date: |
Thu, 11 Mar 2021 06:02:49 -0800 |
Branch: refs/heads/staging
Home: https://github.com/qemu/qemu
Commit: 3d9330ece5c5cb7b5e8fec1bef4da8fe78134fc2
https://github.com/qemu/qemu/commit/3d9330ece5c5cb7b5e8fec1bef4da8fe78134fc2
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M MAINTAINERS
Log Message:
-----------
MAINTAINERS: add Vladimir as co-maintainer of NBD
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20210304103503.21008-1-vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 0da9856851dcca09222a1467e16ddd05dc66e460
https://github.com/qemu/qemu/commit/0da9856851dcca09222a1467e16ddd05dc66e460
Author: Nir Soffer <nirsof@gmail.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M nbd/server.c
M tests/qemu-iotests/241.out
Log Message:
-----------
nbd: server: Report holes for raw images
When querying image extents for raw image, qemu-nbd reports holes as
zero:
$ qemu-nbd -t -r -f raw empty-6g.raw
$ qemu-img map --output json nbd://localhost
[{ "start": 0, "length": 6442450944, "depth": 0, "zero": true, "data": true,
"offset": 0}]
$ qemu-img map --output json empty-6g.raw
[{ "start": 0, "length": 6442450944, "depth": 0, "zero": true, "data": false,
"offset": 0}]
Turns out that qemu-img map reports a hole based on BDRV_BLOCK_DATA, but
nbd server reports a hole based on BDRV_BLOCK_ALLOCATED.
The NBD protocol says:
NBD_STATE_HOLE (bit 0): if set, the block represents a hole (and
future writes to that area may cause fragmentation or encounter an
NBD_ENOSPC error); if clear, the block is allocated or the server
could not otherwise determine its status.
qemu-img manual says:
whether the sectors contain actual data or not (boolean field data;
if false, the sectors are either unallocated or stored as
optimized all-zero clusters);
To me, data=false looks compatible with NBD_STATE_HOLE. From user point
of view, getting same results from qemu-nbd and qemu-img is more
important than being more correct about allocation status.
Changing nbd server to report holes using BDRV_BLOCK_DATA makes qemu-nbd
results compatible with qemu-img map:
$ qemu-img map --output json nbd://localhost
[{ "start": 0, "length": 6442450944, "depth": 0, "zero": true, "data": false,
"offset": 0}]
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
Message-Id: <20210219160752.1826830-1-nsoffer@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 1657ba44b449471c665bc5d358ca33af411710f3
https://github.com/qemu/qemu/commit/1657ba44b449471c665bc5d358ca33af411710f3
Author: Eric Blake <eblake@redhat.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M tests/test-cutils.c
Log Message:
-----------
utils: Enhance testsuite for do_strtosz()
Enhance our testsuite coverage of do_strtosz() to cover some things we
know that existing users want to continue working (hex bytes), as well
as some things that accidentally work but shouldn't (hex fractions) or
accidentally fail but that users want to work (64-bit precision on
byte values). This includes fixing a typo in the comment regarding
our parsing near 2^64.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210211204438.1184395-2-eblake@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Commit: cf923b783efd565787e9ab006fb5608bb2a7297b
https://github.com/qemu/qemu/commit/cf923b783efd565787e9ab006fb5608bb2a7297b
Author: Eric Blake <eblake@redhat.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M tests/qemu-iotests/049.out
M tests/qemu-iotests/178.out.qcow2
M tests/qemu-iotests/178.out.raw
M tests/test-cutils.c
M tests/test-keyval.c
M tests/test-qemu-opts.c
M util/cutils.c
Log Message:
-----------
utils: Improve qemu_strtosz() to have 64 bits of precision
We have multiple clients of qemu_strtosz (qemu-io, the opts visitor,
the keyval visitor), and it gets annoying that edge-case testing is
impacted by implicit rounding to 53 bits of precision due to parsing
with strtod(). As an example posted by Rich Jones:
$ nbdkit memory $(( 2**63 - 2**30 )) --run \
'build/qemu-io -f raw "$uri" -c "w -P 3 $(( 2**63 - 2**30 - 512 )) 512" '
write failed: Input/output error
because 9223372035781033472 got rounded to 0x7fffffffc0000000 which is
out of bounds.
It is also worth noting that our existing parser, by virtue of using
strtod(), accepts decimal AND hex numbers, even though test-cutils
previously lacked any coverage of the latter until the previous patch.
We do have existing clients that expect a hex parse to work (for
example, iotest 33 using qemu-io -c "write -P 0xa 0x200 0x400"), but
strtod() parses "08" as 8 rather than as an invalid octal number, so
we know there are no clients that depend on octal. Our use of
strtod() also means that "0x1.8k" would actually parse as 1536 (the
fraction is 8/16), rather than 1843 (if the fraction were 8/10); but
as this was not covered in the testsuite, I have no qualms forbidding
hex fractions as invalid, so this patch declares that the use of
fractions is only supported with decimal input, and enhances the
testsuite to document that.
Our previous use of strtod() meant that -1 parsed as a negative; now
that we parse with strtoull(), negative values can wrap around modulo
2^64, so we have to explicitly check whether the user passed in a '-';
and make it consistent to also reject '-0'. This has the minor effect
of treating negative values as EINVAL (with no change to endptr)
rather than ERANGE (with endptr advanced to what was parsed), visible
in the updated iotest output.
We also had no testsuite coverage of "1.1e0k", which happened to parse
under strtod() but is unlikely to occur in practice; as long as we are
making things more robust, it is easy enough to reject the use of
exponents in a strtod parse.
The fix is done by breaking the parse into an integer prefix (no loss
in precision), rejecting negative values (since we can no longer rely
on strtod() to do that), determining if a decimal or hexadecimal parse
was intended (with the new restriction that a fractional hex parse is
not allowed), and where appropriate, using a floating point fractional
parse (where we also scan to reject use of exponents in the fraction).
The bulk of the patch is then updates to the testsuite to match our
new precision, as well as adding new cases we reject (whether they
were rejected or inadvertently accepted before).
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210211204438.1184395-3-eblake@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Commit: f174cd3350c5e97db000e7383be974c66046b8f5
https://github.com/qemu/qemu/commit/f174cd3350c5e97db000e7383be974c66046b8f5
Author: Eric Blake <eblake@redhat.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M docs/system/deprecated.rst
M util/cutils.c
Log Message:
-----------
utils: Deprecate hex-with-suffix sizes
Supporting '0x20M' looks odd, particularly since we have a 'B' suffix
that is ambiguous for bytes, as well as a less-frequently-used 'E'
suffix for extremely large exibytes. In practice, people using hex
inputs are specifying values in bytes (and would have written
0x2000000, or possibly relied on default_suffix in the case of
qemu_strtosz_MiB), and the use of scaling suffixes makes the most
sense for inputs in decimal (where the user would write 32M). But
rather than outright dropping support for hex-with-suffix, let's
follow our deprecation policy. Sadly, since qemu_strtosz() does not
have an Err** parameter, and plumbing that in would be a much larger
task, we instead go with just directly emitting the deprecation
warning to stderr.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210211204438.1184395-4-eblake@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Commit: bc520249595845d387aa5b5e4eeeade673931a98
https://github.com/qemu/qemu/commit/bc520249595845d387aa5b5e4eeeade673931a98
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/blkdebug.c
M block/blklogwrites.c
M block/blkreplay.c
M block/blkverify.c
M block/qcow2.c
M block/quorum.c
Log Message:
-----------
block: check return value of bdrv_open_child and drop error propagation
This patch is generated by cocci script:
@@
symbol bdrv_open_child, errp, local_err;
expression file;
@@
file = bdrv_open_child(...,
- &local_err
+ errp
);
- if (local_err)
+ if (!file)
{
...
- error_propagate(errp, local_err);
...
}
with command
spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h \
--in-place --no-show-diff --max-width 80 --use-gitgrep block
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-4-vsementsov@virtuozzo.com>
[eblake: fix qcow2_do_open() to use ERRP_GUARD, necessary as the only
caller to pass allow_none=true]
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 5a11a1ca0d0ed5be52070f1da8de89ef85941183
https://github.com/qemu/qemu/commit/5a11a1ca0d0ed5be52070f1da8de89ef85941183
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M blockdev.c
Log Message:
-----------
blockdev: fix drive_backup_prepare() missed error
We leak local_err and don't report failure to the caller. It's
definitely wrong, let's fix.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-5-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: dc9c10a1f42235a7f8411feca28984c4e7da3177
https://github.com/qemu/qemu/commit/dc9c10a1f42235a7f8411feca28984c4e7da3177
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block.c
Log Message:
-----------
block: drop extra error propagation for bdrv_set_backing_hd
bdrv_set_backing_hd now returns status, let's use it.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-6-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: eb5becc18fff6ba43922a169a64029e7e26ef86a
https://github.com/qemu/qemu/commit/eb5becc18fff6ba43922a169a64029e7e26ef86a
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/mirror.c
Log Message:
-----------
block/mirror: drop extra error propagation in commit_active_start()
Let's check return value of mirror_start_job to check for failure
instead of local_err.
Rename ret to job, as ret is usually integer variable.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-7-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 775d0c050866c3571b8599291b3ff65fdbd63ed8
https://github.com/qemu/qemu/commit/775d0c050866c3571b8599291b3ff65fdbd63ed8
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M blockjob.c
M include/block/blockjob.h
Log Message:
-----------
blockjob: return status from block_job_set_speed()
Better to return status together with setting errp. It allows to avoid
error propagation in the caller.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-8-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 83bad8cbf5c1276499cee13710db56c0101faa69
https://github.com/qemu/qemu/commit/83bad8cbf5c1276499cee13710db56c0101faa69
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qcow2-bitmap.c
M block/qcow2.c
M block/qcow2.h
Log Message:
-----------
block/qcow2: qcow2_get_specific_info(): drop error propagation
Don't use error propagation in qcow2_get_specific_info(). For this
refactor qcow2_get_bitmap_info_list, its current interface is rather
weird.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20210202124956.63146-9-vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
[eblake: separate local 'tail' variable from 'info_list' parameter]
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 0c1e9d2a9a3b6dd5ce74092019882fbce691d081
https://github.com/qemu/qemu/commit/0c1e9d2a9a3b6dd5ce74092019882fbce691d081
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qcow2-bitmap.c
M block/qcow2.c
M block/qcow2.h
Log Message:
-----------
block/qcow2-bitmap: improve qcow2_load_dirty_bitmaps() interface
It's recommended for bool functions with errp to return true on success
and false on failure. Non-standard interfaces don't help to understand
the code. The change is also needed to reduce error propagation.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Message-Id: <20210202124956.63146-10-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 526e31de993431569ad3b8bdf461ef26d03c404d
https://github.com/qemu/qemu/commit/526e31de993431569ad3b8bdf461ef26d03c404d
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qcow2-bitmap.c
M block/qcow2.h
Log Message:
-----------
block/qcow2-bitmap: return status from qcow2_store_persistent_dirty_bitmaps
It's better to return status together with setting errp. It makes
possible to avoid error propagation.
While being here, put ERRP_GUARD() to fix error_prepend(errp, ...)
usage inside qcow2_store_persistent_dirty_bitmaps() (see the comment
above ERRP_GUARD() definition in include/qapi/error.h)
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-11-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 772c4cad13b97b8e8ef8592228707f7a5557f939
https://github.com/qemu/qemu/commit/772c4cad13b97b8e8ef8592228707f7a5557f939
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qcow2.c
Log Message:
-----------
block/qcow2: read_cache_sizes: return status value
It's better to return status together with setting errp. It allows to
reduce error propagation.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-12-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: e6247c9c9f9e4d01b00036f017da53d130981727
https://github.com/qemu/qemu/commit/e6247c9c9f9e4d01b00036f017da53d130981727
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qcow2.c
Log Message:
-----------
block/qcow2: simplify qcow2_co_invalidate_cache()
qcow2_do_open correctly sets errp on each failure path. So, we can
simplify code in qcow2_co_invalidate_cache() and drop explicit error
propagation.
Add ERRP_GUARD() as mandated by the documentation in
include/qapi/error.h so that error_prepend() is actually called even if
errp is &error_fatal.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Message-Id: <20210202124956.63146-13-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 15ce94a68ca6730466c565c3d29971aab3087bf1
https://github.com/qemu/qemu/commit/15ce94a68ca6730466c565c3d29971aab3087bf1
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qed.c
Log Message:
-----------
block/qed: bdrv_qed_do_open: deal with errp
Always set errp on failure. The generic bdrv_open_driver supports
driver functions which can return a negative value but forget to set
errp. That's a strange thing. Let's improve bdrv_qed_do_open to not
behave this way. This allows the simplification of code in
bdrv_qed_co_invalidate_cache().
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Message-Id: <20210202124956.63146-14-vsementsov@virtuozzo.com>
[eblake: commit message grammar tweak]
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 1184b411016bce7590723170aa6b5984518707ec
https://github.com/qemu/qemu/commit/1184b411016bce7590723170aa6b5984518707ec
Author: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Date: 2021-03-08 (Mon, 08 Mar 2021)
Changed paths:
M block/qcow2.c
Log Message:
-----------
block/qcow2: refactor qcow2_update_options_prepare error paths
Keep setting ret close to setting errp and don't merge different error
paths into one. This way it's more obvious that we don't return
error without setting errp.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-15-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Commit: 9abda42bf2f5aa6ef403d3140fd3d7d88e8064e9
https://github.com/qemu/qemu/commit/9abda42bf2f5aa6ef403d3140fd3d7d88e8064e9
Author: Peter Maydell <peter.maydell@linaro.org>
Date: 2021-03-11 (Thu, 11 Mar 2021)
Changed paths:
M MAINTAINERS
M block.c
M block/blkdebug.c
M block/blklogwrites.c
M block/blkreplay.c
M block/blkverify.c
M block/mirror.c
M block/qcow2-bitmap.c
M block/qcow2.c
M block/qcow2.h
M block/qed.c
M block/quorum.c
M blockdev.c
M blockjob.c
M docs/system/deprecated.rst
M include/block/blockjob.h
M nbd/server.c
M tests/qemu-iotests/049.out
M tests/qemu-iotests/178.out.qcow2
M tests/qemu-iotests/178.out.raw
M tests/qemu-iotests/241.out
M tests/test-cutils.c
M tests/test-keyval.c
M tests/test-qemu-opts.c
M util/cutils.c
Log Message:
-----------
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2021-03-09' into
staging
nbd patches for 2021-03-09
- Add Vladimir as NBD co-maintainer
- Fix reporting of holes in NBD_CMD_BLOCK_STATUS
- Improve command-line parsing accuracy of large numbers (anything going
through qemu_strtosz), including the deprecation of hex+suffix
- Improve some error reporting in the block layer
# gpg: Signature made Tue 09 Mar 2021 15:38:10 GMT
# gpg: using RSA key 71C2CC22B1C4602927D2F3AAA7A16B4A2527436A
# gpg: Good signature from "Eric Blake <eblake@redhat.com>" [full]
# gpg: aka "Eric Blake (Free Software Programmer)
<ebb9@byu.net>" [full]
# gpg: aka "[jpeg image of size 6874]" [full]
# Primary key fingerprint: 71C2 CC22 B1C4 6029 27D2 F3AA A7A1 6B4A 2527 436A
* remotes/ericb/tags/pull-nbd-2021-03-09:
block/qcow2: refactor qcow2_update_options_prepare error paths
block/qed: bdrv_qed_do_open: deal with errp
block/qcow2: simplify qcow2_co_invalidate_cache()
block/qcow2: read_cache_sizes: return status value
block/qcow2-bitmap: return status from qcow2_store_persistent_dirty_bitmaps
block/qcow2-bitmap: improve qcow2_load_dirty_bitmaps() interface
block/qcow2: qcow2_get_specific_info(): drop error propagation
blockjob: return status from block_job_set_speed()
block/mirror: drop extra error propagation in commit_active_start()
block: drop extra error propagation for bdrv_set_backing_hd
blockdev: fix drive_backup_prepare() missed error
block: check return value of bdrv_open_child and drop error propagation
utils: Deprecate hex-with-suffix sizes
utils: Improve qemu_strtosz() to have 64 bits of precision
utils: Enhance testsuite for do_strtosz()
nbd: server: Report holes for raw images
MAINTAINERS: add Vladimir as co-maintainer of NBD
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Compare: https://github.com/qemu/qemu/compare/363fc963054d...9abda42bf2f5
- [Qemu-commits] [qemu/qemu] 3d9330: MAINTAINERS: add Vladimir as co-maintainer of NBD,
Peter Maydell <=