diff options
author | Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> | 2010-04-13 10:29:34 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2010-04-23 16:21:57 +0200 |
commit | f163d0736ce0ccf50128254409a6cfc0258fa943 (patch) | |
tree | 3fa014e316171345167e1845bd2c861b8742959f | |
parent | 8a22f02a88b5c37bdbd48fc18ff6e572a8ffdfe2 (diff) |
qemu-img: Eliminate bdrv_new_open() code duplication
Several commands have code to create a BlockDriverState and open a file.
The bdrv_new_open() function can be used to perform these steps. This
patch converts the qemu-img commands to actually use bdrv_new_open().
Replaced the bdrv_new_open() 'readonly' argument with bdrv_open()-style
flags to support generic flags like BDRV_O_NO_BACKING.
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | qemu-img.c | 83 |
1 files changed, 10 insertions, 73 deletions
diff --git a/qemu-img.c b/qemu-img.c index 18e43a007..b30effa4f 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -190,12 +190,11 @@ static int read_password(char *buf, int buf_size) static BlockDriverState *bdrv_new_open(const char *filename, const char *fmt, - int readonly) + int flags) { BlockDriverState *bs; BlockDriver *drv; char password[256]; - int flags = BRDV_O_FLAGS; bs = bdrv_new(""); if (!bs) @@ -207,9 +206,6 @@ static BlockDriverState *bdrv_new_open(const char *filename, } else { drv = NULL; } - if (!readonly) { - flags |= BDRV_O_RDWR; - } if (bdrv_open(bs, filename, flags, drv) < 0) { error("Could not open '%s'", filename); } @@ -349,7 +345,7 @@ static int img_create(int argc, char **argv) } } - bs = bdrv_new_open(backing_file->value.s, fmt, 1); + bs = bdrv_new_open(backing_file->value.s, fmt, BRDV_O_FLAGS); bdrv_get_geometry(bs, &size); size *= 512; bdrv_delete(bs); @@ -384,7 +380,6 @@ static int img_check(int argc, char **argv) { int c, ret; const char *filename, *fmt; - BlockDriver *drv; BlockDriverState *bs; fmt = NULL; @@ -405,19 +400,7 @@ static int img_check(int argc, char **argv) help(); filename = argv[optind++]; - bs = bdrv_new(""); - if (!bs) - error("Not enough memory"); - if (fmt) { - drv = bdrv_find_format(fmt); - if (!drv) - error("Unknown file format '%s'", fmt); - } else { - drv = NULL; - } - if (bdrv_open(bs, filename, BRDV_O_FLAGS, drv) < 0) { - error("Could not open '%s'", filename); - } + bs = bdrv_new_open(filename, fmt, BRDV_O_FLAGS); ret = bdrv_check(bs); switch(ret) { case 0: @@ -443,7 +426,6 @@ static int img_commit(int argc, char **argv) { int c, ret; const char *filename, *fmt; - BlockDriver *drv; BlockDriverState *bs; fmt = NULL; @@ -464,19 +446,7 @@ static int img_commit(int argc, char **argv) help(); filename = argv[optind++]; - bs = bdrv_new(""); - if (!bs) - error("Not enough memory"); - if (fmt) { - drv = bdrv_find_format(fmt); - if (!drv) - error("Unknown file format '%s'", fmt); - } else { - drv = NULL; - } - if (bdrv_open(bs, filename, BRDV_O_FLAGS | BDRV_O_RDWR, drv) < 0) { - error("Could not open '%s'", filename); - } + bs = bdrv_new_open(filename, fmt, BRDV_O_FLAGS | BDRV_O_RDWR); ret = bdrv_commit(bs); switch(ret) { case 0: @@ -633,7 +603,7 @@ static int img_convert(int argc, char **argv) total_sectors = 0; for (bs_i = 0; bs_i < bs_n; bs_i++) { - bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, 1); + bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt, BRDV_O_FLAGS); if (!bs[bs_i]) error("Could not open '%s'", argv[optind + bs_i]); bdrv_get_geometry(bs[bs_i], &bs_sectors); @@ -691,7 +661,7 @@ static int img_convert(int argc, char **argv) } } - out_bs = bdrv_new_open(out_filename, out_fmt, 0); + out_bs = bdrv_new_open(out_filename, out_fmt, BRDV_O_FLAGS | BDRV_O_RDWR); bs_i = 0; bs_offset = 0; @@ -889,7 +859,6 @@ static int img_info(int argc, char **argv) { int c; const char *filename, *fmt; - BlockDriver *drv; BlockDriverState *bs; char fmt_name[128], size_buf[128], dsize_buf[128]; uint64_t total_sectors; @@ -916,19 +885,7 @@ static int img_info(int argc, char **argv) help(); filename = argv[optind++]; - bs = bdrv_new(""); - if (!bs) - error("Not enough memory"); - if (fmt) { - drv = bdrv_find_format(fmt); - if (!drv) - error("Unknown file format '%s'", fmt); - } else { - drv = NULL; - } - if (bdrv_open(bs, filename, BRDV_O_FLAGS | BDRV_O_NO_BACKING, drv) < 0) { - error("Could not open '%s'", filename); - } + bs = bdrv_new_open(filename, fmt, BRDV_O_FLAGS | BDRV_O_NO_BACKING); bdrv_get_format(bs, fmt_name, sizeof(fmt_name)); bdrv_get_geometry(bs, &total_sectors); get_human_readable_size(size_buf, sizeof(size_buf), total_sectors * 512); @@ -1028,13 +985,7 @@ static int img_snapshot(int argc, char **argv) filename = argv[optind++]; /* Open the image */ - bs = bdrv_new(""); - if (!bs) - error("Not enough memory"); - - if (bdrv_open(bs, filename, bdrv_oflags, NULL) < 0) { - error("Could not open '%s'", filename); - } + bs = bdrv_new_open(filename, NULL, bdrv_oflags); /* Perform the requested action */ switch(action) { @@ -1080,7 +1031,7 @@ static int img_snapshot(int argc, char **argv) static int img_rebase(int argc, char **argv) { BlockDriverState *bs, *bs_old_backing, *bs_new_backing; - BlockDriver *drv, *old_backing_drv, *new_backing_drv; + BlockDriver *old_backing_drv, *new_backing_drv; char *filename; const char *fmt, *out_basefmt, *out_baseimg; int c, flags, ret; @@ -1124,22 +1075,8 @@ static int img_rebase(int argc, char **argv) * Ignore the old backing file for unsafe rebase in case we want to correct * the reference to a renamed or moved backing file. */ - bs = bdrv_new(""); - if (!bs) - error("Not enough memory"); - - drv = NULL; - if (fmt) { - drv = bdrv_find_format(fmt); - if (drv == NULL) { - error("Invalid format name: '%s'", fmt); - } - } - flags = BRDV_O_FLAGS | BDRV_O_RDWR | (unsafe ? BDRV_O_NO_BACKING : 0); - if (bdrv_open(bs, filename, flags, drv) < 0) { - error("Could not open '%s'", filename); - } + bs = bdrv_new_open(filename, fmt, flags); /* Find the right drivers for the backing files */ old_backing_drv = NULL; |