Sometimes, it's nice to see what a difference it makes in timing or in destination file size when sparse handling is enabled or disabled. Add a new filter that makes it trivial to disable write zero support.
Signed-off-by: Eric Blake <[email protected]> --- TODO | 2 +- configure.ac | 3 +- docs/nbdkit-filter.pod | 9 ++++ docs/nbdkit.pod | 1 + filters/Makefile.am | 1 + filters/nozero/Makefile.am | 62 ++++++++++++++++++++++++ filters/nozero/nbdkit-nozero-filter.pod | 84 +++++++++++++++++++++++++++++++++ filters/nozero/nozero.c | 68 ++++++++++++++++++++++++++ 8 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 filters/nozero/Makefile.am create mode 100644 filters/nozero/nbdkit-nozero-filter.pod create mode 100644 filters/nozero/nozero.c diff --git a/TODO b/TODO index f6ab20c..eb11fc0 100644 --- a/TODO +++ b/TODO @@ -65,7 +65,7 @@ Suggestions for filters ----------------------- * injecting artificial errors or otherwise masking plugin features - (such as hiding zero support) for testing clients + for testing clients (see 'nozero' filter for example) * logging all client commands diff --git a/configure.ac b/configure.ac index 6025ce0..dc7fc76 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ # nbdkit -# Copyright (C) 2013-2017 Red Hat Inc. +# Copyright (C) 2013-2018 Red Hat Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -516,6 +516,7 @@ AC_CONFIG_FILES([Makefile filters/cache/Makefile filters/cow/Makefile filters/delay/Makefile + filters/nozero/Makefile filters/offset/Makefile filters/partition/Makefile src/Makefile diff --git a/docs/nbdkit-filter.pod b/docs/nbdkit-filter.pod index dbd4385..d0d9042 100644 --- a/docs/nbdkit-filter.pod +++ b/docs/nbdkit-filter.pod @@ -487,6 +487,15 @@ You can also run pkg-config/pkgconf directly, for example: L<nbdkit(1)>, L<nbdkit-plugin(1)>. +Filters: + +L<nbdkit-cache-filter(1)>, +L<nbdkit-cow-filter(1)>, +L<nbdkit-delay-filter(1)>, +L<nbdkit-nozero-filter(1)>, +L<nbdkit-offset-filter(1)>, +L<nbdkit-partition-filter(1)>. + =head1 AUTHORS Richard W.M. Jones diff --git a/docs/nbdkit.pod b/docs/nbdkit.pod index 1167245..d66bf7c 100644 --- a/docs/nbdkit.pod +++ b/docs/nbdkit.pod @@ -920,6 +920,7 @@ Filters: L<nbdkit-cache-filter(1)>, L<nbdkit-cow-filter(1)>, L<nbdkit-delay-filter(1)>, +L<nbdkit-nozero-filter(1)>, L<nbdkit-offset-filter(1)>, L<nbdkit-partition-filter(1)>. diff --git a/filters/Makefile.am b/filters/Makefile.am index 9996d77..0a3ec0e 100644 --- a/filters/Makefile.am +++ b/filters/Makefile.am @@ -34,5 +34,6 @@ SUBDIRS = \ cache \ cow \ delay \ + nozero \ offset \ partition diff --git a/filters/nozero/Makefile.am b/filters/nozero/Makefile.am new file mode 100644 index 0000000..1c66ed8 --- /dev/null +++ b/filters/nozero/Makefile.am @@ -0,0 +1,62 @@ +# nbdkit +# Copyright (C) 2018 Red Hat Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of Red Hat nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +EXTRA_DIST = nbdkit-nozero-filter.pod + +CLEANFILES = *~ + +filterdir = $(libdir)/nbdkit/filters + +filter_LTLIBRARIES = nbdkit-nozero-filter.la + +nbdkit_nozero_filter_la_SOURCES = \ + nozero.c \ + $(top_srcdir)/include/nbdkit-filter.h + +nbdkit_nozero_filter_la_CPPFLAGS = \ + -I$(top_srcdir)/include +nbdkit_nozero_filter_la_CFLAGS = \ + $(WARNINGS_CFLAGS) +nbdkit_nozero_filter_la_LDFLAGS = \ + -module -avoid-version -shared + +if HAVE_POD2MAN + +man_MANS = nbdkit-nozero-filter.1 +CLEANFILES += $(man_MANS) + +nbdkit-nozero-filter.1: nbdkit-nozero-filter.pod + $(POD2MAN) $(POD2MAN_ARGS) --section=1 --name=`basename $@ .1` $< [email protected] && \ + if grep 'POD ERROR' [email protected]; then rm [email protected]; exit 1; fi && \ + mv [email protected] $@ + +endif diff --git a/filters/nozero/nbdkit-nozero-filter.pod b/filters/nozero/nbdkit-nozero-filter.pod new file mode 100644 index 0000000..dd89767 --- /dev/null +++ b/filters/nozero/nbdkit-nozero-filter.pod @@ -0,0 +1,84 @@ +=encoding utf8 + +=head1 NAME + +nbdkit-nozero-filter - nbdkit nozero filter + +=head1 SYNOPSIS + + nbdkit --filter=nozero plugin [plugin-args...] + +=head1 DESCRIPTION + +C<nbdkit-nozero-filter> is a filter that intentionally disables +efficient handling of sparse file holes (ranges of all-zero bytes) +across the NBD protocol. It is mainly useful for evaluating timing +differences between naive vs. sparse-aware connections, and for +testing client or server fallbacks. + +=head1 PARAMETERS + +There are no parameters specific to nbdkit-nozero-filter. Any +parameters are passed through to and processed by the underlying +plugin in the normal way. + +=head1 EXAMPLES + +Serve the file F<disk.img>, but force the client to write zeroes +explicitly rather than with C<NBD_CMD_WRITE_ZEROES>: + + nbdkit --filter=nozero file file=disk.img + +=head1 SEE ALSO + +L<nbdkit(1)>, +L<nbdkit-file-plugin(1)>, +L<nbdkit-filter(3)>. + +=head1 AUTHORS + +Eric Blake + +=head1 COPYRIGHT + +Copyright (C) 2018 Red Hat Inc. + +=head1 LICENSE + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +=over 4 + +=item * + +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +=item * + +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +=item * + +Neither the name of Red Hat nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +=back + +THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/filters/nozero/nozero.c b/filters/nozero/nozero.c new file mode 100644 index 0000000..676164e --- /dev/null +++ b/filters/nozero/nozero.c @@ -0,0 +1,68 @@ +/* nbdkit + * Copyright (C) 2018 Red Hat Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of Red Hat nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> + +#include <nbdkit-filter.h> + +#define THREAD_MODEL NBDKIT_THREAD_MODEL_PARALLEL + +/* Disable WRITE_ZEROES. */ +static int +nozero_can_zero (struct nbdkit_next_ops *next_ops, void *nxdata, void *handle) +{ + return 0; +} + +/* Should never be reached (nbdkit should have already flagged a bad client). */ +static int +nozero_zero (struct nbdkit_next_ops *next_ops, void *nxdata, + void *handle, uint32_t count, uint64_t offs, int may_trim) +{ + abort (); +} + +static struct nbdkit_filter filter = { + .name = "nozero", + .longname = "nbdkit nozero filter", + .version = PACKAGE_VERSION, + .can_zero = nozero_can_zero, + .zero = nozero_zero, +}; + +NBDKIT_REGISTER_FILTER(filter) -- 2.14.3 _______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
