Commit 1585969c6e0e94ac9e67c126578a05aab1fa0218

Authored by aliguori
1 parent e97fc193

Introduce qemu-img check subcommand (Kevin Wolf)

From: Kevin Wolf <kwolf@redhat.com>

Now that block drivers can provide check functions, expose them through
qemu-img.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7215 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 62 additions and 0 deletions
qemu-img.c
... ... @@ -58,6 +58,7 @@ static void help(void)
58 58 "QEMU disk image utility\n"
59 59 "\n"
60 60 "Command syntax:\n"
  61 + " check [-f fmt] filename\n"
61 62 " create [-e] [-6] [-F fmt] [-b base_image] [-f fmt] filename [size]\n"
62 63 " commit [-f fmt] filename\n"
63 64 " convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] [-B output_base_image] filename [filename2 [...]] output_filename\n"
... ... @@ -315,6 +316,65 @@ static int img_create(int argc, char **argv)
315 316 return 0;
316 317 }
317 318  
  319 +static int img_check(int argc, char **argv)
  320 +{
  321 + int c, ret;
  322 + const char *filename, *fmt;
  323 + BlockDriver *drv;
  324 + BlockDriverState *bs;
  325 +
  326 + fmt = NULL;
  327 + for(;;) {
  328 + c = getopt(argc, argv, "f:h");
  329 + if (c == -1)
  330 + break;
  331 + switch(c) {
  332 + case 'h':
  333 + help();
  334 + break;
  335 + case 'f':
  336 + fmt = optarg;
  337 + break;
  338 + }
  339 + }
  340 + if (optind >= argc)
  341 + help();
  342 + filename = argv[optind++];
  343 +
  344 + bs = bdrv_new("");
  345 + if (!bs)
  346 + error("Not enough memory");
  347 + if (fmt) {
  348 + drv = bdrv_find_format(fmt);
  349 + if (!drv)
  350 + error("Unknown file format '%s'", fmt);
  351 + } else {
  352 + drv = NULL;
  353 + }
  354 + if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) {
  355 + error("Could not open '%s'", filename);
  356 + }
  357 + ret = bdrv_check(bs);
  358 + switch(ret) {
  359 + case 0:
  360 + printf("No errors were found on the image.\n");
  361 + break;
  362 + case -ENOTSUP:
  363 + error("This image format does not support checks");
  364 + break;
  365 + default:
  366 + if (ret < 0) {
  367 + error("An error occurred during the check");
  368 + } else {
  369 + printf("%d errors were found on the image.\n", ret);
  370 + }
  371 + break;
  372 + }
  373 +
  374 + bdrv_delete(bs);
  375 + return 0;
  376 +}
  377 +
318 378 static int img_commit(int argc, char **argv)
319 379 {
320 380 int c, ret;
... ... @@ -888,6 +948,8 @@ int main(int argc, char **argv)
888 948 argc--; argv++;
889 949 if (!strcmp(cmd, "create")) {
890 950 img_create(argc, argv);
  951 + } else if (!strcmp(cmd, "check")) {
  952 + img_check(argc, argv);
891 953 } else if (!strcmp(cmd, "commit")) {
892 954 img_commit(argc, argv);
893 955 } else if (!strcmp(cmd, "convert")) {
... ...