qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/2] qemu-img check: Distinguish different kinds


From: MORITA Kazutaka
Subject: Re: [Qemu-devel] [PATCH 1/2] qemu-img check: Distinguish different kinds of errors
Date: Tue, 06 Jul 2010 19:51:24 +0900
User-agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.7 Emacs/22.3 (x86_64-pc-linux-gnu) MULE/5.0 (SAKAKI)

At Fri,  2 Jul 2010 19:14:59 +0200,
Kevin Wolf wrote:
> 
> People think that their images are corrupted when in fact there are just some
> leaked clusters. Differentiating several error cases should make the messages
> more comprehensible.
> 
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
>  block.c    |   10 ++++++--
>  block.h    |   10 ++++++++-
>  qemu-img.c |   62 +++++++++++++++++++++++++++++++++++++++++++++--------------
>  3 files changed, 63 insertions(+), 19 deletions(-)
> 
> diff --git a/block.c b/block.c
> index dd6dd76..b0ceef0 100644
> --- a/block.c
> +++ b/block.c
> @@ -710,15 +710,19 @@ DeviceState *bdrv_get_attached(BlockDriverState *bs)
>  /*
>   * Run consistency checks on an image
>   *
> - * Returns the number of errors or -errno when an internal error occurs
> + * Returns 0 if the check could be completed (it doesn't mean that the image 
> is
> + * free of errors) or -errno when an internal error occured. The results of 
> the
> + * check are stored in res.
>   */
> -int bdrv_check(BlockDriverState *bs)
> +int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
>  {
>      if (bs->drv->bdrv_check == NULL) {
>          return -ENOTSUP;
>      }
>  
> -    return bs->drv->bdrv_check(bs);
> +    memset(res, 0, sizeof(*res));
> +    res->corruptions = bs->drv->bdrv_check(bs);
> +    return res->corruptions < 0 ? res->corruptions : 0;
>  }
>  
>  /* commit COW file into the raw image */
> diff --git a/block.h b/block.h
> index 3d03b3e..c2a7e4c 100644
> --- a/block.h
> +++ b/block.h
> @@ -74,7 +74,6 @@ void bdrv_close(BlockDriverState *bs);
>  int bdrv_attach(BlockDriverState *bs, DeviceState *qdev);
>  void bdrv_detach(BlockDriverState *bs, DeviceState *qdev);
>  DeviceState *bdrv_get_attached(BlockDriverState *bs);
> -int bdrv_check(BlockDriverState *bs);
>  int bdrv_read(BlockDriverState *bs, int64_t sector_num,
>                uint8_t *buf, int nb_sectors);
>  int bdrv_write(BlockDriverState *bs, int64_t sector_num,
> @@ -97,6 +96,15 @@ int bdrv_change_backing_file(BlockDriverState *bs,
>      const char *backing_file, const char *backing_fmt);
>  void bdrv_register(BlockDriver *bdrv);
>  
> +
> +typedef struct BdrvCheckResult {
> +    int corruptions;
> +    int leaks;
> +    int check_errors;
> +} BdrvCheckResult;
> +
> +int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res);
> +
>  /* async block I/O */
>  typedef struct BlockDriverAIOCB BlockDriverAIOCB;
>  typedef void BlockDriverCompletionFunc(void *opaque, int ret);
> diff --git a/qemu-img.c b/qemu-img.c
> index 700af21..1782ac9 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -425,11 +425,20 @@ out:
>      return 0;
>  }
>  
> +/*
> + * Checks an image for consistency. Exit codes:
> + *
> + * 0 - Check completed, image is good
> + * 1 - Check not completed because of internal errors
> + * 2 - Check completed, image is corrupted
> + * 3 - Check completed, image has leaked clusters, but is good otherwise
> + */
>  static int img_check(int argc, char **argv)
>  {
>      int c, ret;
>      const char *filename, *fmt;
>      BlockDriverState *bs;
> +    BdrvCheckResult result;
>  
>      fmt = NULL;
>      for(;;) {
> @@ -453,28 +462,51 @@ static int img_check(int argc, char **argv)
>      if (!bs) {
>          return 1;
>      }
> -    ret = bdrv_check(bs);
> -    switch(ret) {
> -    case 0:
> -        printf("No errors were found on the image.\n");
> -        break;
> -    case -ENOTSUP:
> +    ret = bdrv_check(bs, &result);
> +
> +    if (ret == -ENOTSUP) {
>          error("This image format does not support checks");
> -        break;
> -    default:
> -        if (ret < 0) {
> -            error("An error occurred during the check");
> -        } else {
> -            printf("%d errors were found on the image.\n", ret);
> +        return 1;

Is it okay to call bdrv_delete(bs) before return?  It is necessary for
the sheepdog driver to pass qemu-iotests.

Kazutaka


--- a/qemu-img.c
+++ b/qemu-img.c
@@ -466,6 +466,7 @@ static int img_check(int argc, char **argv)
 
     if (ret == -ENOTSUP) {
         error("This image format does not support checks");
+        bdrv_delete(bs);
         return 1;
     }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]