On Mon, May 02, 2022 at 10:25:44AM +0100, Nikolaus Rath wrote:
Hi,
Is there a way for a nbdkit plugin to *require* use of a nbdkit filter
(specifically the nbdkit-blocksize-filter) programmatically?
At present, no. What are you envisioning - enforcing that the plugin
doesn't want to deal with sub-sector offsets and lengths? Is there
any other filter that would be useful to require, or can we focus more
on the question about insisting on aligned requests? Also, is your
plugin mostly worried about enforcement of minimum block size (for
example, no requests smaller than 512-byte alignment, which the
blocksize filter gives with read-modify-write), or is it also worried
about other features that the blocksize filter can add (such as
splitting larger requests)?
The best you can do in the current code is provide the .block_size
callback to at least inform modern NBD clients about your preferences
(libnbd defaults to refusing to send requests over the wire that don't
obey the server's advertised constraints).
I did ask the question when we first added .block_size whether we
should also provide a way for plugins to request the internal nbdkit
server code to enforce limits (use of the nbdkit-blocksize-filter with
read-modify-write is one way to obey underlying limits; but another
way is to just up-front fail unaligned requests rather than passing
them into the plugin). We could either do this by enhancing the
existing .block_size() function to add in a special return value to
insist on strict enforcement (right now, we only document returning -1
on error and 0 when successfully populating limits; we could add a
documented return of 1), or by adding yet another callback (for
example, if .strict_block_size is absent or returns 0, .block_size
values are advisory to the client, but unaligned values reach the
plugin; if .strict_block_size returns 1, .block_size values are
enforced by nbdkit before reaching the plugin).
Thoughts about that approach?
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization:
qemu.org |
libvirt.org