[Libguestfs] [PATCH nbdkit] xz: Do not pass can_write through to the plugin.
Eric Blake
eblake at redhat.com
Wed Jan 30 15:25:49 UTC 2019
On 1/30/19 8:36 AM, Richard W.M. Jones wrote:
> Using ‘nbdkit --filter=xz file disk.xz’ and loop mounting eventually
> results in this error:
>
> nbdkit: file[1]: debug: xz: pwrite count=4096 offset=1048576 flags=0x0
> nbdkit: file[1]: debug: pwrite count=4096 offset=1048576 fua=0
> nbdkit: file[1]: error: pwrite: Bad file descriptor
> nbdkit: file[1]: debug: sending error reply: Bad file descriptor
>
> Since the filter did not intercept can_write, it was passed through to
> the layer below (the file plugin). The filter opens the file plugin
> passing readonly=1, but in the case where there are no filters, nbdkit
> core would never call can_write() (assuming that because we opened the
> server readonly, it would return false). However with the filter,
> can_write is called and returns the default (true). This caused
> writes to be generated which were also passed through to the plugin
> which generates "Bad file descriptor" because:
>
> EBADF fd is not a valid file descriptor or is not open for writing.
>
> This change also disables zero and trim because the server logic
> disables those when the top backend->can_write returns false.
ACK.
> ---
> filters/xz/xz.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/filters/xz/xz.c b/filters/xz/xz.c
> index 28a6a81..5ff791e 100644
> --- a/filters/xz/xz.c
> +++ b/filters/xz/xz.c
> @@ -173,6 +173,13 @@ xz_get_size (struct nbdkit_next_ops *next_ops, void *nxdata, void *handle)
> return xzfile_get_size (h->xz);
> }
>
> +static int
> +xz_can_write (struct nbdkit_next_ops *next_ops, void *nxdata,
> + void *handle)
Perhaps worth a comment in the code, similar to cow.c's comment about
the override returning a constant because the filter enforces a
particular behavior that might be different from the backend's default
behavior.
> +{
> + return 0;
> +}
> +
> /* Read data from the file. */
> static int
> xz_pread (struct nbdkit_next_ops *next_ops, void *nxdata,
> @@ -225,6 +232,7 @@ static struct nbdkit_filter filter = {
> .close = xz_close,
> .prepare = xz_prepare,
> .get_size = xz_get_size,
> + .can_write = xz_can_write,
> .pread = xz_pread,
> };
>
>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20190130/ccac281c/attachment.sig>
More information about the Libguestfs
mailing list