Compare commits
No commits in common. "imports/c9-beta/libnbd-1.8.2-3.el9" and "c8-stream-rhel" have entirely different histories.
imports/c9
...
c8-stream-
|
@ -1,2 +1,2 @@
|
|||
SOURCES/libguestfs.keyring
|
||||
SOURCES/libnbd-1.8.2.tar.gz
|
||||
SOURCES/libnbd-1.6.0.tar.gz
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
1bbc40f501a7fef9eef2a39b701a71aee2fea7c4 SOURCES/libguestfs.keyring
|
||||
f74c24196aa0d7e3b5678cdcae84b8d169c31965 SOURCES/libnbd-1.8.2.tar.gz
|
||||
b14ac9349d324df71d26cf3de9fb606c56f18cb0 SOURCES/libnbd-1.6.0.tar.gz
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
From 486799e853aa9df034366303230a1785087a507a Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 8 Jan 2021 12:14:18 +0000
|
||||
Subject: [PATCH] copy/copy-nbd-to-sparse-file.sh: Skip test unless nbdkit
|
||||
available.
|
||||
|
||||
This test used nbdkit without checking it is available, which broke
|
||||
the test on RHEL 8 i686.
|
||||
|
||||
Fixes: commit 28fe8d9d8d1ecb491070d20f22e2f34bb147f19f
|
||||
(cherry picked from commit 781cb44b63a87f2d5f40590ab8c446ad2e7b6702)
|
||||
---
|
||||
copy/copy-nbd-to-sparse-file.sh | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/copy/copy-nbd-to-sparse-file.sh b/copy/copy-nbd-to-sparse-file.sh
|
||||
index aa2cb1b..47ff09a 100755
|
||||
--- a/copy/copy-nbd-to-sparse-file.sh
|
||||
+++ b/copy/copy-nbd-to-sparse-file.sh
|
||||
@@ -24,6 +24,7 @@ set -x
|
||||
requires cmp --version
|
||||
requires dd --version
|
||||
requires dd oflag=seek_bytes </dev/null
|
||||
+requires nbdkit --version
|
||||
requires test -r /dev/urandom
|
||||
requires test -r /dev/zero
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From c6cbc7082f5d6832bec0770a7de99e81d2e2c944 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Tue, 22 Jun 2021 14:08:20 +0200
|
||||
Subject: [PATCH] qemu-storage-daemon 5.2.0 is still broken
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit cc80a6b8248f5c82b67fd024a76db362c2783e25)
|
||||
---
|
||||
interop/interop-qemu-storage-daemon.sh | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/interop/interop-qemu-storage-daemon.sh b/interop/interop-qemu-storage-daemon.sh
|
||||
index 16aafab..d3ae032 100755
|
||||
--- a/interop/interop-qemu-storage-daemon.sh
|
||||
+++ b/interop/interop-qemu-storage-daemon.sh
|
||||
@@ -26,8 +26,9 @@ requires test "x$QEMU_STORAGE_DAEMON" != "x"
|
||||
requires sed --version
|
||||
qsd_version="$($QEMU_STORAGE_DAEMON --version | \
|
||||
sed -n '1s/qemu-storage-daemon version \([0-9.]*\).*/\1/p')"
|
||||
-requires_not test "$qsd_version" = "6.0.0"
|
||||
requires_not test "$qsd_version" = "5.1.0"
|
||||
+requires_not test "$qsd_version" = "5.2.0"
|
||||
+requires_not test "$qsd_version" = "6.0.0"
|
||||
requires nbdsh --version
|
||||
requires qemu-img --version
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From 2fb27319faf810342fd5c5e55a567e9a4df4a357 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Tue, 22 Jun 2021 16:18:13 +0200
|
||||
Subject: [PATCH] fuse: move check-valgrind out from condition
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 386685490d669f0940865e23f133013289e73b06)
|
||||
---
|
||||
fuse/Makefile.am | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fuse/Makefile.am b/fuse/Makefile.am
|
||||
index 8c66193..d869186 100644
|
||||
--- a/fuse/Makefile.am
|
||||
+++ b/fuse/Makefile.am
|
||||
@@ -95,7 +95,7 @@ TESTS += \
|
||||
test-errors.sh \
|
||||
$(NULL)
|
||||
|
||||
+endif HAVE_FUSE
|
||||
+
|
||||
check-valgrind:
|
||||
LIBNBD_VALGRIND=1 $(MAKE) check
|
||||
-
|
||||
-endif HAVE_FUSE
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
From 5dc2d2261224c9533d2b5ec4df6ed822de4cfc3b Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Thu, 4 Feb 2021 17:57:06 +0000
|
||||
Subject: [PATCH] generator: Refactor CONNECT.START state.
|
||||
|
||||
Small, neutral refactoring to the CONNECT.START to make the subsequent
|
||||
commit easier.
|
||||
|
||||
(cherry picked from commit cd231fd94bbfaacdd9b89e7d355ba2bbc83c2aeb)
|
||||
---
|
||||
generator/states-connect.c | 21 ++++++++++-----------
|
||||
1 file changed, 10 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/generator/states-connect.c b/generator/states-connect.c
|
||||
index 392879d..03b34c7 100644
|
||||
--- a/generator/states-connect.c
|
||||
+++ b/generator/states-connect.c
|
||||
@@ -47,11 +47,12 @@ disable_nagle (int sock)
|
||||
|
||||
STATE_MACHINE {
|
||||
CONNECT.START:
|
||||
- int fd;
|
||||
+ sa_family_t family;
|
||||
+ int fd, r;
|
||||
|
||||
assert (!h->sock);
|
||||
- fd = socket (h->connaddr.ss_family,
|
||||
- SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
|
||||
+ family = h->connaddr.ss_family;
|
||||
+ fd = socket (family, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
|
||||
if (fd == -1) {
|
||||
SET_NEXT_STATE (%.DEAD);
|
||||
set_error (errno, "socket");
|
||||
@@ -65,14 +66,12 @@ STATE_MACHINE {
|
||||
|
||||
disable_nagle (fd);
|
||||
|
||||
- if (connect (fd, (struct sockaddr *) &h->connaddr,
|
||||
- h->connaddrlen) == -1) {
|
||||
- if (errno != EINPROGRESS) {
|
||||
- SET_NEXT_STATE (%.DEAD);
|
||||
- set_error (errno, "connect");
|
||||
- return 0;
|
||||
- }
|
||||
- }
|
||||
+ r = connect (fd, (struct sockaddr *) &h->connaddr, h->connaddrlen);
|
||||
+ if (r == 0 || (r == -1 && errno == EINPROGRESS))
|
||||
+ return 0;
|
||||
+ assert (r == -1);
|
||||
+ SET_NEXT_STATE (%.DEAD);
|
||||
+ set_error (errno, "connect");
|
||||
return 0;
|
||||
|
||||
CONNECT.CONNECTING:
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
From f094472efcf34cea8bf1f02a1c5c9442ffc4ca53 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Thu, 4 Feb 2021 18:02:46 +0000
|
||||
Subject: [PATCH] generator: Print a better error message if connect(2) returns
|
||||
EAGAIN.
|
||||
|
||||
The new error message is:
|
||||
|
||||
nbd_connect_unix: connect: server backlog overflowed, see https://bugzilla.redhat.com/1925045: Resource temporarily unavailable
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/1925045
|
||||
Thanks: Xin Long, Lukas Doktor, Eric Blake
|
||||
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 85ed74960a658a82d7b61b0be07f43d1b2dcede9)
|
||||
---
|
||||
generator/states-connect.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/generator/states-connect.c b/generator/states-connect.c
|
||||
index 03b34c7..98c26e5 100644
|
||||
--- a/generator/states-connect.c
|
||||
+++ b/generator/states-connect.c
|
||||
@@ -70,6 +70,22 @@ STATE_MACHINE {
|
||||
if (r == 0 || (r == -1 && errno == EINPROGRESS))
|
||||
return 0;
|
||||
assert (r == -1);
|
||||
+#ifdef __linux__
|
||||
+ if (errno == EAGAIN && family == AF_UNIX) {
|
||||
+ /* This can happen on Linux when connecting to a Unix domain
|
||||
+ * socket, if the server's backlog is full. Unfortunately there
|
||||
+ * is nothing good we can do on the client side when this happens
|
||||
+ * since any solution would involve sleeping or busy-waiting. The
|
||||
+ * only solution is on the server side, increasing the backlog.
|
||||
+ * But at least improve the error message.
|
||||
+ * https://bugzilla.redhat.com/1925045
|
||||
+ */
|
||||
+ SET_NEXT_STATE (%.DEAD);
|
||||
+ set_error (errno, "connect: server backlog overflowed, "
|
||||
+ "see https://bugzilla.redhat.com/1925045");
|
||||
+ return 0;
|
||||
+ }
|
||||
+#endif
|
||||
SET_NEXT_STATE (%.DEAD);
|
||||
set_error (errno, "connect");
|
||||
return 0;
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
From 556fb69b1329905a988effb812639eae419053f0 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 17 Jul 2021 11:24:57 +0100
|
||||
Subject: [PATCH] m4: Remove *~ on make clean
|
||||
|
||||
(cherry picked from commit c55c5d9960809efd27cd044d007a33ea1636f4b0)
|
||||
---
|
||||
Makefile.am | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 53681a5..0f0427a 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -27,6 +27,8 @@ EXTRA_DIST = \
|
||||
SECURITY \
|
||||
$(NULL)
|
||||
|
||||
+CLEANFILES += m4/*~
|
||||
+
|
||||
SUBDIRS = \
|
||||
generator \
|
||||
include \
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From 899283bd796f55e8f7c3bee64246768612c641f3 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Fri, 9 Jul 2021 12:53:31 +0200
|
||||
Subject: [PATCH] One more VSOCK include fix
|
||||
|
||||
This file was forgotten in commit e8ed016c34e1.
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 0fb702d931be4e12bfca1a31378728053236f97c)
|
||||
---
|
||||
lib/uri.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/lib/uri.c b/lib/uri.c
|
||||
index bcecbad..56f4737 100644
|
||||
--- a/lib/uri.c
|
||||
+++ b/lib/uri.c
|
||||
@@ -32,6 +32,8 @@
|
||||
|
||||
#ifdef HAVE_LINUX_VM_SOCKETS_H
|
||||
#include <linux/vm_sockets.h>
|
||||
+#elif HAVE_SYS_VSOCK_H
|
||||
+#include <sys/vsock.h>
|
||||
#endif
|
||||
|
||||
#include "internal.h"
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
From ffe8f0a994c1f2656aa011353b386663d32db69e Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Mon, 1 Mar 2021 15:25:31 -0600
|
||||
Subject: [PATCH] opt_go: Tolerate unplanned server death
|
||||
|
||||
While debugging some experimental nbdkit code that was triggering an
|
||||
assertion failure in nbdkit, I noticed a secondary failure of nbdsh
|
||||
also dying from an assertion:
|
||||
|
||||
libnbd: debug: nbdsh: nbd_opt_go: transition: NEWSTYLE.OPT_GO.SEND -> DEAD
|
||||
libnbd: debug: nbdsh: nbd_opt_go: option queued, ignoring state machine failure
|
||||
nbdsh: opt.c:86: nbd_unlocked_opt_go: Assertion `nbd_internal_is_state_negotiating (get_next_state (h))' failed.
|
||||
|
||||
Although my trigger was from non-production nbdkit code, libnbd should
|
||||
never die from an assertion failure merely because a server
|
||||
disappeared at the wrong moment during an incomplete reply to
|
||||
NBD_OPT_GO or NBD_OPT_INFO. If this is assigned a CVE, a followup
|
||||
patch will add mention of it in docs/libnbd-security.pod.
|
||||
|
||||
Fixes: bbf1c51392 (api: Give aio_opt_go a completion callback)
|
||||
(cherry picked from commit fb4440de9cc76e9c14bd3ddf3333e78621f40ad0)
|
||||
---
|
||||
lib/opt.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib/opt.c b/lib/opt.c
|
||||
index 2317b72..e5802f4 100644
|
||||
--- a/lib/opt.c
|
||||
+++ b/lib/opt.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* NBD client library in userspace
|
||||
- * Copyright (C) 2020 Red Hat Inc.
|
||||
+ * Copyright (C) 2020-2021 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -83,7 +83,8 @@ nbd_unlocked_opt_go (struct nbd_handle *h)
|
||||
|
||||
r = wait_for_option (h);
|
||||
if (r == 0 && err) {
|
||||
- assert (nbd_internal_is_state_negotiating (get_next_state (h)));
|
||||
+ assert (nbd_internal_is_state_negotiating (get_next_state (h)) ||
|
||||
+ nbd_internal_is_state_dead (get_next_state (h)));
|
||||
set_error (err, "server replied with error to opt_go request");
|
||||
return -1;
|
||||
}
|
||||
@@ -105,7 +106,8 @@ nbd_unlocked_opt_info (struct nbd_handle *h)
|
||||
|
||||
r = wait_for_option (h);
|
||||
if (r == 0 && err) {
|
||||
- assert (nbd_internal_is_state_negotiating (get_next_state (h)));
|
||||
+ assert (nbd_internal_is_state_negotiating (get_next_state (h)) ||
|
||||
+ nbd_internal_is_state_dead (get_next_state (h)));
|
||||
set_error (err, "server replied with error to opt_info request");
|
||||
return -1;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
From 02d25dfb0809facb8c4038fb3be64fa6d55efdf8 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Tue, 13 Jul 2021 13:13:42 +0200
|
||||
Subject: [PATCH] macOS: Do not use --version_script
|
||||
|
||||
The linker does not support this option.
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 013ec1280911fd2e9ad578a92497e3c23989f037)
|
||||
---
|
||||
configure.ac | 10 ++++++++++
|
||||
lib/Makefile.am | 2 +-
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 1641e16..dd971e6 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -507,6 +507,16 @@ AS_IF([test "x$enable_golang" != "xno"],[
|
||||
],[GOLANG=no])
|
||||
AM_CONDITIONAL([HAVE_GOLANG],[test "x$GOLANG" != "xno"])
|
||||
|
||||
+case $host_os in
|
||||
+ darwin*)
|
||||
+ VERSION_SCRIPT=
|
||||
+ ;;
|
||||
+ *)
|
||||
+ VERSION_SCRIPT="-Wl,--version-script=${srcdir}/libnbd.syms"
|
||||
+ ;;
|
||||
+esac
|
||||
+AC_SUBST([VERSION_SCRIPT])
|
||||
+
|
||||
dnl Produce output files.
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
diff --git a/lib/Makefile.am b/lib/Makefile.am
|
||||
index 968e41a..ece5077 100644
|
||||
--- a/lib/Makefile.am
|
||||
+++ b/lib/Makefile.am
|
||||
@@ -78,7 +78,7 @@ libnbd_la_LIBADD = \
|
||||
$(NULL)
|
||||
libnbd_la_LDFLAGS = \
|
||||
$(PTHREAD_LIBS) \
|
||||
- -Wl,--version-script=$(srcdir)/libnbd.syms \
|
||||
+ $(VERSION_SCRIPT) \
|
||||
-version-info 0:0:0 \
|
||||
$(NULL)
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
From 171ffdde8be590f784086a021a7e6f36c4ecdb4b Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Fri, 12 Mar 2021 17:00:58 -0600
|
||||
Subject: [PATCH] security: Document assignment of CVE-2021-20286
|
||||
|
||||
Now that we finally have a CVE number, it's time to document
|
||||
the problem (it's low severity, but still a denial of service).
|
||||
|
||||
Fixes: fb4440de9cc7 (opt_go: Tolerate unplanned server death)
|
||||
(cherry picked from commit 40308a005eaa6b2e8f98da8952d0c0cacc51efde)
|
||||
---
|
||||
docs/libnbd-security.pod | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/docs/libnbd-security.pod b/docs/libnbd-security.pod
|
||||
index d8ead87..0cae846 100644
|
||||
--- a/docs/libnbd-security.pod
|
||||
+++ b/docs/libnbd-security.pod
|
||||
@@ -22,6 +22,12 @@ L<https://www.redhat.com/archives/libguestfs/2019-September/msg00128.html>
|
||||
See the full announcement here:
|
||||
L<https://www.redhat.com/archives/libguestfs/2019-October/msg00060.html>
|
||||
|
||||
+=head2 CVE-2021-20286
|
||||
+denial of service when using L<nbd_set_opt_mode(3)>
|
||||
+
|
||||
+See the full announcement here:
|
||||
+L<https://listman.redhat.com/archives/libguestfs/2021-March/msg00092.html>
|
||||
+
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<libnbd(3)>.
|
||||
@@ -34,4 +40,4 @@ Richard W.M. Jones
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
-Copyright (C) 2019 Red Hat Inc.
|
||||
+Copyright (C) 2019-2021 Red Hat Inc.
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
From 22572f8ac13e2e8daf91d227eac2f384303fb5b4 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Thu, 3 Feb 2022 14:25:57 -0600
|
||||
Subject: [PATCH] copy: Pass in dummy variable rather than &errno to callback
|
||||
|
||||
In several places where asynch handlers manually call the provided
|
||||
nbd_completion_callback, the value of errno is indeterminate (for
|
||||
example, in file-ops.c:file_asynch_read(), the previous call to
|
||||
file_synch_read() already triggered exit() on error, but does not
|
||||
guarantee what is left in errno on success). As the callback should
|
||||
be paying attention to the value of *error (to be fixed in the next
|
||||
patch), we are better off ensuring that we pass in a pointer to a
|
||||
known-zero value. Besides, passing in &errno carries a risk that if
|
||||
the callback uses any other library function that alters errno prior
|
||||
to dereferncing *error, it will no longer see the value we passed in.
|
||||
Thus, it is easier to use a dummy variable on the stack than to mess
|
||||
around with errno and it's magic macro expansion into a thread-local
|
||||
storage location.
|
||||
|
||||
Note that several callsites then check if the callback returned -1,
|
||||
and if so assume that the callback has caused errno to now have a sane
|
||||
value to pass on to perror. In theory, the fact that we are no longer
|
||||
passing in &errno means that if the callback assigns into *error but
|
||||
did not otherwise affect errno (a tenuous assumption, given our
|
||||
argument above that we could not even guarantee that the callback does
|
||||
not accidentally alter errno prior to reading *error), our perror call
|
||||
would no longer reflect the intended error value from the callback.
|
||||
But in practice, since the callback never actually returned -1, nor
|
||||
even assigned into *error, the call to perror is dead code; although I
|
||||
have chosen to defer that additional cleanup to the next patch.
|
||||
|
||||
Message-Id: <20220203202558.203013-5-eblake@redhat.com>
|
||||
Acked-by: Richard W.M. Jones <rjones@redhat.com>
|
||||
Acked-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
||||
(cherry picked from commit 794c8ce06e995ebd282e8f2b9465a06140572112)
|
||||
Conflicts:
|
||||
copy/file-ops.c - no backport of d5f65e56 ("copy: Do not use trim
|
||||
for zeroing"), so asynch_trim needed same treatment
|
||||
copy/multi-thread-copying.c - context due to missing refactoring
|
||||
copy/null-ops.c - no backport of 0b16205e "copy: Implement "null:"
|
||||
destination."
|
||||
(cherry picked from commit 26e3dcf80815fe2db320d3046aabc2580c2f7a0d)
|
||||
---
|
||||
copy/file-ops.c | 22 +++++++++++++---------
|
||||
copy/multi-thread-copying.c | 8 +++++---
|
||||
2 files changed, 18 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/copy/file-ops.c b/copy/file-ops.c
|
||||
index 086348a..cc312b4 100644
|
||||
--- a/copy/file-ops.c
|
||||
+++ b/copy/file-ops.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* NBD client library in userspace.
|
||||
- * Copyright (C) 2020 Red Hat Inc.
|
||||
+ * Copyright (C) 2020-2022 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -158,10 +158,11 @@ file_asynch_read (struct rw *rw,
|
||||
struct command *command,
|
||||
nbd_completion_callback cb)
|
||||
{
|
||||
+ int dummy = 0;
|
||||
+
|
||||
file_synch_read (rw, slice_ptr (command->slice),
|
||||
command->slice.len, command->offset);
|
||||
- errno = 0;
|
||||
- if (cb.callback (cb.user_data, &errno) == -1) {
|
||||
+ if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
perror (rw->name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
@@ -172,10 +173,11 @@ file_asynch_write (struct rw *rw,
|
||||
struct command *command,
|
||||
nbd_completion_callback cb)
|
||||
{
|
||||
+ int dummy = 0;
|
||||
+
|
||||
file_synch_write (rw, slice_ptr (command->slice),
|
||||
command->slice.len, command->offset);
|
||||
- errno = 0;
|
||||
- if (cb.callback (cb.user_data, &errno) == -1) {
|
||||
+ if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
perror (rw->name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
@@ -185,10 +187,11 @@ static bool
|
||||
file_asynch_trim (struct rw *rw, struct command *command,
|
||||
nbd_completion_callback cb)
|
||||
{
|
||||
+ int dummy = 0;
|
||||
+
|
||||
if (!file_synch_trim (rw, command->offset, command->slice.len))
|
||||
return false;
|
||||
- errno = 0;
|
||||
- if (cb.callback (cb.user_data, &errno) == -1) {
|
||||
+ if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
perror (rw->name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
@@ -199,10 +202,11 @@ static bool
|
||||
file_asynch_zero (struct rw *rw, struct command *command,
|
||||
nbd_completion_callback cb)
|
||||
{
|
||||
+ int dummy = 0;
|
||||
+
|
||||
if (!file_synch_zero (rw, command->offset, command->slice.len))
|
||||
return false;
|
||||
- errno = 0;
|
||||
- if (cb.callback (cb.user_data, &errno) == -1) {
|
||||
+ if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
perror (rw->name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
diff --git a/copy/multi-thread-copying.c b/copy/multi-thread-copying.c
|
||||
index a7aaa7d..2593ff7 100644
|
||||
--- a/copy/multi-thread-copying.c
|
||||
+++ b/copy/multi-thread-copying.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* NBD client library in userspace.
|
||||
- * Copyright (C) 2020 Red Hat Inc.
|
||||
+ * Copyright (C) 2020-2022 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -391,6 +391,7 @@ finished_read (void *vp, int *error)
|
||||
bool last_is_hole = false;
|
||||
uint64_t i;
|
||||
struct command *newcommand;
|
||||
+ int dummy = 0;
|
||||
|
||||
/* Iterate over whole blocks in the command, starting on a block
|
||||
* boundary.
|
||||
@@ -473,7 +474,7 @@ finished_read (void *vp, int *error)
|
||||
/* Free the original command since it has been split into
|
||||
* subcommands and the original is no longer needed.
|
||||
*/
|
||||
- free_command (command, &errno);
|
||||
+ free_command (command, &dummy);
|
||||
}
|
||||
|
||||
return 1; /* auto-retires the command */
|
||||
@@ -498,6 +499,7 @@ static void
|
||||
fill_dst_range_with_zeroes (struct command *command)
|
||||
{
|
||||
char *data;
|
||||
+ int dummy = 0;
|
||||
|
||||
if (destination_is_zero)
|
||||
goto free_and_return;
|
||||
@@ -541,7 +543,7 @@ fill_dst_range_with_zeroes (struct command *command)
|
||||
free (data);
|
||||
|
||||
free_and_return:
|
||||
- free_command (command, &errno);
|
||||
+ free_command (command, &dummy);
|
||||
}
|
||||
|
||||
static int
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,215 +0,0 @@
|
|||
From d57e9e705b1257e5e241922dc29b333e090302c4 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Wed, 7 Jul 2021 13:15:40 +0200
|
||||
Subject: [PATCH] macOS: Simple cloexec/nonblock fix
|
||||
|
||||
This is the most trivial way to fix the issue with macOS not having SOCK_CLOEXEC
|
||||
and SOCK_NONBLOCK. This is the only way to make it work on such platform(s)
|
||||
unless they are fixed.
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 61132c8e9804787e66974020ebb96e3995e0f6dc)
|
||||
---
|
||||
fuzzing/libnbd-fuzz-wrapper.c | 4 +
|
||||
fuzzing/libnbd-libfuzzer-test.c | 4 +
|
||||
generator/states-connect-socket-activation.c | 2 +-
|
||||
generator/states-connect.c | 11 +--
|
||||
lib/internal.h | 9 +++
|
||||
lib/utils.c | 80 ++++++++++++++++++++
|
||||
6 files changed, 104 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/fuzzing/libnbd-fuzz-wrapper.c b/fuzzing/libnbd-fuzz-wrapper.c
|
||||
index 99a6d80..eb18809 100644
|
||||
--- a/fuzzing/libnbd-fuzz-wrapper.c
|
||||
+++ b/fuzzing/libnbd-fuzz-wrapper.c
|
||||
@@ -38,6 +38,10 @@
|
||||
|
||||
#include <libnbd.h>
|
||||
|
||||
+#ifndef SOCK_CLOEXEC
|
||||
+#define SOCK_CLOEXEC 0 /* This file doesn't use exec */
|
||||
+#endif
|
||||
+
|
||||
static void client (int s);
|
||||
static void server (int fd, int s);
|
||||
|
||||
diff --git a/fuzzing/libnbd-libfuzzer-test.c b/fuzzing/libnbd-libfuzzer-test.c
|
||||
index 5ee29b8..c8d6423 100644
|
||||
--- a/fuzzing/libnbd-libfuzzer-test.c
|
||||
+++ b/fuzzing/libnbd-libfuzzer-test.c
|
||||
@@ -38,6 +38,10 @@
|
||||
|
||||
#include <libnbd.h>
|
||||
|
||||
+#ifndef SOCK_CLOEXEC
|
||||
+#define SOCK_CLOEXEC 0 /* This file doesn't use exec */
|
||||
+#endif
|
||||
+
|
||||
static void client (int sock);
|
||||
static void server (const uint8_t *data, size_t size, int sock);
|
||||
|
||||
diff --git a/generator/states-connect-socket-activation.c b/generator/states-connect-socket-activation.c
|
||||
index e601c9b..8a2add3 100644
|
||||
--- a/generator/states-connect-socket-activation.c
|
||||
+++ b/generator/states-connect-socket-activation.c
|
||||
@@ -131,7 +131,7 @@ STATE_MACHINE {
|
||||
return 0;
|
||||
}
|
||||
|
||||
- s = socket (AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
|
||||
+ s = nbd_internal_socket (AF_UNIX, SOCK_STREAM, 0, false);
|
||||
if (s == -1) {
|
||||
SET_NEXT_STATE (%.DEAD);
|
||||
set_error (errno, "socket");
|
||||
diff --git a/generator/states-connect.c b/generator/states-connect.c
|
||||
index fcac86f..8de1218 100644
|
||||
--- a/generator/states-connect.c
|
||||
+++ b/generator/states-connect.c
|
||||
@@ -52,7 +52,7 @@ STATE_MACHINE {
|
||||
|
||||
assert (!h->sock);
|
||||
family = h->connaddr.ss_family;
|
||||
- fd = socket (family, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
|
||||
+ fd = nbd_internal_socket (family, SOCK_STREAM, 0, true);
|
||||
if (fd == -1) {
|
||||
SET_NEXT_STATE (%.DEAD);
|
||||
set_error (errno, "socket");
|
||||
@@ -162,9 +162,10 @@ STATE_MACHINE {
|
||||
return -1;
|
||||
}
|
||||
|
||||
- fd = socket (h->rp->ai_family,
|
||||
- h->rp->ai_socktype|SOCK_NONBLOCK|SOCK_CLOEXEC,
|
||||
- h->rp->ai_protocol);
|
||||
+ fd = nbd_internal_socket (h->rp->ai_family,
|
||||
+ h->rp->ai_socktype,
|
||||
+ h->rp->ai_protocol,
|
||||
+ true);
|
||||
if (fd == -1) {
|
||||
SET_NEXT_STATE (%NEXT_ADDRESS);
|
||||
return 0;
|
||||
@@ -227,7 +228,7 @@ STATE_MACHINE {
|
||||
assert (!h->sock);
|
||||
assert (h->argv.ptr);
|
||||
assert (h->argv.ptr[0]);
|
||||
- if (socketpair (AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, sv) == -1) {
|
||||
+ if (nbd_internal_socketpair (AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
|
||||
SET_NEXT_STATE (%.DEAD);
|
||||
set_error (errno, "socketpair");
|
||||
return 0;
|
||||
diff --git a/lib/internal.h b/lib/internal.h
|
||||
index 01f9d8a..0e205ab 100644
|
||||
--- a/lib/internal.h
|
||||
+++ b/lib/internal.h
|
||||
@@ -467,4 +467,13 @@ extern char *nbd_internal_printable_buffer (const void *buf, size_t count);
|
||||
extern char *nbd_internal_printable_string (const char *str);
|
||||
extern char *nbd_internal_printable_string_list (char **list);
|
||||
|
||||
+/* These are wrappers around socket(2) and socketpair(2). They
|
||||
+ * always set SOCK_CLOEXEC. nbd_internal_socket can set SOCK_NONBLOCK
|
||||
+ * according to the nonblock parameter.
|
||||
+ */
|
||||
+extern int nbd_internal_socket (int domain, int type, int protocol,
|
||||
+ bool nonblock);
|
||||
+extern int nbd_internal_socketpair (int domain, int type, int protocol,
|
||||
+ int *fds);
|
||||
+
|
||||
#endif /* LIBNBD_INTERNAL_H */
|
||||
diff --git a/lib/utils.c b/lib/utils.c
|
||||
index 260fd6a..3d3b7f4 100644
|
||||
--- a/lib/utils.c
|
||||
+++ b/lib/utils.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
+#include <fcntl.h>
|
||||
|
||||
#include "minmax.h"
|
||||
|
||||
@@ -258,3 +259,82 @@ nbd_internal_printable_string_list (char **list)
|
||||
return s;
|
||||
|
||||
}
|
||||
+
|
||||
+int nbd_internal_socket(int domain,
|
||||
+ int type,
|
||||
+ int protocol,
|
||||
+ bool nonblock)
|
||||
+{
|
||||
+ int fd;
|
||||
+
|
||||
+ /* So far we do not know about any platform that has SOCK_CLOEXEC and
|
||||
+ * lacks SOCK_NONBLOCK at the same time.
|
||||
+ *
|
||||
+ * The workaround for missing SOCK_CLOEXEC introduces a race which
|
||||
+ * cannot be fixed until support for SOCK_CLOEXEC is added (or other
|
||||
+ * fix is implemented).
|
||||
+ */
|
||||
+#ifndef SOCK_CLOEXEC
|
||||
+ int flags;
|
||||
+#else
|
||||
+ type |= SOCK_CLOEXEC;
|
||||
+ if (nonblock)
|
||||
+ type |= SOCK_NONBLOCK;
|
||||
+#endif
|
||||
+
|
||||
+ fd = socket (domain, type, protocol);
|
||||
+
|
||||
+#ifndef SOCK_CLOEXEC
|
||||
+ if (fd == -1)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (fcntl (fd, F_SETFD, FD_CLOEXEC) == -1) {
|
||||
+ close(fd);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (nonblock) {
|
||||
+ flags = fcntl (fd, F_GETFL, 0);
|
||||
+ if (flags == -1 ||
|
||||
+ fcntl (fd, F_SETFL, flags|O_NONBLOCK) == -1) {
|
||||
+ close(fd);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ return fd;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+nbd_internal_socketpair (int domain, int type, int protocol, int *fds)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Same as with nbd_internal_socket() this workaround for missing
|
||||
+ * SOCK_CLOEXEC introduces a race which cannot be fixed until support
|
||||
+ * for SOCK_CLOEXEC is added (or other fix is implemented).
|
||||
+ */
|
||||
+#ifndef SOCK_CLOEXEC
|
||||
+ size_t i;
|
||||
+#else
|
||||
+ type |= SOCK_CLOEXEC;
|
||||
+#endif
|
||||
+
|
||||
+ ret = socketpair (domain, type, protocol, fds);
|
||||
+
|
||||
+#ifndef SOCK_CLOEXEC
|
||||
+ if (ret == 0) {
|
||||
+ for (i = 0; i < 2; i++) {
|
||||
+ if (fcntl (fds[i], F_SETFD, FD_CLOEXEC) == -1) {
|
||||
+ close(fds[0]);
|
||||
+ close(fds[1]);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -0,0 +1,318 @@
|
|||
From 1b0b732e6a9b4979fccf6a09eb6704264edf675d Mon Sep 17 00:00:00 2001
|
||||
From: Eric Blake <eblake@redhat.com>
|
||||
Date: Thu, 3 Feb 2022 14:25:58 -0600
|
||||
Subject: [PATCH] copy: CVE-2022-0485: Fail nbdcopy if NBD read or write fails
|
||||
|
||||
nbdcopy has a nasty bug when performing multi-threaded copies using
|
||||
asynchronous nbd calls - it was blindly treating the completion of an
|
||||
asynchronous command as successful, rather than checking the *error
|
||||
parameter. This can result in the silent creation of a corrupted
|
||||
image in two different ways: when a read fails, we blindly wrote
|
||||
garbage to the destination; when a write fails, we did not flag that
|
||||
the destination was not written.
|
||||
|
||||
Since nbdcopy already calls exit() on a synchronous read or write
|
||||
failure to a file, doing the same for an asynchronous op to an NBD
|
||||
server is the simplest solution. A nicer solution, but more invasive
|
||||
to code and thus not done here, might be to allow up to N retries of
|
||||
the transaction (in case the read or write failure was transient), or
|
||||
even having a mode where as much data is copied as possible (portions
|
||||
of the copy that failed would be logged on stderr, and nbdcopy would
|
||||
still fail with a non-zero exit status, but this would copy more than
|
||||
just stopping at the first error, as can be done with rsync or
|
||||
ddrescue).
|
||||
|
||||
Note that since we rely on auto-retiring and do NOT call
|
||||
nbd_aio_command_completed, our completion callbacks must always return
|
||||
1 (if they do not exit() first), even when acting on *error, so as not
|
||||
leave the command allocated until nbd_close. As such, there is no
|
||||
sane way to return an error to a manual caller of the callback, and
|
||||
therefore we can drop dead code that calls perror() and exit() if the
|
||||
callback "failed". It is also worth documenting the contract on when
|
||||
we must manually call the callback during the asynch_zero callback, so
|
||||
that we do not leak or double-free the command; thankfully, all the
|
||||
existing code paths were correct.
|
||||
|
||||
The added testsuite script demonstrates several scenarios, some of
|
||||
which fail without the rest of this patch in place, and others which
|
||||
showcase ways in which sparse images can bypass errors.
|
||||
|
||||
Once backports are complete, a followup patch on the main branch will
|
||||
edit docs/libnbd-security.pod with the mailing list announcement of
|
||||
the stable branch commit ids and release versions that incorporate
|
||||
this fix.
|
||||
|
||||
Reported-by: Nir Soffer <nsoffer@redhat.com>
|
||||
Fixes: bc896eec4d ("copy: Implement multi-conn, multiple threads, multiple requests in flight.", v1.5.6)
|
||||
Fixes: https://bugzilla.redhat.com/2046194
|
||||
Message-Id: <20220203202558.203013-6-eblake@redhat.com>
|
||||
Acked-by: Richard W.M. Jones <rjones@redhat.com>
|
||||
Acked-by: Nir Soffer <nsoffer@redhat.com>
|
||||
[eblake: fix error message per Nir, tweak requires lines in unit test per Rich]
|
||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
||||
|
||||
(cherry picked from commit 8d444b41d09a700c7ee6f9182a649f3f2d325abb)
|
||||
Conflicts:
|
||||
copy/nbdcopy.h - copyright context
|
||||
copy/null-ops.c - no backport of 0b16205e "copy: Implement "null:"
|
||||
destination."
|
||||
copy/copy-nbd-error.sh - no backport of d5f65e56 ("copy: Do not use
|
||||
trim for zeroing"), so one test needed an additional error-trim-rate;
|
||||
no backport of 4ff9e62d (copy: Add --request-size option") and friends, so
|
||||
this version uses larger transactions, so change error rate of 0.5 to 1;
|
||||
no backport of 0b16205e "copy: Implement "null:" destination.", so use
|
||||
nbdkit null instead
|
||||
Note that while the use of NBD_CMD_TRIM can create data corruption, it is
|
||||
not as severe as what this patch fixes, since trim corruption will only
|
||||
expose what had previously been on the disk, compared to this patch fixing
|
||||
a potential leak of nbdcopy heap contents into the destination.
|
||||
(cherry picked from commit 6c8f2f859926b82094fb5e85c446ea099700fa10)
|
||||
---
|
||||
TODO | 1 +
|
||||
copy/Makefile.am | 4 +-
|
||||
copy/copy-nbd-error.sh | 81 +++++++++++++++++++++++++++++++++++++
|
||||
copy/file-ops.c | 17 +++-----
|
||||
copy/multi-thread-copying.c | 13 ++++++
|
||||
copy/nbdcopy.h | 7 ++--
|
||||
6 files changed, 107 insertions(+), 16 deletions(-)
|
||||
create mode 100755 copy/copy-nbd-error.sh
|
||||
|
||||
diff --git a/TODO b/TODO
|
||||
index 510c219..19c21d4 100644
|
||||
--- a/TODO
|
||||
+++ b/TODO
|
||||
@@ -35,6 +35,7 @@ nbdcopy:
|
||||
- Better page cache usage, see nbdkit-file-plugin options
|
||||
fadvise=sequential cache=none.
|
||||
- Consider io_uring if there are performance bottlenecks.
|
||||
+ - Configurable retries in response to read or write failures.
|
||||
|
||||
nbdfuse:
|
||||
- If you write beyond the end of the virtual file, it returns EIO.
|
||||
diff --git a/copy/Makefile.am b/copy/Makefile.am
|
||||
index d318388..3406cd8 100644
|
||||
--- a/copy/Makefile.am
|
||||
+++ b/copy/Makefile.am
|
||||
@@ -1,5 +1,5 @@
|
||||
# nbd client library in userspace
|
||||
-# Copyright (C) 2020 Red Hat Inc.
|
||||
+# Copyright (C) 2020-2022 Red Hat Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
@@ -30,6 +30,7 @@ EXTRA_DIST = \
|
||||
copy-nbd-to-small-nbd-error.sh \
|
||||
copy-nbd-to-sparse-file.sh \
|
||||
copy-nbd-to-stdout.sh \
|
||||
+ copy-nbd-error.sh \
|
||||
copy-progress-bar.sh \
|
||||
copy-sparse.sh \
|
||||
copy-sparse-allocated.sh \
|
||||
@@ -105,6 +106,7 @@ TESTS += \
|
||||
copy-nbd-to-sparse-file.sh \
|
||||
copy-stdin-to-nbd.sh \
|
||||
copy-nbd-to-stdout.sh \
|
||||
+ copy-nbd-error.sh \
|
||||
copy-progress-bar.sh \
|
||||
copy-sparse.sh \
|
||||
copy-sparse-allocated.sh \
|
||||
diff --git a/copy/copy-nbd-error.sh b/copy/copy-nbd-error.sh
|
||||
new file mode 100755
|
||||
index 0000000..bba71db
|
||||
--- /dev/null
|
||||
+++ b/copy/copy-nbd-error.sh
|
||||
@@ -0,0 +1,81 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2022 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+# Tests several scenarios of handling NBD server errors
|
||||
+# Serves as a regression test for the CVE-2022-0485 fix.
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+requires nbdkit --exit-with-parent --version
|
||||
+requires nbdkit --filter=noextents null --version
|
||||
+requires nbdkit --filter=error pattern --version
|
||||
+requires nbdkit --filter=nozero memory --version
|
||||
+
|
||||
+fail=0
|
||||
+
|
||||
+# Failure to get block status should not be fatal, but merely downgrade to
|
||||
+# reading the entire image as if data
|
||||
+echo "Testing extents failures on source"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v --filter=error pattern 5M \
|
||||
+ error-extents-rate=1 ] [ nbdkit --exit-with-parent -v null 5M ] || fail=1
|
||||
+
|
||||
+# Failure to read should be fatal
|
||||
+echo "Testing read failures on non-sparse source"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v --filter=error pattern 5M \
|
||||
+ error-pread-rate=1 ] [ nbdkit --exit-with-parent -v null 5M ] && fail=1
|
||||
+
|
||||
+# However, reliable block status on a sparse image can avoid the need to read
|
||||
+echo "Testing read failures on sparse source"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v --filter=error null 5M \
|
||||
+ error-pread-rate=1 ] [ nbdkit --exit-with-parent -v null 5M ] || fail=1
|
||||
+
|
||||
+# Failure to write data should be fatal
|
||||
+echo "Testing write data failures on arbitrary destination"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v pattern 5M ] \
|
||||
+ [ nbdkit --exit-with-parent -v --filter=error --filter=noextents \
|
||||
+ memory 5M error-pwrite-rate=1 ] && fail=1
|
||||
+
|
||||
+# However, writing zeroes can bypass the need for normal writes
|
||||
+echo "Testing write data failures from sparse source"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v null 5M ] \
|
||||
+ [ nbdkit --exit-with-parent -v --filter=error --filter=noextents \
|
||||
+ memory 5M error-pwrite-rate=1 ] || fail=1
|
||||
+
|
||||
+# Failure to write zeroes should be fatal
|
||||
+echo "Testing write zero failures on arbitrary destination"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v null 5M ] \
|
||||
+ [ nbdkit --exit-with-parent -v --filter=error memory 5M \
|
||||
+ error-trim-rate=1 error-zero-rate=1 ] && fail=1
|
||||
+
|
||||
+# However, assuming/learning destination is zero can skip need to write
|
||||
+echo "Testing write failures on pre-zeroed destination"
|
||||
+$VG nbdcopy --destination-is-zero -- \
|
||||
+ [ nbdkit --exit-with-parent -v null 5M ] \
|
||||
+ [ nbdkit --exit-with-parent -v --filter=error memory 5M \
|
||||
+ error-pwrite-rate=1 error-zero-rate=1 ] || fail=1
|
||||
+
|
||||
+# Likewise, when write zero is not advertised, fallback to normal write works
|
||||
+echo "Testing write zeroes to destination without zero support"
|
||||
+$VG nbdcopy -- [ nbdkit --exit-with-parent -v null 5M ] \
|
||||
+ [ nbdkit --exit-with-parent -v --filter=nozero --filter=error memory 5M \
|
||||
+ error-zero-rate=1 ] || fail=1
|
||||
+
|
||||
+exit $fail
|
||||
diff --git a/copy/file-ops.c b/copy/file-ops.c
|
||||
index cc312b4..b19af04 100644
|
||||
--- a/copy/file-ops.c
|
||||
+++ b/copy/file-ops.c
|
||||
@@ -162,10 +162,8 @@ file_asynch_read (struct rw *rw,
|
||||
|
||||
file_synch_read (rw, slice_ptr (command->slice),
|
||||
command->slice.len, command->offset);
|
||||
- if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
- perror (rw->name);
|
||||
- exit (EXIT_FAILURE);
|
||||
- }
|
||||
+ /* file_synch_read called exit() on error */
|
||||
+ cb.callback (cb.user_data, &dummy);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -177,10 +175,8 @@ file_asynch_write (struct rw *rw,
|
||||
|
||||
file_synch_write (rw, slice_ptr (command->slice),
|
||||
command->slice.len, command->offset);
|
||||
- if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
- perror (rw->name);
|
||||
- exit (EXIT_FAILURE);
|
||||
- }
|
||||
+ /* file_synch_write called exit() on error */
|
||||
+ cb.callback (cb.user_data, &dummy);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -206,10 +202,7 @@ file_asynch_zero (struct rw *rw, struct command *command,
|
||||
|
||||
if (!file_synch_zero (rw, command->offset, command->slice.len))
|
||||
return false;
|
||||
- if (cb.callback (cb.user_data, &dummy) == -1) {
|
||||
- perror (rw->name);
|
||||
- exit (EXIT_FAILURE);
|
||||
- }
|
||||
+ cb.callback (cb.user_data, &dummy);
|
||||
return true;
|
||||
}
|
||||
|
||||
diff --git a/copy/multi-thread-copying.c b/copy/multi-thread-copying.c
|
||||
index 2593ff7..28749ae 100644
|
||||
--- a/copy/multi-thread-copying.c
|
||||
+++ b/copy/multi-thread-copying.c
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <sys/stat.h>
|
||||
+#include <inttypes.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
@@ -374,6 +375,12 @@ finished_read (void *vp, int *error)
|
||||
{
|
||||
struct command *command = vp;
|
||||
|
||||
+ if (*error) {
|
||||
+ fprintf (stderr, "read at offset %" PRId64 " failed: %s\n",
|
||||
+ command->offset, strerror (*error));
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
if (allocated || sparse_size == 0) {
|
||||
/* If sparseness detection (see below) is turned off then we write
|
||||
* the whole command.
|
||||
@@ -552,6 +559,12 @@ free_command (void *vp, int *error)
|
||||
struct command *command = vp;
|
||||
struct buffer *buffer = command->slice.buffer;
|
||||
|
||||
+ if (*error) {
|
||||
+ fprintf (stderr, "write at offset %" PRId64 " failed: %s\n",
|
||||
+ command->offset, strerror (*error));
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
if (buffer != NULL) {
|
||||
if (--buffer->refs == 0) {
|
||||
free (buffer->data);
|
||||
diff --git a/copy/nbdcopy.h b/copy/nbdcopy.h
|
||||
index 3dcc6df..9626a52 100644
|
||||
--- a/copy/nbdcopy.h
|
||||
+++ b/copy/nbdcopy.h
|
||||
@@ -1,5 +1,5 @@
|
||||
/* NBD client library in userspace.
|
||||
- * Copyright (C) 2020 Red Hat Inc.
|
||||
+ * Copyright (C) 2020-2022 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -134,7 +134,8 @@ struct rw_ops {
|
||||
bool (*synch_zero) (struct rw *rw, uint64_t offset, uint64_t count);
|
||||
|
||||
/* Asynchronous I/O operations. These start the operation and call
|
||||
- * 'cb' on completion.
|
||||
+ * 'cb' on completion. 'cb' will return 1, for auto-retiring with
|
||||
+ * asynchronous libnbd calls.
|
||||
*
|
||||
* The file_ops versions are actually implemented synchronously, but
|
||||
* still call 'cb'.
|
||||
@@ -156,7 +157,7 @@ struct rw_ops {
|
||||
nbd_completion_callback cb);
|
||||
|
||||
/* Asynchronously zero. command->slice.buffer is not used. If not possible,
|
||||
- * returns false.
|
||||
+ * returns false. 'cb' must be called only if returning true.
|
||||
*/
|
||||
bool (*asynch_zero) (struct rw *rw, struct command *command,
|
||||
nbd_completion_callback cb);
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
From 10ca280bce2cbc5b6e4300c2a64bc86be4757f5a Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 30 Jul 2021 10:47:29 +0100
|
||||
Subject: [PATCH] copy: Fix progress bar
|
||||
|
||||
In multi-thread mode we were using the wrong size (the destination,
|
||||
not the source) to calculate the percent copied. When copying from a
|
||||
small disk to a large disk, even though we only copy the length of the
|
||||
small disk, the percentage would stay at 0%.
|
||||
|
||||
Fixes virt-v2v -o null (which uses a max-sized nbdkit null instance as
|
||||
the destination).
|
||||
|
||||
(cherry picked from commit 76bf210cea8a2bc6d9d463c1589b81dcaa049923)
|
||||
---
|
||||
copy/multi-thread-copying.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/copy/multi-thread-copying.c b/copy/multi-thread-copying.c
|
||||
index c649d2b..4603d8f 100644
|
||||
--- a/copy/multi-thread-copying.c
|
||||
+++ b/copy/multi-thread-copying.c
|
||||
@@ -70,7 +70,7 @@ get_next_offset (uint64_t *offset, uint64_t *count)
|
||||
* are called from threads and not necessarily in monotonic order
|
||||
* so the progress bar would move erratically.
|
||||
*/
|
||||
- progress_bar (*offset, dst->size);
|
||||
+ progress_bar (*offset, src->size);
|
||||
}
|
||||
pthread_mutex_unlock (&lock);
|
||||
return r;
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
From 8d9c9a8141ccacbde2f1ccd350745de60945900c Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 30 Jul 2021 10:57:39 +0100
|
||||
Subject: [PATCH] copy: Avoid potential divide by zero when source size is zero
|
||||
|
||||
Actually this does not happen because of the way the progress bar is
|
||||
called from other code, but it's possible that a future change might
|
||||
introduce a bug, so avoid any problems.
|
||||
|
||||
(cherry picked from commit 266c6e7083b1e0e8373ce166cf0be388604ca805)
|
||||
---
|
||||
copy/progress.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/copy/progress.c b/copy/progress.c
|
||||
index 7383299..59ec817 100644
|
||||
--- a/copy/progress.c
|
||||
+++ b/copy/progress.c
|
||||
@@ -103,6 +103,8 @@ progress_bar (off_t pos, int64_t size)
|
||||
|
||||
if (!progress)
|
||||
return;
|
||||
+ if (size == 0)
|
||||
+ return;
|
||||
|
||||
pthread_mutex_lock (&lock);
|
||||
if (progress_fd == -1)
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,413 +0,0 @@
|
|||
From 17c24027cea812d4a3517c48bdf8f79bbb0045c2 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 26 Jun 2021 16:10:40 +0100
|
||||
Subject: [PATCH] info: Add --map --totals sub-mode to display summary of map
|
||||
|
||||
This is similar to "qemu-img measure". Some examples:
|
||||
|
||||
$ nbdkit -r file fedora-33.img --run 'nbdinfo --map --totals $uri'
|
||||
1226113024 19.0 0 data
|
||||
5216337920 81.0 3 hole,zero
|
||||
|
||||
$ nbdkit -r file fedora-33.img --run 'nbdinfo --map --totals --json $uri | jq'
|
||||
[
|
||||
{
|
||||
"size": 1226113024,
|
||||
"percent": 19.0318,
|
||||
"type": 0,
|
||||
"description": "data"
|
||||
},
|
||||
{
|
||||
"size": 5216337920,
|
||||
"percent": 80.9682,
|
||||
"type": 3,
|
||||
"description": "hole,zero"
|
||||
}
|
||||
]
|
||||
|
||||
$ nbdkit sparse-random 6G --run 'nbdinfo --map --totals $uri'
|
||||
941551616 14.6 0 data
|
||||
5500899328 85.4 3 hole,zero
|
||||
|
||||
(cherry picked from commit 7968bfe328e86574276283b159a594eeebeaf32a)
|
||||
---
|
||||
info/Makefile.am | 2 +
|
||||
info/info-map-totals-json.sh | 48 +++++++++++++++++++++
|
||||
info/info-map-totals.sh | 43 +++++++++++++++++++
|
||||
info/main.c | 15 ++++++-
|
||||
info/map.c | 82 +++++++++++++++++++++++++++++++++++-
|
||||
info/nbdinfo.h | 1 +
|
||||
info/nbdinfo.pod | 38 ++++++++++++++++-
|
||||
7 files changed, 225 insertions(+), 4 deletions(-)
|
||||
create mode 100755 info/info-map-totals-json.sh
|
||||
create mode 100755 info/info-map-totals.sh
|
||||
|
||||
diff --git a/info/Makefile.am b/info/Makefile.am
|
||||
index 5c717c7..75c6a75 100644
|
||||
--- a/info/Makefile.am
|
||||
+++ b/info/Makefile.am
|
||||
@@ -38,6 +38,8 @@ info_sh_files = \
|
||||
info-map-base-allocation-zero.sh \
|
||||
info-map-qemu-dirty-bitmap.sh \
|
||||
info-map-qemu-allocation-depth.sh \
|
||||
+ info-map-totals.sh \
|
||||
+ info-map-totals-json.sh \
|
||||
info-atomic-output.sh \
|
||||
$(NULL)
|
||||
|
||||
diff --git a/info/info-map-totals-json.sh b/info/info-map-totals-json.sh
|
||||
new file mode 100755
|
||||
index 0000000..dc386ef
|
||||
--- /dev/null
|
||||
+++ b/info/info-map-totals-json.sh
|
||||
@@ -0,0 +1,48 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+requires nbdkit --version
|
||||
+requires nbdkit -U - null --run 'test "$uri" != ""'
|
||||
+requires jq --version
|
||||
+
|
||||
+out=info-map-totals-json.out
|
||||
+cleanup_fn rm -f $out
|
||||
+rm -f $out
|
||||
+
|
||||
+# The sparse allocator used by nbdkit-data-plugin uses a 32K page
|
||||
+# size, and extents are always aligned with this.
|
||||
+nbdkit -U - data data='1 @131072 2' size=1M \
|
||||
+ --run '$VG nbdinfo --map --totals --json "$uri"' > $out
|
||||
+
|
||||
+cat $out
|
||||
+jq . < $out
|
||||
+
|
||||
+test $( jq -r '.[0].size' < $out ) -eq 65536
|
||||
+test $( jq -r '.[0].percent' < $out ) = "6.25"
|
||||
+test $( jq -r '.[0].type' < $out ) -eq 0
|
||||
+test $( jq -r '.[0].description' < $out ) = "data"
|
||||
+
|
||||
+test $( jq -r '.[1].size' < $out ) -eq 983040
|
||||
+test $( jq -r '.[1].percent' < $out ) = "93.75"
|
||||
+test $( jq -r '.[1].type' < $out ) -eq 3
|
||||
+test $( jq -r '.[1].description' < $out ) = "hole,zero"
|
||||
diff --git a/info/info-map-totals.sh b/info/info-map-totals.sh
|
||||
new file mode 100755
|
||||
index 0000000..12c1263
|
||||
--- /dev/null
|
||||
+++ b/info/info-map-totals.sh
|
||||
@@ -0,0 +1,43 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+requires nbdkit --version
|
||||
+requires nbdkit -U - null --run 'test "$uri" != ""'
|
||||
+requires tr --version
|
||||
+
|
||||
+out=info-map-totals.out
|
||||
+cleanup_fn rm -f $out
|
||||
+rm -f $out
|
||||
+
|
||||
+# The sparse allocator used by nbdkit-data-plugin uses a 32K page
|
||||
+# size, and extents are always aligned with this.
|
||||
+nbdkit -U - data data='1 @131072 2' size=1M \
|
||||
+ --run '$VG nbdinfo --map --totals "$uri"' > $out
|
||||
+
|
||||
+cat $out
|
||||
+
|
||||
+if [ "$(tr -s ' ' < $out)" != " 65536 6.2 0 data
|
||||
+ 983040 93.8 3 hole,zero" ]; then
|
||||
+ echo "$0: unexpected output from nbdinfo --map"
|
||||
+ exit 1
|
||||
+fi
|
||||
diff --git a/info/main.c b/info/main.c
|
||||
index 8be52b7..fcda25c 100644
|
||||
--- a/info/main.c
|
||||
+++ b/info/main.c
|
||||
@@ -42,6 +42,7 @@ bool probe_content = false; /* --content / --no-content option */
|
||||
bool json_output = false; /* --json option */
|
||||
const char *map = NULL; /* --map option */
|
||||
bool size_only = false; /* --size option */
|
||||
+bool totals = false; /* --totals option */
|
||||
|
||||
static void __attribute__((noreturn))
|
||||
usage (FILE *fp, int exitcode)
|
||||
@@ -52,7 +53,7 @@ usage (FILE *fp, int exitcode)
|
||||
"\n"
|
||||
" nbdinfo [--json] NBD-URI\n"
|
||||
" nbdinfo --size [--json] NBD-URI\n"
|
||||
-" nbdinfo --map [--json] NBD-URI\n"
|
||||
+" nbdinfo --map [--totals] [--json] NBD-URI\n"
|
||||
" nbdinfo -L|--list [--json] NBD-URI\n"
|
||||
"\n"
|
||||
"Other options:\n"
|
||||
@@ -87,6 +88,7 @@ main (int argc, char *argv[])
|
||||
JSON_OPTION,
|
||||
MAP_OPTION,
|
||||
SIZE_OPTION,
|
||||
+ TOTALS_OPTION,
|
||||
};
|
||||
const char *short_options = "LV";
|
||||
const struct option long_options[] = {
|
||||
@@ -99,6 +101,8 @@ main (int argc, char *argv[])
|
||||
{ "map", optional_argument, NULL, MAP_OPTION },
|
||||
{ "short-options", no_argument, NULL, SHORT_OPTIONS },
|
||||
{ "size", no_argument, NULL, SIZE_OPTION },
|
||||
+ { "total", no_argument, NULL, TOTALS_OPTION },
|
||||
+ { "totals", no_argument, NULL, TOTALS_OPTION },
|
||||
{ "version", no_argument, NULL, 'V' },
|
||||
{ NULL }
|
||||
};
|
||||
@@ -155,6 +159,10 @@ main (int argc, char *argv[])
|
||||
size_only = true;
|
||||
break;
|
||||
|
||||
+ case TOTALS_OPTION:
|
||||
+ totals = true;
|
||||
+ break;
|
||||
+
|
||||
case 'L':
|
||||
list_all = true;
|
||||
break;
|
||||
@@ -184,6 +192,11 @@ main (int argc, char *argv[])
|
||||
progname, "--content", "--no-content");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
+ if (totals && !map) {
|
||||
+ fprintf (stderr, "%s: you must use --totals only with --map option.\n",
|
||||
+ progname);
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
|
||||
/* Work out if we should probe content. */
|
||||
probe_content = !list_all;
|
||||
diff --git a/info/map.c b/info/map.c
|
||||
index 82c9507..628033c 100644
|
||||
--- a/info/map.c
|
||||
+++ b/info/map.c
|
||||
@@ -38,6 +38,7 @@
|
||||
DEFINE_VECTOR_TYPE (uint32_vector, uint32_t)
|
||||
|
||||
static void print_extents (uint32_vector *entries);
|
||||
+static void print_totals (uint32_vector *entries, int64_t size);
|
||||
static int extent_callback (void *user_data, const char *metacontext,
|
||||
uint64_t offset,
|
||||
uint32_t *entries, size_t nr_entries,
|
||||
@@ -89,7 +90,10 @@ do_map (void)
|
||||
offset += entries.ptr[i];
|
||||
}
|
||||
|
||||
- print_extents (&entries);
|
||||
+ if (!totals)
|
||||
+ print_extents (&entries);
|
||||
+ else
|
||||
+ print_totals (&entries, size);
|
||||
free (entries.ptr);
|
||||
}
|
||||
|
||||
@@ -195,6 +199,82 @@ print_one_extent (uint64_t offset, uint64_t len, uint32_t type)
|
||||
free (descr);
|
||||
}
|
||||
|
||||
+/* --map --totals suboption */
|
||||
+static void
|
||||
+print_totals (uint32_vector *entries, int64_t size)
|
||||
+{
|
||||
+ uint32_t type;
|
||||
+ bool comma = false;
|
||||
+
|
||||
+ /* This is necessary to avoid a divide by zero below, but if the
|
||||
+ * size of the export is zero then we know we will not print any
|
||||
+ * information below so return quickly.
|
||||
+ */
|
||||
+ if (size == 0) {
|
||||
+ if (json_output) fprintf (fp, "[]\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (json_output) fprintf (fp, "[\n");
|
||||
+
|
||||
+ /* In the outer loop assume we have already printed all entries with
|
||||
+ * entry type < type. Count all instances of type and at the same
|
||||
+ * time find the next type that exists > type.
|
||||
+ */
|
||||
+ type = 0;
|
||||
+ for (;;) {
|
||||
+ uint64_t next_type = (uint64_t)UINT32_MAX + 1;
|
||||
+ uint64_t c = 0;
|
||||
+ size_t i;
|
||||
+
|
||||
+ for (i = 0; i < entries->size; i += 2) {
|
||||
+ uint32_t t = entries->ptr[i+1];
|
||||
+
|
||||
+ if (t == type)
|
||||
+ c += entries->ptr[i];
|
||||
+ else if (type < t && t < next_type)
|
||||
+ next_type = t;
|
||||
+ }
|
||||
+
|
||||
+ if (c > 0) {
|
||||
+ char *descr = extent_description (map, type);
|
||||
+ double percent = 100.0 * c / size;
|
||||
+
|
||||
+ if (!json_output) {
|
||||
+ fprintf (fp, "%10" PRIu64 " %5.1f %3" PRIu32,
|
||||
+ c, percent, type);
|
||||
+ if (descr)
|
||||
+ fprintf (fp, " %s", descr);
|
||||
+ fprintf (fp, "\n");
|
||||
+ }
|
||||
+ else {
|
||||
+ if (comma)
|
||||
+ fprintf (fp, ",\n");
|
||||
+
|
||||
+ fprintf (fp,
|
||||
+ "{ \"size\": %" PRIu64 ", "
|
||||
+ "\"percent\": %g, "
|
||||
+ "\"type\": %" PRIu32,
|
||||
+ c, percent, type);
|
||||
+ if (descr) {
|
||||
+ fprintf (fp, ", \"description\": ");
|
||||
+ print_json_string (descr);
|
||||
+ }
|
||||
+ fprintf (fp, " }");
|
||||
+ comma = true;
|
||||
+ }
|
||||
+
|
||||
+ free (descr);
|
||||
+ }
|
||||
+
|
||||
+ if (next_type == (uint64_t)UINT32_MAX + 1)
|
||||
+ break;
|
||||
+ type = next_type;
|
||||
+ }
|
||||
+
|
||||
+ if (json_output) fprintf (fp, "\n]\n");
|
||||
+}
|
||||
+
|
||||
static char *
|
||||
extent_description (const char *metacontext, uint32_t type)
|
||||
{
|
||||
diff --git a/info/nbdinfo.h b/info/nbdinfo.h
|
||||
index ff13e37..6ff73af 100644
|
||||
--- a/info/nbdinfo.h
|
||||
+++ b/info/nbdinfo.h
|
||||
@@ -32,6 +32,7 @@ extern bool probe_content;
|
||||
extern bool json_output;
|
||||
extern const char *map;
|
||||
extern bool size_only;
|
||||
+extern bool totals;
|
||||
|
||||
/* list.c */
|
||||
extern void collect_exports (void);
|
||||
diff --git a/info/nbdinfo.pod b/info/nbdinfo.pod
|
||||
index f1344d4..0c03bcd 100644
|
||||
--- a/info/nbdinfo.pod
|
||||
+++ b/info/nbdinfo.pod
|
||||
@@ -8,7 +8,7 @@ nbdinfo - display information and metadata about NBD servers and exports
|
||||
|
||||
nbdinfo --size [--json] NBD-URI
|
||||
|
||||
- nbdinfo --map [--json] NBD-URI
|
||||
+ nbdinfo --map [--totals] [--json] NBD-URI
|
||||
|
||||
nbdinfo -L|--list [--json] NBD-URI
|
||||
|
||||
@@ -119,6 +119,35 @@ other maps too:
|
||||
For more information on NBD maps, see I<Metadata querying> in the NBD
|
||||
protocol.
|
||||
|
||||
+=head2 Map totals
|
||||
+
|
||||
+Using S<I<--map --totals>> performs the same operation as I<--map> but
|
||||
+displays a summary of the total size of each type of allocation, in
|
||||
+bytes and as a percentage (of the virtual size of the export). This
|
||||
+is useful for estimating how much real storage is used on the server,
|
||||
+or might be required when copying a sparse image with L<nbdcopy(1)>.
|
||||
+
|
||||
+In the example below, half (50.0%) of the disk is allocated data and
|
||||
+half is unallocated:
|
||||
+
|
||||
+ $ nbdinfo --map --totals nbd://localhost/
|
||||
+ 1048576 50.0 0 data
|
||||
+ 1048576 50.0 3 hole,zero
|
||||
+
|
||||
+The fields are: total size in bytes, percentage of the virtual size,
|
||||
+type, description (optional).
|
||||
+
|
||||
+You can also get the same information in parseable form using I<--json>:
|
||||
+
|
||||
+ $ nbdinfo --map --totals --json nbd://localhost/
|
||||
+ [{ "size": 1048576, "percent": 50,
|
||||
+ "type": 0, "description": "data" },
|
||||
+ { "size": 1048576, "percent": 50,
|
||||
+ "type": 3, "description": "hole,zero" }]
|
||||
+
|
||||
+As with the I<--map> option, by default this shows the
|
||||
+C<"base:allocation"> map, but you can show the summary for other maps.
|
||||
+
|
||||
=head2 List all exports
|
||||
|
||||
To list all the exports available on an NBD server use the I<--list>
|
||||
@@ -179,7 +208,7 @@ The output is displayed in JSON format.
|
||||
Display the map (usually whether parts of the disk are allocated or
|
||||
sparse) of the given export. This displays the C<"base:allocation">
|
||||
map by default, you can choose a different map with the optional
|
||||
-parameter.
|
||||
+parameter. Using S<I<--map --totals>> displays a summary.
|
||||
|
||||
=item B<-L>
|
||||
|
||||
@@ -188,6 +217,11 @@ parameter.
|
||||
List all the exports on an NBD server. The export name in the NBD URI
|
||||
is ignored.
|
||||
|
||||
+=item B<--totals>
|
||||
+
|
||||
+Use S<I<--map --totals>> to display a summary. See L</Map totals>
|
||||
+above.
|
||||
+
|
||||
=item B<--size>
|
||||
|
||||
Display only the size in bytes of the export.
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,679 +0,0 @@
|
|||
From 5a4dd174e893aec775c3f93c5c94c0a633437245 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 26 Jun 2021 20:15:01 +0100
|
||||
Subject: [PATCH] info: Add --can|--is options to test for NBD flags
|
||||
|
||||
You can use them to test export properties from shell scripts, eg:
|
||||
|
||||
if nbdinfo --is read-only nbd://localhost ; then
|
||||
error "this NBD server does not support writing"
|
||||
fi
|
||||
|
||||
Note in this implementation --can and --is are really synonyms.
|
||||
|
||||
(cherry picked from commit b39ab287a94f5743775dc13a33b814653d11bdd1)
|
||||
---
|
||||
info/Makefile.am | 6 ++
|
||||
info/can.c | 94 ++++++++++++++++++++++++++++++++
|
||||
info/info-can-connect.sh | 29 ++++++++++
|
||||
info/info-can-read.sh | 29 ++++++++++
|
||||
info/info-can-zero.sh | 35 ++++++++++++
|
||||
info/info-can.sh | 93 +++++++++++++++++++++++++++++++
|
||||
info/info-is-read-only.sh | 36 ++++++++++++
|
||||
info/main.c | 21 ++++++-
|
||||
info/nbdinfo.h | 5 ++
|
||||
info/nbdinfo.pod | 112 ++++++++++++++++++++++++++++++++++++++
|
||||
10 files changed, 458 insertions(+), 2 deletions(-)
|
||||
create mode 100644 info/can.c
|
||||
create mode 100755 info/info-can-connect.sh
|
||||
create mode 100755 info/info-can-read.sh
|
||||
create mode 100755 info/info-can-zero.sh
|
||||
create mode 100755 info/info-can.sh
|
||||
create mode 100755 info/info-is-read-only.sh
|
||||
|
||||
diff --git a/info/Makefile.am b/info/Makefile.am
|
||||
index 75c6a75..a5708ec 100644
|
||||
--- a/info/Makefile.am
|
||||
+++ b/info/Makefile.am
|
||||
@@ -18,6 +18,11 @@
|
||||
include $(top_srcdir)/subdir-rules.mk
|
||||
|
||||
info_sh_files = \
|
||||
+ info-can.sh \
|
||||
+ info-can-connect.sh \
|
||||
+ info-can-read.sh \
|
||||
+ info-can-zero.sh \
|
||||
+ info-is-read-only.sh \
|
||||
info-list.sh \
|
||||
info-list-json.sh \
|
||||
info-list-qemu.sh \
|
||||
@@ -63,6 +68,7 @@ TESTS =
|
||||
|
||||
nbdinfo_SOURCES = \
|
||||
nbdinfo.h \
|
||||
+ can.c \
|
||||
list.c \
|
||||
main.c \
|
||||
map.c \
|
||||
diff --git a/info/can.c b/info/can.c
|
||||
new file mode 100644
|
||||
index 0000000..ee8bbb7
|
||||
--- /dev/null
|
||||
+++ b/info/can.c
|
||||
@@ -0,0 +1,94 @@
|
||||
+/* NBD client library in userspace
|
||||
+ * Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+ *
|
||||
+ * This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with this library; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+ */
|
||||
+
|
||||
+#include <config.h>
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+
|
||||
+#include <libnbd.h>
|
||||
+
|
||||
+#include "nbdinfo.h"
|
||||
+
|
||||
+int can_exit_code;
|
||||
+
|
||||
+void
|
||||
+do_can (void)
|
||||
+{
|
||||
+ int feature;
|
||||
+
|
||||
+ if (strcasecmp (can, "connect") == 0 ||
|
||||
+ strcasecmp (can, "read") == 0)
|
||||
+ feature = 1;
|
||||
+
|
||||
+ else if (strcasecmp (can, "readonly") == 0 ||
|
||||
+ strcasecmp (can, "read-only") == 0 ||
|
||||
+ strcasecmp (can, "read_only") == 0)
|
||||
+ feature = nbd_is_read_only (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "write") == 0) {
|
||||
+ feature = nbd_is_read_only (nbd);
|
||||
+ if (feature >= 0) feature = !feature;
|
||||
+ }
|
||||
+
|
||||
+ else if (strcasecmp (can, "rotational") == 0)
|
||||
+ feature = nbd_is_rotational (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "cache") == 0)
|
||||
+ feature = nbd_can_cache (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "df") == 0)
|
||||
+ feature = nbd_can_df (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "fastzero") == 0 ||
|
||||
+ strcasecmp (can, "fast-zero") == 0 ||
|
||||
+ strcasecmp (can, "fast_zero") == 0)
|
||||
+ feature = nbd_can_fast_zero (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "flush") == 0)
|
||||
+ feature = nbd_can_flush (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "fua") == 0)
|
||||
+ feature = nbd_can_fua (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "multiconn") == 0 ||
|
||||
+ strcasecmp (can, "multi-conn") == 0 ||
|
||||
+ strcasecmp (can, "multi_conn") == 0)
|
||||
+ feature = nbd_can_multi_conn (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "trim") == 0)
|
||||
+ feature = nbd_can_trim (nbd);
|
||||
+
|
||||
+ else if (strcasecmp (can, "zero") == 0)
|
||||
+ feature = nbd_can_zero (nbd);
|
||||
+
|
||||
+ else {
|
||||
+ fprintf (stderr, "%s: unknown --can or --is option: %s\n",
|
||||
+ progname, can);
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ if (feature == -1) {
|
||||
+ fprintf (stderr, "%s: %s\n", progname, nbd_get_error ());
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ /* Translate the feature bool into an exit code. This is used in main(). */
|
||||
+ can_exit_code = feature ? EXIT_SUCCESS : 2;
|
||||
+}
|
||||
diff --git a/info/info-can-connect.sh b/info/info-can-connect.sh
|
||||
new file mode 100755
|
||||
index 0000000..eecc290
|
||||
--- /dev/null
|
||||
+++ b/info/info-can-connect.sh
|
||||
@@ -0,0 +1,29 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+# --can connect always returns true.
|
||||
+
|
||||
+requires nbdkit null --version
|
||||
+
|
||||
+nbdkit -v -U - null \
|
||||
+ --run '$VG nbdinfo --can connect "nbd+unix:///?socket=$unixsocket"'
|
||||
diff --git a/info/info-can-read.sh b/info/info-can-read.sh
|
||||
new file mode 100755
|
||||
index 0000000..b1edeab
|
||||
--- /dev/null
|
||||
+++ b/info/info-can-read.sh
|
||||
@@ -0,0 +1,29 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+# --can read always returns true.
|
||||
+
|
||||
+requires nbdkit null --version
|
||||
+
|
||||
+nbdkit -v -U - null \
|
||||
+ --run '$VG nbdinfo --can read "nbd+unix:///?socket=$unixsocket"'
|
||||
diff --git a/info/info-can-zero.sh b/info/info-can-zero.sh
|
||||
new file mode 100755
|
||||
index 0000000..e388243
|
||||
--- /dev/null
|
||||
+++ b/info/info-can-zero.sh
|
||||
@@ -0,0 +1,35 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+# nbdkit emulates zeroing so we have to use the nozero filter to test
|
||||
+# the negative case below.
|
||||
+
|
||||
+requires nbdkit null --version
|
||||
+requires nbdkit null --filter=nozero --version
|
||||
+
|
||||
+nbdkit -v -U - null \
|
||||
+ --run '$VG nbdinfo --can zero "nbd+unix:///?socket=$unixsocket"'
|
||||
+
|
||||
+nbdkit -v -U - null \
|
||||
+ --filter=nozero \
|
||||
+ --run '! $VG nbdinfo --can zero "nbd+unix:///?socket=$unixsocket"'
|
||||
diff --git a/info/info-can.sh b/info/info-can.sh
|
||||
new file mode 100755
|
||||
index 0000000..4154e38
|
||||
--- /dev/null
|
||||
+++ b/info/info-can.sh
|
||||
@@ -0,0 +1,93 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+requires nbdkit --version
|
||||
+requires nbdkit sh --version
|
||||
+
|
||||
+# --is read-only and --can write are tested in info-is-read-only.sh
|
||||
+
|
||||
+# --can connect is tested in info-can-connect.sh
|
||||
+
|
||||
+# --can read is tested in info-can-read.sh
|
||||
+
|
||||
+# --can zero is tested in info-can-zero.sh
|
||||
+
|
||||
+# --can df is hard to test. nbdkit newstyle probably always sets this
|
||||
+# and oldstyle never, but that feels like depending a bit too much on
|
||||
+# the implementation.
|
||||
+
|
||||
+# --can cache and --can fua require special handling because in
|
||||
+# nbdkit-sh-plugin we must print "native" or "none". Also the can_fua
|
||||
+# flag is only sent if the export is writable (hence can_write below).
|
||||
+
|
||||
+for flag in cache fua; do
|
||||
+ export flag
|
||||
+ nbdkit -v -U - sh - \
|
||||
+ --run '$VG nbdinfo --can $flag "nbd+unix:///?socket=$unixsocket"' <<'EOF'
|
||||
+case "$1" in
|
||||
+ get_size) echo 1024 ;;
|
||||
+ pread) ;;
|
||||
+ can_write) ;;
|
||||
+ can_$flag) echo native ;;
|
||||
+ *) exit 2 ;;
|
||||
+esac
|
||||
+EOF
|
||||
+
|
||||
+ nbdkit -v -U - sh - \
|
||||
+ --run '! $VG nbdinfo --can $flag "nbd+unix:///?socket=$unixsocket"' <<'EOF'
|
||||
+case "$1" in
|
||||
+ get_size) echo 1024 ;;
|
||||
+ pread) ;;
|
||||
+ can_write) ;;
|
||||
+ can_$flag) echo none ;;
|
||||
+ *) exit 2 ;;
|
||||
+esac
|
||||
+EOF
|
||||
+done
|
||||
+
|
||||
+# These ones are normal booleans.
|
||||
+
|
||||
+for flag in fast_zero flush multi_conn trim ; do
|
||||
+ export flag
|
||||
+ nbdkit -v -U - sh - \
|
||||
+ --run '$VG nbdinfo --can $flag "nbd+unix:///?socket=$unixsocket"' <<'EOF'
|
||||
+case "$1" in
|
||||
+ get_size) echo 1024 ;;
|
||||
+ pread) ;;
|
||||
+ can_write) ;;
|
||||
+ can_$flag) exit 0 ;;
|
||||
+ *) exit 2 ;;
|
||||
+esac
|
||||
+EOF
|
||||
+
|
||||
+ nbdkit -v -U - sh - \
|
||||
+ --run '! $VG nbdinfo --can $flag "nbd+unix:///?socket=$unixsocket"' <<'EOF'
|
||||
+case "$1" in
|
||||
+ get_size) echo 1024 ;;
|
||||
+ pread) ;;
|
||||
+ can_write) ;;
|
||||
+ can_$flag) exit 3 ;;
|
||||
+ *) exit 2 ;;
|
||||
+esac
|
||||
+EOF
|
||||
+done
|
||||
diff --git a/info/info-is-read-only.sh b/info/info-is-read-only.sh
|
||||
new file mode 100755
|
||||
index 0000000..db024b4
|
||||
--- /dev/null
|
||||
+++ b/info/info-is-read-only.sh
|
||||
@@ -0,0 +1,36 @@
|
||||
+#!/usr/bin/env bash
|
||||
+# nbd client library in userspace
|
||||
+# Copyright (C) 2020-2021 Red Hat Inc.
|
||||
+#
|
||||
+# This library is free software; you can redistribute it and/or
|
||||
+# modify it under the terms of the GNU Lesser General Public
|
||||
+# License as published by the Free Software Foundation; either
|
||||
+# version 2 of the License, or (at your option) any later version.
|
||||
+#
|
||||
+# This library is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+# Lesser General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU Lesser General Public
|
||||
+# License along with this library; if not, write to the Free Software
|
||||
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+
|
||||
+. ../tests/functions.sh
|
||||
+
|
||||
+set -e
|
||||
+set -x
|
||||
+
|
||||
+# Test --is read-only and --can write.
|
||||
+
|
||||
+requires nbdkit --version
|
||||
+requires nbdkit null --version
|
||||
+
|
||||
+nbdkit -U - -r null \
|
||||
+ --run '$VG nbdinfo --is read-only "nbd+unix:///?socket=$unixsocket"'
|
||||
+nbdkit -U - -r null \
|
||||
+ --run '! $VG nbdinfo --can write "nbd+unix:///?socket=$unixsocket"'
|
||||
+nbdkit -U - null \
|
||||
+ --run '$VG nbdinfo --can write "nbd+unix:///?socket=$unixsocket"'
|
||||
+nbdkit -U - null \
|
||||
+ --run '! $VG nbdinfo --is read-only "nbd+unix:///?socket=$unixsocket"'
|
||||
diff --git a/info/main.c b/info/main.c
|
||||
index fcda25c..82946ee 100644
|
||||
--- a/info/main.c
|
||||
+++ b/info/main.c
|
||||
@@ -40,6 +40,7 @@ FILE *fp; /* output file descriptor */
|
||||
bool list_all = false; /* --list option */
|
||||
bool probe_content = false; /* --content / --no-content option */
|
||||
bool json_output = false; /* --json option */
|
||||
+const char *can = NULL; /* --is/--can option */
|
||||
const char *map = NULL; /* --map option */
|
||||
bool size_only = false; /* --size option */
|
||||
bool totals = false; /* --totals option */
|
||||
@@ -53,6 +54,8 @@ usage (FILE *fp, int exitcode)
|
||||
"\n"
|
||||
" nbdinfo [--json] NBD-URI\n"
|
||||
" nbdinfo --size [--json] NBD-URI\n"
|
||||
+" nbdinfo --is read-only|rotational NBD-URI\n"
|
||||
+" nbdinfo --can cache|connect|... NBD-URI\n"
|
||||
" nbdinfo --map [--totals] [--json] NBD-URI\n"
|
||||
" nbdinfo -L|--list [--json] NBD-URI\n"
|
||||
"\n"
|
||||
@@ -66,6 +69,8 @@ usage (FILE *fp, int exitcode)
|
||||
" nbdinfo nbd://localhost\n"
|
||||
" nbdinfo \"nbd+unix:///?socket=/tmp/unixsock\"\n"
|
||||
" nbdinfo --size nbd://example.com\n"
|
||||
+" nbdinfo --can connect nbd://example.com\n"
|
||||
+" nbdinfo --is read-only nbd://example.com\n"
|
||||
" nbdinfo --map nbd://example.com\n"
|
||||
" nbdinfo --json nbd://example.com\n"
|
||||
" nbdinfo --list nbd://example.com\n"
|
||||
@@ -86,6 +91,7 @@ main (int argc, char *argv[])
|
||||
CONTENT_OPTION,
|
||||
NO_CONTENT_OPTION,
|
||||
JSON_OPTION,
|
||||
+ CAN_OPTION,
|
||||
MAP_OPTION,
|
||||
SIZE_OPTION,
|
||||
TOTALS_OPTION,
|
||||
@@ -93,8 +99,10 @@ main (int argc, char *argv[])
|
||||
const char *short_options = "LV";
|
||||
const struct option long_options[] = {
|
||||
{ "help", no_argument, NULL, HELP_OPTION },
|
||||
+ { "can", required_argument, NULL, CAN_OPTION },
|
||||
{ "content", no_argument, NULL, CONTENT_OPTION },
|
||||
{ "no-content", no_argument, NULL, NO_CONTENT_OPTION },
|
||||
+ { "is", required_argument, NULL, CAN_OPTION },
|
||||
{ "json", no_argument, NULL, JSON_OPTION },
|
||||
{ "list", no_argument, NULL, 'L' },
|
||||
{ "long-options", no_argument, NULL, LONG_OPTIONS },
|
||||
@@ -151,6 +159,10 @@ main (int argc, char *argv[])
|
||||
no_content_flag = true;
|
||||
break;
|
||||
|
||||
+ case CAN_OPTION:
|
||||
+ can = optarg;
|
||||
+ break;
|
||||
+
|
||||
case MAP_OPTION:
|
||||
map = optarg ? optarg : "base:allocation";
|
||||
break;
|
||||
@@ -181,7 +193,7 @@ main (int argc, char *argv[])
|
||||
usage (stderr, EXIT_FAILURE);
|
||||
|
||||
/* You cannot combine certain options. */
|
||||
- if (!!list_all + !!map + !!size_only > 1) {
|
||||
+ if (!!list_all + !!can + !!map + !!size_only > 1) {
|
||||
fprintf (stderr,
|
||||
"%s: you cannot use --list, --map and --size together.\n",
|
||||
progname);
|
||||
@@ -204,6 +216,8 @@ main (int argc, char *argv[])
|
||||
probe_content = true;
|
||||
if (no_content_flag)
|
||||
probe_content = false;
|
||||
+ if (can)
|
||||
+ probe_content = false;
|
||||
if (map)
|
||||
probe_content = false;
|
||||
|
||||
@@ -227,7 +241,7 @@ main (int argc, char *argv[])
|
||||
nbd_set_uri_allow_local_file (nbd, true); /* Allow ?tls-psk-file. */
|
||||
|
||||
/* Set optional modes in the handle. */
|
||||
- if (!map && !size_only) {
|
||||
+ if (!can && !map && !size_only) {
|
||||
nbd_set_opt_mode (nbd, true);
|
||||
nbd_set_full_info (nbd, true);
|
||||
}
|
||||
@@ -246,6 +260,8 @@ main (int argc, char *argv[])
|
||||
|
||||
if (size_only) /* --size (!list_all) */
|
||||
do_size ();
|
||||
+ else if (can) /* --is/--can (!list_all) */
|
||||
+ do_can ();
|
||||
else if (map) /* --map (!list_all) */
|
||||
do_map ();
|
||||
else { /* not --size or --map */
|
||||
@@ -304,5 +320,6 @@ main (int argc, char *argv[])
|
||||
|
||||
free (output);
|
||||
|
||||
+ if (can) exit (can_exit_code);
|
||||
exit (list_okay ? EXIT_SUCCESS : EXIT_FAILURE);
|
||||
}
|
||||
diff --git a/info/nbdinfo.h b/info/nbdinfo.h
|
||||
index 6ff73af..566a2cb 100644
|
||||
--- a/info/nbdinfo.h
|
||||
+++ b/info/nbdinfo.h
|
||||
@@ -30,10 +30,15 @@ extern FILE *fp;
|
||||
extern bool list_all;
|
||||
extern bool probe_content;
|
||||
extern bool json_output;
|
||||
+extern const char *can;
|
||||
extern const char *map;
|
||||
extern bool size_only;
|
||||
extern bool totals;
|
||||
|
||||
+/* can.c */
|
||||
+extern int can_exit_code;
|
||||
+extern void do_can (void);
|
||||
+
|
||||
/* list.c */
|
||||
extern void collect_exports (void);
|
||||
extern bool list_all_exports (const char *uri);
|
||||
diff --git a/info/nbdinfo.pod b/info/nbdinfo.pod
|
||||
index 0c03bcd..fb20f0e 100644
|
||||
--- a/info/nbdinfo.pod
|
||||
+++ b/info/nbdinfo.pod
|
||||
@@ -8,6 +8,10 @@ nbdinfo - display information and metadata about NBD servers and exports
|
||||
|
||||
nbdinfo --size [--json] NBD-URI
|
||||
|
||||
+ nbdinfo --is read-only|rotational NBD-URI
|
||||
+
|
||||
+ nbdinfo --can cache|connect|... NBD-URI
|
||||
+
|
||||
nbdinfo --map [--totals] [--json] NBD-URI
|
||||
|
||||
nbdinfo -L|--list [--json] NBD-URI
|
||||
@@ -87,6 +91,66 @@ scripting) use the I<--size> parameter:
|
||||
$ nbdinfo --size nbd://localhost
|
||||
1048576
|
||||
|
||||
+=head2 Test for flags
|
||||
+
|
||||
+Use one of the options below to test NBD flags. The command does not
|
||||
+print anything. Instead it exits with success (S<exit code 0>) if
|
||||
+true, or failure (S<exit code 2>) if false. (Other exit codes
|
||||
+indicate an error querying the flag). You can use it in shell scripts
|
||||
+like this:
|
||||
+
|
||||
+ if nbdinfo --is read-only nbd://localhost ||
|
||||
+ ! nbdinfo --can trim nbd://localhost
|
||||
+ then
|
||||
+ error "the device must support writing and trimming"
|
||||
+ fi
|
||||
+
|
||||
+=over 4
|
||||
+
|
||||
+=item nbdinfo --is read-only URI
|
||||
+
|
||||
+Test if the server export is read-only.
|
||||
+
|
||||
+=item nbdinfo --can write URI
|
||||
+
|
||||
+For convenience this is the opposite of I<--is read-only>.
|
||||
+
|
||||
+=item nbdinfo --can read URI
|
||||
+
|
||||
+All NBD servers must support read, so this always exits with success
|
||||
+(unless there is a failure connecting to the URI).
|
||||
+
|
||||
+=item nbdinfo --can connect URI
|
||||
+
|
||||
+Test if we can connect to the NBD URI.
|
||||
+
|
||||
+=item nbdinfo --is rotational URI
|
||||
+
|
||||
+Test if the server export is backed by something which behaves like a
|
||||
+rotating disk: accessing nearby blocks may be faster than random
|
||||
+access and requests should be sorted to improve performance. Many
|
||||
+servers do not or cannot report this accurately.
|
||||
+
|
||||
+=item nbdinfo --can cache URI
|
||||
+
|
||||
+=item nbdinfo --can df URI
|
||||
+
|
||||
+=item nbdinfo --can fast-zero URI
|
||||
+
|
||||
+=item nbdinfo --can flush URI
|
||||
+
|
||||
+=item nbdinfo --can fua URI
|
||||
+
|
||||
+=item nbdinfo --can multi-conn URI
|
||||
+
|
||||
+=item nbdinfo --can trim URI
|
||||
+
|
||||
+=item nbdinfo --can zero URI
|
||||
+
|
||||
+Test other properties of the NBD server export.
|
||||
+
|
||||
+=back
|
||||
+
|
||||
=head2 Map
|
||||
|
||||
To show a map of which areas of the disk are allocated and sparse, use
|
||||
@@ -181,6 +245,40 @@ API can be used for more complex queries.
|
||||
|
||||
Display brief command line help and exit.
|
||||
|
||||
+=item B<--can cache>
|
||||
+
|
||||
+=item B<--can connect>
|
||||
+
|
||||
+=item B<--can df>
|
||||
+
|
||||
+=item B<--can fast-zero>
|
||||
+
|
||||
+=item B<--can flush>
|
||||
+
|
||||
+=item B<--can fua>
|
||||
+
|
||||
+=item B<--can multi-conn>
|
||||
+
|
||||
+=item B<--can read>
|
||||
+
|
||||
+=item B<--can trim>
|
||||
+
|
||||
+=item B<--can write>
|
||||
+
|
||||
+=item B<--can zero>
|
||||
+
|
||||
+Test properties of the NBD server export. The command does not print
|
||||
+anything. Instead it exits with success (S<exit code 0>) if true, or
|
||||
+failure (S<exit code 2>) if false. (Other exit codes indicate an
|
||||
+error querying the flag).
|
||||
+
|
||||
+For further information see the L<NBD
|
||||
+protocol|https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md>
|
||||
+and the following libnbd functions: L<nbd_can_cache(3)>,
|
||||
+L<nbd_can_df(3)>, L<nbd_can_fast_zero(3)>, L<nbd_can_flush(3)>,
|
||||
+L<nbd_can_fua(3)>, L<nbd_can_multi_conn(3)>, L<nbd_can_trim(3)>,
|
||||
+L<nbd_can_zero(3)>, L<nbd_is_read_only(3)>.
|
||||
+
|
||||
=item B<--content>
|
||||
|
||||
=item B<--no-content>
|
||||
@@ -197,6 +295,20 @@ When using I<--list>, the default is I<--no-content> (since
|
||||
downloading from each export is expensive). To enable content probing
|
||||
use I<--list --content>.
|
||||
|
||||
+=item B<--is read-only>
|
||||
+
|
||||
+=item B<--is rotational>
|
||||
+
|
||||
+Test if the NBD server export is read-only and rotational. The
|
||||
+command does not print anything. Instead it exits with success
|
||||
+(S<exit code 0>) if true, or failure (S<exit code 2>) if false.
|
||||
+(Other exit codes indicate an error querying the flag).
|
||||
+
|
||||
+For further information see the L<NBD
|
||||
+protocol|https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md>
|
||||
+and the following libnbd functions: L<nbd_is_read_only(3)>,
|
||||
+L<nbd_is_rotational(3)>.
|
||||
+
|
||||
=item B<--json>
|
||||
|
||||
The output is displayed in JSON format.
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
From f4e3a9ac3d80c0e73e3b92fdb1faa704595fe61e Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Mon, 28 Jun 2021 18:54:21 +0100
|
||||
Subject: [PATCH] info: Add percentage after field in --map --totals
|
||||
|
||||
Add % sign after the percentage field in plain output (not JSON).
|
||||
|
||||
$ nbdkit -r file fedora-33.img --run 'nbdinfo --map --totals $uri'
|
||||
1226113024 19.0% 0 data
|
||||
5216337920 81.0% 3 hole,zero
|
||||
|
||||
Thanks: Eric Blake
|
||||
Updates: commit 7968bfe328e86574276283b159a594eeebeaf32a
|
||||
(cherry picked from commit 8d39d388cc18b2e16a01ba2b64f51672b5b91389)
|
||||
---
|
||||
info/info-map-totals.sh | 4 ++--
|
||||
info/map.c | 2 +-
|
||||
info/nbdinfo.pod | 4 ++--
|
||||
3 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/info/info-map-totals.sh b/info/info-map-totals.sh
|
||||
index 12c1263..c637ff5 100755
|
||||
--- a/info/info-map-totals.sh
|
||||
+++ b/info/info-map-totals.sh
|
||||
@@ -36,8 +36,8 @@ nbdkit -U - data data='1 @131072 2' size=1M \
|
||||
|
||||
cat $out
|
||||
|
||||
-if [ "$(tr -s ' ' < $out)" != " 65536 6.2 0 data
|
||||
- 983040 93.8 3 hole,zero" ]; then
|
||||
+if [ "$(tr -s ' ' < $out)" != " 65536 6.2% 0 data
|
||||
+ 983040 93.8% 3 hole,zero" ]; then
|
||||
echo "$0: unexpected output from nbdinfo --map"
|
||||
exit 1
|
||||
fi
|
||||
diff --git a/info/map.c b/info/map.c
|
||||
index 628033c..de7b7ab 100644
|
||||
--- a/info/map.c
|
||||
+++ b/info/map.c
|
||||
@@ -241,7 +241,7 @@ print_totals (uint32_vector *entries, int64_t size)
|
||||
double percent = 100.0 * c / size;
|
||||
|
||||
if (!json_output) {
|
||||
- fprintf (fp, "%10" PRIu64 " %5.1f %3" PRIu32,
|
||||
+ fprintf (fp, "%10" PRIu64 " %5.1f%% %3" PRIu32,
|
||||
c, percent, type);
|
||||
if (descr)
|
||||
fprintf (fp, " %s", descr);
|
||||
diff --git a/info/nbdinfo.pod b/info/nbdinfo.pod
|
||||
index fb20f0e..1699712 100644
|
||||
--- a/info/nbdinfo.pod
|
||||
+++ b/info/nbdinfo.pod
|
||||
@@ -195,8 +195,8 @@ In the example below, half (50.0%) of the disk is allocated data and
|
||||
half is unallocated:
|
||||
|
||||
$ nbdinfo --map --totals nbd://localhost/
|
||||
- 1048576 50.0 0 data
|
||||
- 1048576 50.0 3 hole,zero
|
||||
+ 1048576 50.0% 0 data
|
||||
+ 1048576 50.0% 3 hole,zero
|
||||
|
||||
The fields are: total size in bytes, percentage of the virtual size,
|
||||
type, description (optional).
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
From 7f5693e0b7bfa64129f9218de863757075f2fff7 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kletzander <mkletzan@redhat.com>
|
||||
Date: Wed, 7 Jul 2021 12:06:38 +0200
|
||||
Subject: [PATCH] info: Require can_cache for info-can.sh
|
||||
|
||||
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
|
||||
(cherry picked from commit 65cdf7354b8e4dd6db7dd31fa4321bea1d43650d)
|
||||
---
|
||||
info/info-can.sh | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/info/info-can.sh b/info/info-can.sh
|
||||
index 4154e38..00ba981 100755
|
||||
--- a/info/info-can.sh
|
||||
+++ b/info/info-can.sh
|
||||
@@ -22,7 +22,7 @@ set -e
|
||||
set -x
|
||||
|
||||
requires nbdkit --version
|
||||
-requires nbdkit sh --version
|
||||
+requires bash -c "nbdkit sh --dump-config | grep has_can_cache=1"
|
||||
|
||||
# --is read-only and --can write are tested in info-is-read-only.sh
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
|
@ -6,7 +6,7 @@ set -e
|
|||
# directory. Use it like this:
|
||||
# ./copy-patches.sh
|
||||
|
||||
rhel_version=9.0
|
||||
rhel_version=8.6
|
||||
|
||||
# Check we're in the right directory.
|
||||
if [ ! -f libnbd.spec ]; then
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAl/3RFQRHHJpY2hAYW5u
|
||||
ZXhpYS5vcmcACgkQkXOPc+G3aKD9aw/+Pfg3owjJmhTcCyFvuH2lgiiBb+qL2An+
|
||||
hsoax6dM5JxzV6x1Ikgn3C8z2+dLRMowo2FrRgpzTwfaS+ngLDipSC04hKl9MhFN
|
||||
7OPLCm+L7wcP7KUk4cC0qTSHpHkApo2SP3/bD7vVBYZMYSjgUVFcRoqZlRl3N9RF
|
||||
7XNsxA2YG9bV4Ln3KbB+k2uxIKNUZIVjmEpretVbb+NTKW9C23ZHicSHYB+Eok1M
|
||||
iTN6j66rYFn0Xb+L2v7jty19tSdYOMbkdSn0KpniURAWevjjVWGqcojMqW4YuAZ5
|
||||
h2MpRfyKFyusbsbtX5bjICTu6+AgFFUALKH7ReDs1RY1cEph9XdBLVulXTggxY05
|
||||
E3I1Nns1YmjRlV6ky2Abl2e+Doc44mycINRlwL2q8+Q3TqlVVPFXoVTWxIJ6/Uae
|
||||
tqnEwWIa2wGv3KU1KLNbWTn1z6I8NM/Nj+7pMKDNnxJzFmHEjL94tmG+iNmHsF34
|
||||
vWBZ1q7h9EezxHLOPFYDjlpS+IxeuXakbpuTX2jXvi3zSAbr5WmRR1uO8dAiwu9b
|
||||
RwOHRmVQOFLAAICYTZDmxl42DpWs5Z2aP7eRwpe8/MOSRiAVepjhUD/bsdaFwmBR
|
||||
8Z7CGNzyTtt+sy5l7cPBYZ+4RdxWgFEBceBbHs06zdlD/Pui288UQVB/0e9AXYOc
|
||||
wluyWT1v7sA=
|
||||
=BaN1
|
||||
-----END PGP SIGNATURE-----
|
|
@ -1,17 +0,0 @@
|
|||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmDgiJMRHHJpY2hAYW5u
|
||||
ZXhpYS5vcmcACgkQkXOPc+G3aKBKkw//Ze7klrXE+wu1KHde9dY1ojdPoSJiXi1c
|
||||
ti809JcR00UrnQ6SnQWxHhwLmkR0q5DetkjjIxeCjhqtNdTCcTIdVTr7qe4Rv6tS
|
||||
YlTnellTFBdNfoiD2Petza6vAq5OyuR27Smrngk78Kca6wvm7ONNwtXwUR29tJJd
|
||||
r/W+U0yQRxZyMn9gpfff1YQvt7wnm+rexpzuGv2K/jR+4yvRhiCFSkCM2Kn13i7s
|
||||
cWBx8bRG520HgC9Yx+QxB3b6wQap/JF5vwo+JWjwCxbsBegMoDqqHUcSAFGOKNr9
|
||||
s9pjNvUEFpFExIw32FGt6fdf0JCbgDY6ynKzJWrc49qBH7id6p6CrnJhF1AJVMAW
|
||||
NCypsEUrgLriSAaqzRRyvowa8mxXYy5yB2tZhmMrDXRfUJvqaMhdT6Rep+fGAATu
|
||||
F0THbBQlvdBA4sW2WDI7+F8Zx7eGHRNeP9qPe1PNMAtuHQDBDYWpfbfqqZfunv4K
|
||||
DUF1JyEKubeVPLs+deFaf0HhG3jtssIiz/62tzhCEb0RG6iTIWLWfvaddIDGiB9Q
|
||||
SavKFV8pkRM41XtQobG0fJw38T6z/9ba0Exoab0ectsG444g7jZ696N5oJ7Ko5B2
|
||||
GE52KIJHs9+dG3qClGR6GJQN2h7Ag7rOXICn4tpuvaHnTIePBKBWyF0H+X4qRxWn
|
||||
Kb0f2B3V6yQ=
|
||||
=MkEw
|
||||
-----END PGP SIGNATURE-----
|
|
@ -5,15 +5,15 @@
|
|||
%global patches_touch_autotools 1
|
||||
|
||||
# The source directory.
|
||||
%global source_directory 1.8-stable
|
||||
%global source_directory 1.6-stable
|
||||
|
||||
Name: libnbd
|
||||
Version: 1.8.2
|
||||
Release: 3%{?dist}
|
||||
Version: 1.6.0
|
||||
Release: 5%{?dist}
|
||||
Summary: NBD client library in userspace
|
||||
|
||||
License: LGPLv2+
|
||||
URL: https://gitlab.com/nbdkit/libnbd
|
||||
URL: https://github.com/libguestfs/libnbd
|
||||
|
||||
Source0: http://libguestfs.org/download/libnbd/%{source_directory}/%{name}-%{version}.tar.gz
|
||||
Source1: http://libguestfs.org/download/libnbd/%{source_directory}/%{name}-%{version}.tar.gz.sig
|
||||
|
@ -25,22 +25,17 @@ Source2: libguestfs.keyring
|
|||
# Maintainer script which helps with handling patches.
|
||||
Source3: copy-patches.sh
|
||||
|
||||
# Patches are stored in the upstream repository:
|
||||
# https://gitlab.com/nbdkit/libnbd/-/commits/rhel-9.0/
|
||||
# Patches come from this upstream branch:
|
||||
# https://github.com/libguestfs/libnbd/tree/rhel-8.6
|
||||
|
||||
# Patches.
|
||||
Patch0001: 0001-qemu-storage-daemon-5.2.0-is-still-broken.patch
|
||||
Patch0002: 0002-fuse-move-check-valgrind-out-from-condition.patch
|
||||
Patch0003: 0003-m4-Remove-on-make-clean.patch
|
||||
Patch0004: 0004-One-more-VSOCK-include-fix.patch
|
||||
Patch0005: 0005-macOS-Do-not-use-version_script.patch
|
||||
Patch0006: 0006-macOS-Simple-cloexec-nonblock-fix.patch
|
||||
Patch0007: 0007-copy-Fix-progress-bar.patch
|
||||
Patch0008: 0008-copy-Avoid-potential-divide-by-zero-when-source-size.patch
|
||||
Patch0009: 0009-info-Add-map-totals-sub-mode-to-display-summary-of-m.patch
|
||||
Patch0010: 0010-info-Add-can-is-options-to-test-for-NBD-flags.patch
|
||||
Patch0011: 0011-info-Add-percentage-after-field-in-map-totals.patch
|
||||
Patch0012: 0012-info-Require-can_cache-for-info-can.sh.patch
|
||||
Patch0001: 0001-copy-copy-nbd-to-sparse-file.sh-Skip-test-unless-nbd.patch
|
||||
Patch0002: 0002-generator-Refactor-CONNECT.START-state.patch
|
||||
Patch0003: 0003-generator-Print-a-better-error-message-if-connect-2-.patch
|
||||
Patch0004: 0004-opt_go-Tolerate-unplanned-server-death.patch
|
||||
Patch0005: 0005-security-Document-assignment-of-CVE-2021-20286.patch
|
||||
Patch0006: 0006-copy-Pass-in-dummy-variable-rather-than-errno-to-cal.patch
|
||||
Patch0007: 0007-copy-CVE-2022-0485-Fail-nbdcopy-if-NBD-read-or-write.patch
|
||||
|
||||
%if 0%{patches_touch_autotools}
|
||||
BuildRequires: autoconf, automake, libtool
|
||||
|
@ -52,13 +47,12 @@ BuildRequires: gnupg2
|
|||
|
||||
# For the core library.
|
||||
BuildRequires: gcc
|
||||
BuildRequires: make
|
||||
BuildRequires: /usr/bin/pod2man
|
||||
BuildRequires: gnutls-devel
|
||||
BuildRequires: libxml2-devel
|
||||
|
||||
# For nbdfuse.
|
||||
BuildRequires: fuse3, fuse3-devel
|
||||
BuildRequires: fuse, fuse-devel
|
||||
|
||||
# For the Python 3 bindings.
|
||||
BuildRequires: python3-devel
|
||||
|
@ -78,28 +72,20 @@ BuildRequires: bash-completion
|
|||
BuildRequires: coreutils
|
||||
BuildRequires: gcc-c++
|
||||
BuildRequires: gnutls-utils
|
||||
BuildRequires: iproute
|
||||
BuildRequires: jq
|
||||
%if !0%{?rhel}
|
||||
BuildRequires: nbd
|
||||
%endif
|
||||
BuildRequires: util-linux
|
||||
|
||||
# On RHEL, maybe even in Fedora in future, we do not build qemu-img or
|
||||
# nbdkit for i686. These are only needed for the test suite so make
|
||||
# them optional. This reduces our test exposure on 32 bit platforms,
|
||||
# although there is still Fedora/armv7 and some upstream testing.
|
||||
#BuildRequires: jq
|
||||
%ifnarch %{ix86}
|
||||
BuildRequires: qemu-img
|
||||
BuildRequires: nbdkit
|
||||
BuildRequires: nbdkit-data-plugin
|
||||
BuildRequires: nbdkit-eval-plugin
|
||||
#BuildRequires: nbdkit-eval-plugin
|
||||
BuildRequires: nbdkit-memory-plugin
|
||||
BuildRequires: nbdkit-null-plugin
|
||||
BuildRequires: nbdkit-pattern-plugin
|
||||
BuildRequires: nbdkit-sh-plugin
|
||||
BuildRequires: nbdkit-sparse-random-plugin
|
||||
#BuildRequires: nbdkit-sparse-random-plugin
|
||||
#BuildRequires: nbd
|
||||
BuildRequires: qemu-img
|
||||
%endif
|
||||
BuildRequires: util-linux
|
||||
|
||||
|
||||
%description
|
||||
|
@ -171,7 +157,6 @@ python3-%{name} contains Python 3 bindings for %{name}.
|
|||
Summary: FUSE support for %{name}
|
||||
License: LGPLv2+ and BSD
|
||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||
Recommends: fuse3
|
||||
|
||||
|
||||
%description -n nbdfuse
|
||||
|
@ -194,7 +179,8 @@ for %{name}.
|
|||
|
||||
%prep
|
||||
%if 0%{verify_tarball_signature}
|
||||
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
|
||||
tmphome="$(mktemp -d)"
|
||||
gpgv2 --homedir "$tmphome" --keyring %{SOURCE2} %{SOURCE1} %{SOURCE0}
|
||||
%endif
|
||||
%autosetup -p1
|
||||
%if 0%{patches_touch_autotools}
|
||||
|
@ -226,36 +212,28 @@ rm $RPM_BUILD_ROOT%{_mandir}/man3/libnbd-golang.3*
|
|||
|
||||
|
||||
%check
|
||||
function skip_test ()
|
||||
{
|
||||
for f in "$@"; do
|
||||
rm -f "$f"
|
||||
echo 'exit 77' > "$f"
|
||||
chmod +x "$f"
|
||||
done
|
||||
}
|
||||
|
||||
# interop/structured-read.sh fails with the old qemu-nbd in Fedora 29,
|
||||
# so disable it there.
|
||||
%if 0%{?fedora} <= 29
|
||||
skip_test interop/structured-read.sh
|
||||
%endif
|
||||
|
||||
# interop/interop-qemu-storage-daemon.sh fails in RHEL 9 because of
|
||||
# this bug in qemu:
|
||||
# https://lists.nongnu.org/archive/html/qemu-devel/2021-03/threads.html#03544
|
||||
%if 0%{?rhel}
|
||||
skip_test interop/interop-qemu-storage-daemon.sh
|
||||
rm interop/structured-read.sh
|
||||
touch interop/structured-read.sh
|
||||
chmod +x interop/structured-read.sh
|
||||
%endif
|
||||
|
||||
# All fuse tests fail in Koji with:
|
||||
# fusermount: entry for fuse/test-*.d not found in /etc/mtab
|
||||
# for unknown reasons but probably related to the Koji environment.
|
||||
skip_test fuse/test-*.sh
|
||||
for f in fuse/test-*.sh; do
|
||||
rm $f
|
||||
touch $f
|
||||
chmod +x $f
|
||||
done
|
||||
|
||||
# IPv6 loopback connections fail in Koji.
|
||||
make -C tests connect-tcp6 ||:
|
||||
skip_test tests/connect-tcp6
|
||||
# info/info-map-base-allocation-json.sh fails because of a bug in
|
||||
# jq 1.5 in RHEL 8 (fixed in later versions).
|
||||
rm info/info-map-base-allocation-json.sh
|
||||
touch info/info-map-base-allocation-json.sh
|
||||
chmod +x info/info-map-base-allocation-json.sh
|
||||
|
||||
make %{?_smp_mflags} check || {
|
||||
for f in $(find -name test-suite.log); do
|
||||
|
@ -334,262 +312,44 @@ make %{?_smp_mflags} check || {
|
|||
|
||||
|
||||
%changelog
|
||||
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1.8.2-3
|
||||
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||
Related: rhbz#1991688
|
||||
* Mon Feb 7 2022 Richard W.M. Jones <rjones@redhat.com> - 1.6.0-5.el8
|
||||
- Fix CVE-2022-0485: Fail nbdcopy if NBD read or write fails
|
||||
resolves: rhbz#2045718
|
||||
|
||||
* Fri Jul 30 2021 Richard W.M. Jones <rjones@redhat.com> - 1.8.2-2
|
||||
- Fix nbdcopy progress bar.
|
||||
- Add nbdinfo --map --totals and --can/--is options.
|
||||
resolves: rhbz#1950630
|
||||
* Thu Sep 2 2021 Danilo C. L. de Paula <ddepaula@redhat.com> - 1.6.0-4.el8
|
||||
- Resolves: bz#2000225
|
||||
(Rebase virt:rhel module:stream based on AV-8.6)
|
||||
|
||||
* Sat Jul 03 2021 Richard W.M. Jones <rjones@redhat.com> - 1.8.2-1
|
||||
- New upstream stable version 1.8.2.
|
||||
* Mon Jul 13 2020 Danilo C. L. de Paula <ddepaula@redhat.com> - 1.2.2
|
||||
- Resolves: bz#1844296
|
||||
(Upgrade components in virt:rhel module:stream for RHEL-8.3 release)
|
||||
|
||||
* Wed Jun 23 2021 Richard W.M. Jones <rjones@redhat.com> - 1.8.1-2
|
||||
- Bump and rebuild
|
||||
resolves: rhbz#1975316
|
||||
* Wed Feb 5 2020 Richard W.M. Jones <rjones@redhat.com> - 1.2.2-1
|
||||
- New stable release 1.2.2.
|
||||
|
||||
* Fri Jun 11 2021 Richard W.M. Jones <rjones@redhat.com> - 1.8.1-1
|
||||
- New upstream stable version 1.8.1.
|
||||
|
||||
* Mon Jun 07 2021 Richard W.M. Jones <rjones@redhat.com> - 1.8.0-1
|
||||
- New upstream version 1.8.0.
|
||||
|
||||
* Fri Jun 04 2021 Python Maint <python-maint@redhat.com> - 1.7.12-2
|
||||
- Rebuilt for Python 3.10
|
||||
|
||||
* Sat May 29 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.12-1
|
||||
- New upstream version 1.7.12.
|
||||
|
||||
* Thu May 20 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.11-1
|
||||
- New upstream version 1.7.11.
|
||||
|
||||
* Fri May 14 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.10-1
|
||||
- New upstream version 1.7.10.
|
||||
|
||||
* Thu Apr 29 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.9-1
|
||||
- New upstream version 1.7.9.
|
||||
- Switch to fuse3.
|
||||
- Make nbdfuse package recommend fuse3 (to get fusermount3).
|
||||
|
||||
* Sat Apr 24 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.8-1
|
||||
- New upstream development version 1.7.8.
|
||||
|
||||
* Sat Apr 10 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.7-1
|
||||
- New upstream development version 1.7.7.
|
||||
- +BR iproute
|
||||
- Add skip_test helper function.
|
||||
- Skip connect-tcp6 test which fails under Koji.
|
||||
|
||||
* Thu Apr 08 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.6-1
|
||||
- New upstream development version 1.7.6.
|
||||
|
||||
* Sat Apr 03 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.5-1
|
||||
- New upstream development version 1.7.5.
|
||||
|
||||
* Mon Mar 15 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.4-1
|
||||
- New upstream development version 1.7.4.
|
||||
|
||||
* Mon Mar 15 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.3-3
|
||||
- Update documentation for CVE-2021-20286.
|
||||
- Workaround broken interop/interop-qemu-storage-daemon.sh test in RHEL 9.
|
||||
|
||||
* Thu Mar 4 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.3-2
|
||||
- Add fix for nbdkit test suite.
|
||||
|
||||
* Tue Mar 2 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.3-1
|
||||
- New upstream version 1.7.3.
|
||||
|
||||
* Mon Mar 1 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.2-3
|
||||
- OCaml 4.12.0 build
|
||||
|
||||
* Wed Feb 24 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.2-2
|
||||
- Disable nbd BR on RHEL.
|
||||
|
||||
* Mon Feb 22 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.2-1
|
||||
- New upstream version 1.7.2.
|
||||
|
||||
* Fri Jan 29 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.1-6
|
||||
- Disable BR qemu-img on i686.
|
||||
|
||||
* Thu Jan 28 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.1-3
|
||||
- Disable BR nbdkit on i686 because it breaks ELN/RHEL 9.
|
||||
|
||||
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.7.1-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
* Wed Jan 20 2021 Richard W.M. Jones <rjones@redhat.com> - 1.7.1-1
|
||||
- New upstream development version 1.7.1.
|
||||
|
||||
* Thu Jan 07 2021 Richard W.M. Jones <rjones@redhat.com> - 1.6.0-1
|
||||
- New upstream stable version 1.6.0.
|
||||
|
||||
* Tue Dec 08 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.9-1
|
||||
- New upstream development version 1.5.9.
|
||||
|
||||
* Thu Dec 03 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.8-1
|
||||
- New upstream development version 1.5.8.
|
||||
- Unify Fedora and RHEL spec files.
|
||||
|
||||
* Wed Nov 25 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.7-1
|
||||
- New upstream development version 1.5.7.
|
||||
- Add some more test suite buildrequires lines.
|
||||
- Fix bogus date in changelog.
|
||||
|
||||
* Thu Nov 12 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.6-1
|
||||
- New upstream development version 1.5.6.
|
||||
|
||||
* Mon Nov 02 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.5-1
|
||||
- New upstream development version 1.5.5.
|
||||
|
||||
* Mon Oct 05 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.4-1
|
||||
- New upstream development version 1.5.4.
|
||||
- More OCaml man pages.
|
||||
|
||||
* Sat Sep 26 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.3-1
|
||||
- New upstream development version 1.5.3.
|
||||
|
||||
* Thu Sep 10 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.2-1
|
||||
- New upstream development version 1.5.2.
|
||||
|
||||
* Tue Sep 08 2020 Richard W.M. Jones <rjones@redhat.com> - 1.5.1-1
|
||||
- New upstream development version 1.5.1.
|
||||
|
||||
* Tue Sep 01 2020 Richard W.M. Jones <rjones@redhat.com> - 1.4.0-2
|
||||
- OCaml 4.11.1 rebuild
|
||||
|
||||
* Tue Aug 25 2020 Richard W.M. Jones <rjones@redhat.com> - 1.4.0-1
|
||||
- New stable release 1.4.0.
|
||||
|
||||
* Fri Aug 21 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.12-3
|
||||
- Bump release and rebuild.
|
||||
|
||||
* Fri Aug 21 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.12-2
|
||||
- OCaml 4.11.0 rebuild
|
||||
|
||||
* Thu Aug 20 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.12-1
|
||||
- New upstream version 1.3.12.
|
||||
|
||||
* Thu Aug 6 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.11-1
|
||||
- New upstream version 1.3.11.
|
||||
|
||||
* Tue Aug 4 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.10-1
|
||||
- New upstream version 1.3.10.
|
||||
|
||||
* Wed Jul 29 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.9-3
|
||||
- Bump and rebuild.
|
||||
|
||||
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.3.9-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||
|
||||
* Tue Jul 21 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.9-1
|
||||
- New upstream version 1.3.9.
|
||||
- New tool: nbdinfo.
|
||||
|
||||
* Fri Jul 17 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.8-2
|
||||
- New upstream version 1.3.8.
|
||||
- New tool: nbdcopy
|
||||
- Add upstream patch to fix compilation with glibc from Rawhide.
|
||||
|
||||
* Tue May 26 2020 Miro Hrončok <mhroncok@redhat.com> - 1.3.7-3
|
||||
- Rebuilt for Python 3.9
|
||||
|
||||
* Mon May 04 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.7-2
|
||||
- OCaml 4.11.0+dev2-2020-04-22 rebuild
|
||||
|
||||
* Thu Apr 23 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.7-1
|
||||
- New upstream version 1.3.7.
|
||||
|
||||
* Tue Apr 21 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.6-5
|
||||
- OCaml 4.11.0 pre-release attempt 2
|
||||
|
||||
* Fri Apr 17 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.6-4
|
||||
- OCaml 4.11.0 pre-release
|
||||
- Add upstream patch to fix one of the tests that fails on slow machines.
|
||||
|
||||
* Thu Apr 02 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.6-2
|
||||
- Update all OCaml dependencies for RPM 4.16.
|
||||
|
||||
* Tue Mar 31 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.6-1
|
||||
- New upstream development version 1.3.6.
|
||||
- Golang bindings are contained in this release but not distributed.
|
||||
|
||||
* Wed Mar 11 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.5-2
|
||||
- Fix bogus runtime Requires of new bash-completion package.
|
||||
|
||||
* Tue Mar 10 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.5-1
|
||||
- New upstream development version 1.3.5.
|
||||
- Add new bash-completion subpackage.
|
||||
|
||||
* Sat Feb 29 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.4-1
|
||||
- New upstream development version 1.3.4.
|
||||
|
||||
* Wed Feb 26 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.3-2
|
||||
- OCaml 4.10.0 final.
|
||||
|
||||
* Wed Feb 05 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.3-1
|
||||
- New upstream development version 1.3.3.
|
||||
|
||||
* Thu Jan 30 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.2-1
|
||||
- New upstream development version 1.3.2.
|
||||
|
||||
* Wed Jan 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.3.1-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Sun Jan 19 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.1-4
|
||||
- Bump release and rebuild.
|
||||
|
||||
* Sun Jan 19 2020 Richard W.M. Jones <rjones@redhat.com> - 1.3.1-3
|
||||
- OCaml 4.10.0+beta1 rebuild.
|
||||
|
||||
* Thu Dec 12 2019 Richard W.M. Jones <rjones@redhat.com> - 1.3.1-2
|
||||
- Rebuild for OCaml 4.09.0.
|
||||
|
||||
* Tue Dec 03 2019 Richard W.M. Jones <rjones@redhat.com> - 1.3.1-1
|
||||
- New upstream development version 1.3.1.
|
||||
|
||||
* Wed Nov 27 2019 Richard W.M. Jones <rjones@redhat.com> - 1.2.0-2
|
||||
- Use gpgverify macro instead of explicit gpgv2 command.
|
||||
* Tue Dec 3 2019 Richard W.M. Jones <rjones@redhat.com> - 1.2.1-1
|
||||
- New stable release 1.2.1.
|
||||
|
||||
* Thu Nov 14 2019 Richard W.M. Jones <rjones@redhat.com> - 1.2.0-1
|
||||
- New stable release 1.2.0
|
||||
- New stable release 1.2.0.
|
||||
|
||||
* Sat Nov 09 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.9-1
|
||||
- New upstream version 1.1.9.
|
||||
- Add new nbdkit-release-notes-1.2(1) man page.
|
||||
|
||||
* Wed Nov 06 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.8-1
|
||||
- New upstream version 1.1.8.
|
||||
|
||||
* Thu Oct 24 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.7-1
|
||||
- New upstream version 1.1.7.
|
||||
|
||||
* Sat Oct 19 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.6-1
|
||||
- New upstream version 1.1.6.
|
||||
|
||||
* Sat Oct 12 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.5-1
|
||||
- New upstream version 1.1.5.
|
||||
- New tool and subpackage nbdfuse.
|
||||
|
||||
* Wed Oct 9 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.4-1
|
||||
- New upstream version 1.1.4.
|
||||
* Wed Oct 9 2019 Richard W.M. Jones <rjones@redhat.com> - 1.0.3-1
|
||||
- New upstream version 1.0.3.
|
||||
- Contains fix for remote code execution vulnerability.
|
||||
- Add new libnbd-security(3) man page.
|
||||
|
||||
* Tue Oct 1 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.3-1
|
||||
- New upstream version 1.1.3.
|
||||
|
||||
* Tue Sep 17 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.2-1
|
||||
- New upstream version 1.1.2.
|
||||
* Tue Sep 17 2019 Richard W.M. Jones <rjones@redhat.com> - 1.0.2-1
|
||||
- New upstream version 1.0.2.
|
||||
- Remove patches which are upstream.
|
||||
- Contains fix for NBD Protocol Downgrade Attack (CVE-2019-14842).
|
||||
- Fix previous commit message.
|
||||
|
||||
* Thu Sep 12 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.1-2
|
||||
* Thu Sep 12 2019 Richard W.M. Jones <rjones@redhat.com> - 1.0.1-2
|
||||
- Add upstream patch to fix nbdsh (for nbdkit tests).
|
||||
- Fix interop tests on slow machines.
|
||||
|
||||
* Sun Sep 08 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1.1-1
|
||||
- New development version 1.1.1.
|
||||
* Sun Sep 08 2019 Richard W.M. Jones <rjones@redhat.com> - 1.0.1-1
|
||||
- New stable version 1.0.1.
|
||||
|
||||
* Wed Aug 28 2019 Richard W.M. Jones <rjones@redhat.com> - 1.0.0-1
|
||||
- New upstream version 1.0.0.
|
||||
|
|
Loading…
Reference in New Issue