On Wed, Jan 25, 2017 at 08:55:18PM -0600, Eric Blake wrote:
On 01/20/2017 02:16 PM, Eric Blake wrote:
Reject rather than silently ignoring unknown client request flags.
+ /* Validate flags */ + if (flags & ~NBD_CMD_FLAG_FUA) { + nbdkit_error ("invalid request: unknown flag (0x%x)", flags); + *error = EINVAL; + return 0; + }
Right now, our NBD_CMD_FLAG_FUA implementation causes a full flush action from the plugin, even if it is possible to write a client that knows how to preserve FUA semantics in a lighter-weight manner than a full fdatasync(). In other words, it obeys the semantics required by the NBD protocol, but not necessarily in the most optimum way.
Does NBD (protocol) now support a more fine-grained flush?
Unfortunately, the callback interfaces for a plugin do not have any way to pass flags from the client to the plugin (other than my new .zero callback, but right now it only supports a single may_trim argument used as a boolean, rather than an actual int flags argument). Do we want or need to enhance the set of callback interfaces to allow plugins that can act on flag values, rather than always implementing fua semantics ourselves by the heavy-weight .flush call?
Can we add a flush2 method which adds flags? Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html