From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Max Reitz <mreitz@redhat.com>,
"open list:Network Block Dev..." <qemu-block@nongnu.org>
Subject: [Qemu-devel] [PULL 20/20] qemu-nbd: Add --bitmap=NAME option
Date: Mon, 14 Jan 2019 10:26:05 -0600 [thread overview]
Message-ID: <20190114162605.5330-21-eblake@redhat.com> (raw)
In-Reply-To: <20190114162605.5330-1-eblake@redhat.com>
Having to fire up qemu, then use QMP commands for nbd-server-start
and nbd-server-add, just to expose a persistent dirty bitmap, is
rather tedious. Make it possible to expose a dirty bitmap using
just qemu-nbd (of course, for now this only works when qemu-nbd is
visiting a BDS formatted as qcow2).
Of course, any good feature also needs unit testing, so expand
iotest 223 to cover it.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20190111194720.15671-9-eblake@redhat.com>
---
qemu-nbd.texi | 4 ++++
qemu-nbd.c | 10 ++++++++--
tests/qemu-iotests/223 | 18 +++++++++++++++++-
tests/qemu-iotests/223.out | 12 +++++++++++-
4 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/qemu-nbd.texi b/qemu-nbd.texi
index 9a84e81eed9..96b1546006a 100644
--- a/qemu-nbd.texi
+++ b/qemu-nbd.texi
@@ -45,6 +45,10 @@ auto-detecting
Export the disk as read-only
@item -P, --partition=@var{num}
Only expose partition @var{num}
+@item -B, --bitmap=@var{name}
+If @var{filename} has a qcow2 persistent bitmap @var{name}, expose
+that bitmap via the ``qemu:dirty-bitmap:@var{name}'' context
+accessible through NBD_OPT_SET_META_CONTEXT.
@item -s, --snapshot
Use @var{filename} as an external snapshot, create a temporary
file with backing_file=@var{filename}, redirect the write to
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 1552274c189..51b55f2e066 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -95,6 +95,7 @@ static void usage(const char *name)
"Exposing part of the image:\n"
" -o, --offset=OFFSET offset into the image\n"
" -P, --partition=NUM only expose partition NUM\n"
+" -B, --bitmap=NAME expose a persistent dirty bitmap\n"
"\n"
"General purpose options:\n"
" --object type,id=ID,... define an object such as 'secret' for providing\n"
@@ -509,7 +510,7 @@ int main(int argc, char **argv)
off_t fd_size;
QemuOpts *sn_opts = NULL;
const char *sn_id_or_name = NULL;
- const char *sopt = "hVb:o:p:rsnP:c:dvk:e:f:tl:x:T:D:";
+ const char *sopt = "hVb:o:p:rsnP:c:dvk:e:f:tl:x:T:D:B:";
struct option lopt[] = {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'V' },
@@ -519,6 +520,7 @@ int main(int argc, char **argv)
{ "offset", required_argument, NULL, 'o' },
{ "read-only", no_argument, NULL, 'r' },
{ "partition", required_argument, NULL, 'P' },
+ { "bitmap", required_argument, NULL, 'B' },
{ "connect", required_argument, NULL, 'c' },
{ "disconnect", no_argument, NULL, 'd' },
{ "snapshot", no_argument, NULL, 's' },
@@ -558,6 +560,7 @@ int main(int argc, char **argv)
QDict *options = NULL;
const char *export_name = ""; /* Default export name */
const char *export_description = NULL;
+ const char *bitmap = NULL;
const char *tlscredsid = NULL;
bool imageOpts = false;
bool writethrough = true;
@@ -695,6 +698,9 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
break;
+ case 'B':
+ bitmap = optarg;
+ break;
case 'k':
sockpath = optarg;
if (sockpath[0] != '/') {
@@ -1016,7 +1022,7 @@ int main(int argc, char **argv)
}
export = nbd_export_new(bs, dev_offset, fd_size, export_name,
- export_description, NULL, nbdflags,
+ export_description, bitmap, nbdflags,
nbd_export_closed, writethrough, NULL,
&error_fatal);
diff --git a/tests/qemu-iotests/223 b/tests/qemu-iotests/223
index 0bcc98a8677..773892dbe60 100755
--- a/tests/qemu-iotests/223
+++ b/tests/qemu-iotests/223
@@ -25,6 +25,7 @@ status=1 # failure is the default!
_cleanup()
{
+ nbd_server_stop
_cleanup_test_img
_cleanup_qemu
rm -f "$TEST_DIR/nbd"
@@ -35,6 +36,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
. ./common.rc
. ./common.filter
. ./common.qemu
+. ./common.nbd
_supported_fmt qcow2
_supported_proto file # uses NBD as well
@@ -163,7 +165,7 @@ $QEMU_IMG map --output=json --image-opts \
"$IMG,x-dirty-bitmap=qemu:dirty-bitmap:b2" | _filter_qemu_img_map
echo
-echo "=== End NBD server ==="
+echo "=== End qemu NBD server ==="
echo
_send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-remove",
@@ -176,6 +178,20 @@ _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-stop"}' "return"
_send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-stop"}' "error" # Again
_send_qemu_cmd $QEMU_HANDLE '{"execute":"quit"}' "return"
+echo
+echo "=== Use qemu-nbd as server ==="
+echo
+
+nbd_server_start_unix_socket -r -f $IMGFMT -B b "$TEST_IMG"
+IMG="driver=nbd,server.type=unix,server.path=$nbd_unix_socket"
+$QEMU_IMG map --output=json --image-opts \
+ "$IMG,x-dirty-bitmap=qemu:dirty-bitmap:b" | _filter_qemu_img_map
+
+nbd_server_start_unix_socket -f $IMGFMT -B b2 "$TEST_IMG"
+IMG="driver=nbd,server.type=unix,server.path=$nbd_unix_socket"
+$QEMU_IMG map --output=json --image-opts \
+ "$IMG,x-dirty-bitmap=qemu:dirty-bitmap:b2" | _filter_qemu_img_map
+
# success, all done
echo '*** done'
rm -f $seq.full
diff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out
index ebd3935c974..0de5240a75e 100644
--- a/tests/qemu-iotests/223.out
+++ b/tests/qemu-iotests/223.out
@@ -61,7 +61,7 @@ read 2097152/2097152 bytes at offset 2097152
{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true},
{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}]
-=== End NBD server ===
+=== End qemu NBD server ===
{"return": {}}
{"return": {}}
@@ -69,4 +69,14 @@ read 2097152/2097152 bytes at offset 2097152
{"return": {}}
{"error": {"class": "GenericError", "desc": "NBD server not running"}}
{"return": {}}
+
+=== Use qemu-nbd as server ===
+
+[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false},
+{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true},
+{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}]
+[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true},
+{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false},
+{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true},
+{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}]
*** done
--
2.20.1
next prev parent reply other threads:[~2019-01-14 16:27 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-14 16:25 [Qemu-devel] [PULL 00/20] NBD patches through 2019-01-14 Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 01/20] blockdev: abort transactions in reverse order Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 02/20] block/dirty-bitmap: remove assertion from restore Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 03/20] blockdev: n-ary bitmap merge Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 04/20] block: remove 'x' prefix from experimental bitmap APIs Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 05/20] iotests.py: don't abort if IMGKEYSECRET is undefined Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 06/20] iotests: add filter_generated_node_ids Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 07/20] iotests: add qmp recursive sorting function Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 08/20] iotests: remove default filters from qmp_log Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 09/20] iotests: change qmp_log filters to expect QMP objects only Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 10/20] iotests: implement pretty-print for log and qmp_log Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 11/20] iotests: add iotest 236 for testing bitmap merge Eric Blake
2019-01-30 17:27 ` Kevin Wolf
2019-01-30 17:58 ` John Snow
2019-01-31 2:03 ` John Snow
2019-01-31 8:55 ` Kevin Wolf
2019-02-01 20:16 ` John Snow
2019-01-14 16:25 ` [Qemu-devel] [PULL 12/20] qemu-nbd: Rename 'exp' variable clashing with math::exp() symbol Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 13/20] nbd: Add some error case testing to iotests 223 Eric Blake
2019-01-14 16:25 ` [Qemu-devel] [PULL 14/20] nbd: Forbid nbd-server-stop when server is not running Eric Blake
2019-01-14 16:26 ` [Qemu-devel] [PULL 15/20] nbd: Only require disabled bitmap for read-only exports Eric Blake
2019-01-14 16:26 ` [Qemu-devel] [PULL 16/20] nbd: Merge nbd_export_set_name into nbd_export_new Eric Blake
2019-01-14 16:26 ` [Qemu-devel] [PULL 17/20] nbd: Allow bitmap export during QMP nbd-server-add Eric Blake
2019-01-14 16:26 ` [Qemu-devel] [PULL 18/20] nbd: Remove x-nbd-server-add-bitmap Eric Blake
2019-01-14 16:26 ` [Qemu-devel] [PULL 19/20] nbd: Merge nbd_export_bitmap into nbd_export_new Eric Blake
2019-02-07 18:40 ` Peter Maydell
2019-02-07 19:00 ` Eric Blake
2019-02-07 19:05 ` Peter Maydell
2019-02-07 19:17 ` Eric Blake
2019-01-14 16:26 ` Eric Blake [this message]
2019-01-15 17:23 ` [Qemu-devel] [PULL 00/20] NBD patches through 2019-01-14 Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190114162605.5330-21-eblake@redhat.com \
--to=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).