All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Chunyan Liu <cyliu@suse.com>
Cc: qemu-devel@nongnu.org, stefanha@redhat.com, mreitz@redhat.com
Subject: Re: [Qemu-devel] [RESEND PATCH V3] qemu-img info: show nocow info
Date: Fri, 21 Nov 2014 17:25:05 +0100	[thread overview]
Message-ID: <20141121162505.GF3956@noname.redhat.com> (raw)
In-Reply-To: <1406688906-6072-1-git-send-email-cyliu@suse.com>

Am 30.07.2014 um 04:55 hat Chunyan Liu geschrieben:
> Add nocow info in 'qemu-img info' output to show whether the file
> currently has NOCOW flag set or not.
> 
> Signed-off-by: Chunyan Liu <cyliu@suse.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
> Resend for QEMU 2.2. Change json version comment. Add Reviewed-by.
> 
>  block/qapi.c         | 25 +++++++++++++++++++++++++
>  qapi/block-core.json |  5 ++++-
>  2 files changed, 29 insertions(+), 1 deletion(-)

Unfortunately, I have never been CCed on this patch and I saw the code
it added only now. I think it doesn't work correctly and has the wrong
design, so I would prefer to revert it for 2.2 rather than making a bad
API stable.

> diff --git a/block/qapi.c b/block/qapi.c
> index f44f6b4..aa53f19 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c
> @@ -28,6 +28,13 @@
>  #include "qapi-visit.h"
>  #include "qapi/qmp-output-visitor.h"
>  #include "qapi/qmp/types.h"
> +#ifdef __linux__
> +#include <linux/fs.h>
> +#include <sys/ioctl.h>
> +#ifndef FS_NOCOW_FL
> +#define FS_NOCOW_FL                     0x00800000 /* Do not cow file */
> +#endif
> +#endif
>  
>  BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs)
>  {
> @@ -173,6 +180,20 @@ void bdrv_query_image_info(BlockDriverState *bs,
>      Error *err = NULL;
>      ImageInfo *info = g_new0(ImageInfo, 1);
>  
> +#ifdef __linux__
> +    int fd, attr;
> +
> +    /* get NOCOW info */
> +    fd = qemu_open(bs->filename, O_RDONLY | O_NONBLOCK);
> +    if (fd >= 0) {
> +        if (ioctl(fd, FS_IOC_GETFLAGS, &attr) == 0 && (attr & FS_NOCOW_FL)) {
> +            info->has_nocow = true;
> +            info->nocow = true;
> +        }
> +        qemu_close(fd);
> +    }
> +#endif

Code like this has no business in the general block layer. This belongs
in raw-posix, which already has an open fd, and nowhere else. There you
wouldn't have to rely on bs->filename, which may be empty or contain
something different from a local filename, e.g. a URL. The approach of
this patch also doesn't work if the file has been renamed or deleted
since qemu opened it (e.g. because of -snapshot).

In short: This code may happen to work in some special cases, but
generally speaking, it is wrong.

>      bdrv_get_geometry(bs, &total_sectors);
>  
>      info->filename        = g_strdup(bs->filename);
> @@ -625,4 +646,8 @@ void bdrv_image_info_dump(fprintf_function func_fprintf, void *f,
>          func_fprintf(f, "Format specific information:\n");
>          bdrv_image_info_specific_dump(func_fprintf, f, info->format_specific);
>      }
> +
> +    if (info->has_nocow && info->nocow) {
> +        func_fprintf(f, "NOCOW flag: set\n");
> +    }
>  }
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index e378653..72b4015 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -115,6 +115,8 @@
>  # @format-specific: #optional structure supplying additional format-specific
>  # information (since 1.7)
>  #
> +# @nocow: #optional info of whether NOCOW flag is set or not. (since 2.2)
> +#
>  # Since: 1.3
>  #
>  ##
> @@ -126,7 +128,8 @@
>             '*backing-filename': 'str', '*full-backing-filename': 'str',
>             '*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'],
>             '*backing-image': 'ImageInfo',
> -           '*format-specific': 'ImageInfoSpecific' } }
> +           '*format-specific': 'ImageInfoSpecific',
> +           '*nocow': 'bool' } }

As this field makes only sense for raw-posix, it should be moved to
ImageInfoSpecific. ("format-specific" is also an unfortunate misnomer,
it should be "driver-specific", but it's too late to fix that.)

Kevin

  parent reply	other threads:[~2014-11-21 16:25 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-30  2:55 [Qemu-devel] [RESEND PATCH V3] qemu-img info: show nocow info Chunyan Liu
2014-07-30 15:00 ` Stefan Hajnoczi
2014-11-21 16:25 ` Kevin Wolf [this message]
2014-11-21 16:29   ` Eric Blake
2014-11-24  3:11   ` Chun Yan Liu
2014-11-24  9:34     ` Kevin Wolf
  -- strict thread matches above, loose matches on Subject: below --
2014-07-29  7:18 Chunyan Liu
2014-07-29 12:45 ` Eric Blake
2014-07-30  2:57   ` Chun Yan Liu

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=20141121162505.GF3956@noname.redhat.com \
    --to=kwolf@redhat.com \
    --cc=cyliu@suse.com \
    --cc=mreitz@redhat.com \
    --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.