[Libguestfs] [PATCH nbdkit] cache, cow: Export block size constraints

Laszlo Ersek lersek at redhat.com
Mon Feb 21 09:22:04 UTC 2022


On 02/20/22 21:49, Richard W.M. Jones wrote:
> Because these filters perform a read-modify-write cycle for requests
> which are smaller than the block size of the filter, we can adjust or
> set the preferred block size to the block size of the filter or the
> preferred block size of the underlying plugin, whichever is larger.
> 
> We're careful not to set a preferred block size which is larger than
> the maximum block size.
> 
> After this change:
> 
> $ ./nbdkit --filter=cow floppy /usr/share/doc/nbdkit-devel \
>                                cow-block-size=128k \
>                                --run 'nbdinfo $uri'
> protocol: newstyle-fixed without TLS
> export="":
> 	export-size: 1458176 (1424K)
> 	content: DOS/MBR boot sector; partition 1 : ID=0xc, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 2048, 800 sectors
> 	uri: nbd://localhost:10809/
> 	contexts:
> 		base:allocation
> 	is_rotational: false
> 	is_read_only: false
> 	can_cache: true
> 	can_df: true
> 	can_fast_zero: false
> 	can_flush: true
> 	can_fua: true
> 	can_multi_conn: true
> 	can_trim: true
> 	can_zero: false
> 	block_size_minimum: 1
> 	block_size_preferred: 131072      <--- note
> 	block_size_maximum: 4294967295
> ---
>  filters/cache/cache.c | 21 +++++++++++++++++++++
>  filters/cow/cow.c     | 21 +++++++++++++++++++++
>  2 files changed, 42 insertions(+)
> 
> diff --git a/filters/cache/cache.c b/filters/cache/cache.c
> index c912c5fb..f0ee42f1 100644
> --- a/filters/cache/cache.c
> +++ b/filters/cache/cache.c
> @@ -260,6 +260,26 @@ cache_get_size (nbdkit_next *next,
>    return size;
>  }
>  
> +/* Block size constraints. */
> +static int
> +cache_block_size (nbdkit_next *next, void *handle,
> +                  uint32_t *minimum, uint32_t *preferred, uint32_t *maximum)
> +{
> +  if (next->block_size (next, minimum, preferred, maximum) == -1)
> +    return -1;
> +
> +  if (*minimum == 0) {         /* No constraints set by the plugin. */
> +    *minimum = 1;
> +    *preferred = blksize;
> +    *maximum = 0xffffffff;
> +  }
> +  else if (*maximum >= blksize) {

Do we need braces here?

> +    *preferred = MAX (*preferred, blksize);
> +  }
> +
> +  return 0;
> +}
> +
>  /* Force an early call to cache_get_size because we have to set the
>   * backing file size and bitmap size before any other read or write
>   * calls.
> @@ -716,6 +736,7 @@ static struct nbdkit_filter filter = {
>    .get_ready         = cache_get_ready,
>    .prepare           = cache_prepare,
>    .get_size          = cache_get_size,
> +  .block_size        = cache_block_size,
>    .can_cache         = cache_can_cache,
>    .can_fast_zero     = cache_can_fast_zero,
>    .can_flush         = cache_can_flush,
> diff --git a/filters/cow/cow.c b/filters/cow/cow.c
> index e111c60f..cdc5b44f 100644
> --- a/filters/cow/cow.c
> +++ b/filters/cow/cow.c
> @@ -182,6 +182,26 @@ cow_get_size (nbdkit_next *next,
>    return size;
>  }
>  
> +/* Block size constraints. */
> +static int
> +cow_block_size (nbdkit_next *next, void *handle,
> +                uint32_t *minimum, uint32_t *preferred, uint32_t *maximum)
> +{
> +  if (next->block_size (next, minimum, preferred, maximum) == -1)
> +    return -1;
> +
> +  if (*minimum == 0) {         /* No constraints set by the plugin. */
> +    *minimum = 1;
> +    *preferred = blksize;
> +    *maximum = 0xffffffff;
> +  }
> +  else if (*maximum >= blksize) {

Same here.

Makes sense to me otherwise.

Acked-by: Laszlo Ersek <lersek at redhat.com>

Thanks
Laszlo

> +    *preferred = MAX (*preferred, blksize);
> +  }
> +
> +  return 0;
> +}
> +
>  /* Force an early call to cow_get_size because we have to set the
>   * backing file size and bitmap size before any other read or write
>   * calls.
> @@ -762,6 +782,7 @@ static struct nbdkit_filter filter = {
>    .get_ready         = cow_get_ready,
>    .prepare           = cow_prepare,
>    .get_size          = cow_get_size,
> +  .block_size        = cow_block_size,
>    .can_write         = cow_can_write,
>    .can_flush         = cow_can_flush,
>    .can_trim          = cow_can_trim,
> 




More information about the Libguestfs mailing list