All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Ivan Ren <renyime@gmail.com>, qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, kwolf@redhat.com
Subject: Re: [Qemu-devel] [PATCH] qemu-img: return allocated size for block device with qcow2 format
Date: Wed, 2 May 2018 16:37:20 +0200	[thread overview]
Message-ID: <44cdffb1-e5f5-d324-8880-1ee2e07c3954@redhat.com> (raw)
In-Reply-To: <1525268093-531-1-git-send-email-ivanren@tencent.com>

[-- Attachment #1: Type: text/plain, Size: 3077 bytes --]

Hi,

[replying to this version because the previous mail doesn't seem to have
made it to the mailing lists for whatever reason]

On 2018-05-02 15:34, Ivan Ren wrote:
> qemu-img info with a block device which has a qcow2 format always
> return 0 for disk size, and this can not reflect the qcow2 size
> and the used space of the block device. This patch return the
> allocated size of qcow2 as the disk size.

I'm not quite sure whether you really need this information for block
devices (I tend to agree with Eric that wr_highest_cluster is the more
important information there), but I can imagine it just being nice to have.

So the basic idea makes sense to me, but I think the implementation can
be simplified and the reporting in qemu-img should be done differently.

> 
> Signed-off-by: Ivan Ren <ivanren@tencent.com>
> ---
>  block/qcow2-bitmap.c |  69 +++++++++++++++++
>  block/qcow2.c        | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  block/qcow2.h        |  42 ++++++++++
>  3 files changed, 323 insertions(+)

The whole implementation reminds me a lot of qcow2's check function,
which basically just recalculates the refcounts.  So I'm wondering
whether you could just count how many clusters with non-0 refcount there
are and thus simplify the implementation dramatically.

[...]

> +static int64_t qcow2_get_allocated_file_size(BlockDriverState *bs)
> +{
> +    struct stat st;
> +    if (stat(bs->filename, &st) < 0 || !S_ISBLK(st.st_mode)) {
> +        goto get_file_size;
> +    }

This definitely doesn't work because nobody guarantees that bs->filename
is something that stat() can work with.  I'm aware that you need to do
the S_ISBLK() check somewhere, but the qcow2 driver is not the right place.

I don't really have a good way around this, though.  These things come
to mind:

(1) We could let file-posix report an error for S_ISBLK because the
information is known to be usually useless -- but I think that is not
quite the right thing to do because maybe some block devices do report
useful information there, I don't know.

(2) Or we introduce a new field in qemu-img info (and thus in ImageInfo,
too, I suppose?).  qemu-img info (or rather bdrv_query_image_info())
could detect whether the format layer supports
bdrv_get_allocated_file_size, and if so, it emits that information
separately from the allocated size of bs->file->bs.  But that would
break vmdk...

(3) As a hack, qcow2_get_allocated_file_size() could first always call
bdrv_get_allocated_file_size(bs->file->bs), and if that returns 0 (which
is absolutely impossible for qcow2 files because they have an image
header that takes up some space), we fall back to
qcow2_get_block_allocated_size().  While I consider it a hack, I can't
come up with a scenario where it wouldn't work.

Max

> +
> +    return qcow2_get_block_allocated_size(bs);
> +
> +get_file_size:
> +    if (bs->file) {
> +        return bdrv_get_allocated_file_size(bs->file->bs);
> +    }
> +    return -ENOTSUP;
> +}
> +


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  parent reply	other threads:[~2018-05-02 14:37 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-02 13:34 [Qemu-devel] [PATCH] qemu-img: return allocated size for block device with qcow2 format Ivan Ren
2018-05-02 14:02 ` Eric Blake
2018-05-03 13:06   ` 叶残风
2018-05-04 14:35     ` Max Reitz
2018-05-04 15:57       ` Ivan Ren
2018-05-02 14:37 ` Max Reitz [this message]
2018-05-02 15:01   ` Eric Blake
2018-05-02 15:13     ` Max Reitz
2018-05-02 15:19       ` Eric Blake
2018-05-02 15:33         ` Max Reitz
2018-05-03 13:08   ` 叶残风
2018-05-04 14:27     ` Max Reitz

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=44cdffb1-e5f5-d324-8880-1ee2e07c3954@redhat.com \
    --to=mreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=renyime@gmail.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.