[prev in list] [next in list] [prev in thread] [next in thread] 

List:       libguestfs
Subject:    Re: [Libguestfs] [nbdkit PATCH 2/3] filter: Add .can_zero/.can_fua overrides
From:       "Richard W.M. Jones" <rjones () redhat ! com>
Date:       2018-01-24 14:26:20
Message-ID: 20180124142620.GN19514 () redhat ! com
[Download RAW message or body]

On Tue, Jan 23, 2018 at 10:10:14PM -0600, Eric Blake wrote:
> @@ -348,6 +362,8 @@ static struct nbdkit_next_ops next_ops = {
> .flush = next_flush,
> .trim = next_trim,
> .zero = next_zero,
> +  .can_zero = next_can_zero,
> +  .can_fua = next_can_fua,

Not that it makes a functional difference but for ease of reading the
code maybe we should initialize these in the same order as they appear
in the struct definition?

> @@ -582,6 +628,8 @@ static struct backend filter_functions = {
> .flush = filter_flush,
> .trim = filter_trim,
> .zero = filter_zero,
> +  .can_zero = filter_can_zero,
> +  .can_fua = filter_can_fua,

Since the backend struct is internal, we can put the can_* functions
next to the others.  (Also same comments about the change to
src/internal.h)
> 
> /* Register and load a filter. */
> @@ -626,15 +674,23 @@ filter_register (struct backend *next, size_t index, const \
> char *filename, exit (EXIT_FAILURE);
> }
> 
> -  /* Since the filter might be much older than the current version of
> -   * nbdkit, only copy up to the self-declared _struct_size of the
> -   * filter and zero out the rest.  If the filter is much newer then
> -   * we'll only call the "old" fields.
> +  /* Providing a stable filter ABI is much harder than a stable plugin
> +   * ABI.  Any newer filter compiled against a larger struct
> +   * nbdkit_next_ops could potentially dereference fields we did not
> +   * provide; and any older filter compiled against a smaller struct
> +   * nbdkit_filter may miss intercepting functions that are vital to
> +   * avoid corrupting the client-visible data.  So for now, we insist
> +   * on an exact match in _struct_size, and promise that
> +   * nbdkit_next_ops won't change size without also changing
> +   * _struct_size.
> */
> size = sizeof f->filter;      /* our struct */
> -  memset (&f->filter, 0, size);
> -  if (size > filter->_struct_size)
> -    size = filter->_struct_size;
> +  if (filter->_struct_size != size) {
> +    fprintf (stderr,
> +             "%s: %s: filter compiled against incompatible nbdkit version\n",
> +             program_name, f->filename);
> +    exit (EXIT_FAILURE);
> +  }
> memcpy (&f->filter, filter, size);

Can we put this into a separate commit?

> diff --git a/src/internal.h b/src/internal.h
> index 3cbfde5..2f03279 100644
> --- a/src/internal.h
> +++ b/src/internal.h
> @@ -191,6 +191,8 @@ struct backend {
> int (*flush) (struct backend *, struct connection *conn, uint32_t flags);
> int (*trim) (struct backend *, struct connection *conn, uint32_t count, uint64_t \
> offset, uint32_t flags); int (*zero) (struct backend *, struct connection *conn, \
> uint32_t count, uint64_t offset, uint32_t flags); +  int (*can_zero) (struct \
> backend *, struct connection *conn); +  int (*can_fua) (struct backend *, struct \
> connection *conn);

See above.

> 
> /* plugins.c */
> diff --git a/src/plugins.c b/src/plugins.c
> index dba3e24..3468b6d 100644
> --- a/src/plugins.c
> +++ b/src/plugins.c
> @@ -358,6 +358,26 @@ plugin_can_trim (struct backend *b, struct connection *conn)
> return p->plugin.trim != NULL;
> }
> 
> +static int
> +plugin_can_zero (struct backend *b, struct connection *conn)
> +{
> +  debug ("can_zero");
> +
> +  // We always allow .zero to fall back to .write, so plugins don't
> +  // need to override this
> +  return plugin_can_write (b, conn);
> +}
> +
> +static int
> +plugin_can_fua (struct backend *b, struct connection *conn)
> +{
> +  debug ("can_fua");
> +
> +  // TODO - wire FUA flag support into plugins. Until then, this copies
> +  // can_flush, since that's how we emulate FUA
> +  return plugin_can_flush (b, conn);
> +}
> +
> static int
> plugin_pread (struct backend *b, struct connection *conn,
> void *buf, uint32_t count, uint64_t offset, uint32_t flags)
> @@ -535,6 +555,8 @@ static struct backend plugin_functions = {
> .flush = plugin_flush,
> .trim = plugin_trim,
> .zero = plugin_zero,
> +  .can_zero = plugin_can_zero,
> +  .can_fua = plugin_can_fua,

See above.

ACK with changes suggested.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://www.redhat.com/mailman/listinfo/libguestfs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic