On 8/23/19 9:40 AM, Eric Blake wrote: > Allow plugins to affect the handling of the new NBD_CMD_FLAG_FAST_ZERO > flag, then update affected plugins. In particular, in-memory plugins > are always fast; the full plugin is better served by omitting .zero > and relying on .pwrite fallback; nbd takes advantage of libnbd > extensions proposed in parallel to pass through support; and > v2 language bindings expose the choice to their scripts. > > +++ b/server/plugins.c > @@ -404,11 +404,25 @@ plugin_can_zero (struct backend *b, struct connection *conn) > static int > plugin_can_fast_zero (struct backend *b, struct connection *conn) > { > + struct backend_plugin *p = container_of (b, struct backend_plugin, backend); > + int r; > + > assert (connection_get_handle (conn, 0)); > > debug ("can_fast_zero"); > > - return 0; /* Upcoming patch will actually add support. */ > + if (p->plugin.can_fast_zero) > + return p->plugin.can_fast_zero (connection_get_handle (conn, 0)); > + /* Advertise support for fast zeroes if no .zero or .can_zero is > + * false: in those cases, we fail fast instead of using .pwrite. > + * This also works when v1 plugin has only ._zero_old. > + */ > + if (p->plugin.zero == NULL) > + return 1; > + r = plugin_can_zero (b, conn); > + if (r == -1) > + return -1; > + return !r; > } > Needs this squashed in for libnbd to pass rather than skip its new 'can-fast-zero-flag' test: diff --git i/server/plugins.c w/server/plugins.c index 84329cf4..695a77ab 100644 --- i/server/plugins.c +++ w/server/plugins.c @@ -208,6 +208,7 @@ plugin_dump_fields (struct backend *b) HAS (can_cache); HAS (cache); HAS (thread_model); + HAS (can_fast_zero); #undef HAS /* Custom fields. */ -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org