From: Fam Zheng <famz@redhat.com>
To: Reda Sallahi <fullmanet@gmail.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org,
Kevin Wolf <kwolf@redhat.com>, Max Reitz <mreitz@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] qemu-img: add conv=notrunc option to dd
Date: Thu, 11 Aug 2016 11:12:02 +0800 [thread overview]
Message-ID: <20160811031202.GB9358@al.usersys.redhat.com> (raw)
In-Reply-To: <20160811030730.23682-1-fullmanet@gmail.com>
On Thu, 08/11 05:07, Reda Sallahi wrote:
> This adds the conv=notrunc option to dd which tells dd to not truncate the
> output.
>
> For the time being we make it mandatory to specify conv=notrunc.
>
> Signed-off-by: Reda Sallahi <fullmanet@gmail.com>
> ---
> qemu-img-cmds.hx | 4 ++--
> qemu-img.c | 31 ++++++++++++++++++++++++++++---
> qemu-img.texi | 15 +++++++++------
> tests/qemu-iotests/158 | 2 +-
> tests/qemu-iotests/159 | 3 ++-
> tests/qemu-iotests/160 | 7 ++++---
> 6 files changed, 46 insertions(+), 16 deletions(-)
>
> diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
> index f054599..18685ac 100644
> --- a/qemu-img-cmds.hx
> +++ b/qemu-img-cmds.hx
> @@ -46,9 +46,9 @@ STEXI
> ETEXI
>
> DEF("dd", img_dd,
> - "dd [--image-opts] [-f fmt] [-O output_fmt] [bs=block_size] [count=blocks] [skip=blocks] if=input of=output")
> + "dd [--image-opts] [-f fmt] [-O output_fmt] [bs=block_size] [count=blocks] [skip=blocks] [conv=notrunc] if=input of=output")
> STEXI
> -@item dd [--image-opts] [-f @var{fmt}] [-O @var{output_fmt}] [bs=@var{block_size}] [count=@var{blocks}] [skip=@var{blocks}] if=@var{input} of=@var{output}
> +@item dd [--image-opts] [-f @var{fmt}] [-O @var{output_fmt}] [bs=@var{block_size}] [count=@var{blocks}] [skip=@var{blocks}] [conv=notrunc] if=@var{input} of=@var{output}
> ETEXI
>
> DEF("info", img_info,
> diff --git a/qemu-img.c b/qemu-img.c
> index 3adec86..16b56b8 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -174,7 +174,8 @@ static void QEMU_NORETURN help(void)
> " 'count=N' copy only N input blocks\n"
> " 'if=FILE' read from FILE\n"
> " 'of=FILE' write to FILE\n"
> - " 'skip=N' skip N bs-sized blocks at the start of input\n";
> + " 'skip=N' skip N bs-sized blocks at the start of input\n"
> + " 'conv=notrunc' do not truncate the output file\n";
>
> printf("%s\nSupported formats:", help_msg);
> bdrv_iterate_format(format_print, NULL);
> @@ -3807,10 +3808,12 @@ out:
> #define C_IF 04
> #define C_OF 010
> #define C_SKIP 020
> +#define C_CONV 040
>
> struct DdInfo {
> unsigned int flags;
> int64_t count;
> + unsigned int conv;
> };
>
> struct DdIo {
> @@ -3894,6 +3897,21 @@ static int img_dd_skip(const char *arg,
> return 0;
> }
>
> +#define C_NOTRUNC 01
> +
> +static int img_dd_conv(const char *arg,
> + struct DdIo *in, struct DdIo *out,
> + struct DdInfo *dd)
> +{
> + if (!strcmp(arg, "notrunc")) {
> + dd->conv |= C_NOTRUNC;
> + return 0;
> + } else {
> + error_report("invalid conversion: '%s'", arg);
> + return 1;
> + }
> +}
> +
> static int img_dd(int argc, char **argv)
> {
> int ret = 0;
> @@ -3909,10 +3927,11 @@ static int img_dd(int argc, char **argv)
> const char *out_fmt = "raw";
> const char *fmt = NULL;
> int64_t size = 0;
> - int64_t block_count = 0, out_pos, in_pos;
> + int64_t out_pos, in_pos;
This change is not related to this patch. It should probably done by another
patch, or removed.
> struct DdInfo dd = {
> .flags = 0,
> .count = 0,
> + .conv = 0
> };
> struct DdIo in = {
> .bsz = 512, /* Block size is by default 512 bytes */
> @@ -3933,6 +3952,7 @@ static int img_dd(int argc, char **argv)
> { "if", img_dd_if, C_IF },
> { "of", img_dd_of, C_OF },
> { "skip", img_dd_skip, C_SKIP },
> + { "conv", img_dd_conv, C_CONV },
> { NULL, NULL, 0 }
> };
> const struct option long_options[] = {
> @@ -3997,6 +4017,11 @@ static int img_dd(int argc, char **argv)
> g_free(arg);
> arg = NULL;
> }
> + if (!(dd.conv & C_NOTRUNC)) {
> + error_report("conv=notrunc not specified");
A comment and/or a more detailed error message explaining the situation why we
do this now would be necessary, so that in the future we'll remember to do the
right thing once it's decided.
> + ret = -1;
> + goto out;
> + }
>
> if (!(dd.flags & C_IF && dd.flags & C_OF)) {
> error_report("Must specify both input and output files");
> @@ -4091,7 +4116,7 @@ static int img_dd(int argc, char **argv)
>
> in.buf = g_new(uint8_t, in.bsz);
>
> - for (out_pos = 0; in_pos < size; block_count++) {
> + for (out_pos = 0; in_pos < size; ) {
> int in_ret, out_ret;
>
> if (in_pos + in.bsz > size) {
> diff --git a/qemu-img.texi b/qemu-img.texi
> index 174aae3..891af14 100644
> --- a/qemu-img.texi
> +++ b/qemu-img.texi
> @@ -144,15 +144,18 @@ Parameters to dd subcommand:
> @table @option
>
> @item bs=@var{block_size}
> -defines the block size
> +Defines the block size.
> @item count=@var{blocks}
> -sets the number of input blocks to copy
> +Sets the number of input blocks to copy.
> @item if=@var{input}
> -sets the input file
> +Sets the input file.
> @item of=@var{output}
> -sets the output file
> +Sets the output file. dd truncates the output file to zero if 'conv=notrunc'
> +is not specified.
> @item skip=@var{blocks}
> -sets the number of input blocks to skip
> +Sets the number of input blocks to skip.
> +@item conv=notrunc
> +Makes dd not truncate output file to zero.
Capitalizing other sentences should go as a sepearte patch.
> @end table
>
> Command description:
> @@ -326,7 +329,7 @@ skipped. This is useful for formats such as @code{rbd} if the target
> volume has already been created with site specific options that cannot
> be supplied through qemu-img.
>
> -@item dd [-f @var{fmt}] [-O @var{output_fmt}] [bs=@var{block_size}] [count=@var{blocks}] [skip=@var{blocks}] if=@var{input} of=@var{output}
> +@item dd [-f @var{fmt}] [-O @var{output_fmt}] [bs=@var{block_size}] [count=@var{blocks}] [skip=@var{blocks}] [conv=notrunc] if=@var{input} of=@var{output}
>
> Dd copies from @var{input} file to @var{output} file converting it from
> @var{fmt} format to @var{output_fmt} format.
> diff --git a/tests/qemu-iotests/158 b/tests/qemu-iotests/158
> index 5b335db..63e2a10 100755
> --- a/tests/qemu-iotests/158
> +++ b/tests/qemu-iotests/158
> @@ -53,7 +53,7 @@ $QEMU_IO -c "write -P 0xa 0 $size" "$TEST_IMG" | _filter_qemu_io
> echo
> echo "== Converting the image with dd =="
>
> -$QEMU_IMG dd if="$TEST_IMG" of="$TEST_IMG.out" -O "$IMGFMT"
> +$QEMU_IMG dd if="$TEST_IMG" of="$TEST_IMG.out" conv=notrunc -O "$IMGFMT"
> TEST_IMG="$TEST_IMG.out" _check_test_img
>
> echo
> diff --git a/tests/qemu-iotests/159 b/tests/qemu-iotests/159
> index 825f05f..d68a19f 100755
> --- a/tests/qemu-iotests/159
> +++ b/tests/qemu-iotests/159
> @@ -55,7 +55,8 @@ for bs in $TEST_SIZES; do
> echo
> echo "== Converting the image with dd with a block size of $bs =="
>
> - $QEMU_IMG dd if="$TEST_IMG" of="$TEST_IMG.out" bs=$bs -O "$IMGFMT"
> + $QEMU_IMG dd if="$TEST_IMG" of="$TEST_IMG.out" bs=$bs conv=notrunc \
> + -O "$IMGFMT"
> TEST_IMG="$TEST_IMG.out" _check_test_img
>
> echo
> diff --git a/tests/qemu-iotests/160 b/tests/qemu-iotests/160
> index 5c910e5..53b3c30 100755
> --- a/tests/qemu-iotests/160
> +++ b/tests/qemu-iotests/160
> @@ -55,10 +55,11 @@ for skip in $TEST_SKIP_BLOCKS; do
> echo
> echo "== Converting the image with dd with skip=$skip =="
>
> - $QEMU_IMG dd if="$TEST_IMG" of="$TEST_IMG.out" skip="$skip" -O "$IMGFMT" \
> - 2> /dev/null
> + $QEMU_IMG dd if="$TEST_IMG" of="$TEST_IMG.out" skip="$skip" conv=notrunc \
> + -O "$IMGFMT" 2> /dev/null
> TEST_IMG="$TEST_IMG.out" _check_test_img
> - dd if="$TEST_IMG" of="$TEST_IMG.out.dd" skip="$skip" status=none
> + dd if="$TEST_IMG" of="$TEST_IMG.out.dd" skip="$skip" conv=notrunc \
> + status=none
>
> echo
> echo "== Compare the images with qemu-img compare =="
> --
> 2.9.2
>
Apart from above, the conv=notrunc code looks good to me. Thanks!
Fam
prev parent reply other threads:[~2016-08-11 3:19 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-11 3:07 [Qemu-devel] [PATCH] qemu-img: add conv=notrunc option to dd Reda Sallahi
2016-08-11 3:12 ` Fam Zheng [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160811031202.GB9358@al.usersys.redhat.com \
--to=famz@redhat.com \
--cc=fullmanet@gmail.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.