On 8/18/20 9:58 AM, Richard W.M. Jones wrote:
 On Mon, Aug 17, 2020 at 11:35:39AM -0500, Eric Blake wrote:
> While iflag=count_bytes combined with bs > 1 allows for more efficient
> operation, it is a feature of GNU dd, and not present on other
> implementations such as BSD.  Sticking to just POSIX features makes
> things more portable.
 
 I'm not very convinced by this.  Maybe we should persuade
 the BSD folk to implement this useful feature instead? 
Wouldn't hurt to try.
 
 As one example:
 
> diff --git a/docs/nbdkit-loop.pod b/docs/nbdkit-loop.pod
> index 055b5750..b21c2212 100644
> --- a/docs/nbdkit-loop.pod
> +++ b/docs/nbdkit-loop.pod
> @@ -120,7 +120,7 @@ creates a disk which contains a bad sector:
>                echo EIO Bad block >&2
>                exit 1
>            else
> -             dd if=/dev/zero count=$3 iflag=count_bytes
> +             dd bs=1 if=/dev/zero count=$3
>            fi ;;
>        *) exit 2 ;;
>    esac
 
 this change could be a killer for performance since the suggested size
 of the disk is 64M. 
Another thing we could do: I've got a proposal out to let plugins 
advertise block size preferences.  Once that is in place, a shell script 
that uses dd could advertise minimum block size of 512, leave bs=512 
(the default), and compute count/skip/seek by $(($3 / 512)) when the 
script must be portable to BSD dd.  Performance will then not be 
penalized, at the expense that the user would have to use the 
--filter=blocksize to get sub-block read/writes.
But yeah, given the definite slowdown to the testsuite for 
heavy-hitters, I'm thinking the best we can do without a minimum block 
size advertisement is documentation of why we prefer GNU dd features, 
and the slower fallback possible on BSD.
-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  
qemu.org | 
libvirt.org