Skip to content

Commit

Permalink
block: Use BDRV_O_NO_BACKING where appropriate
Browse files Browse the repository at this point in the history
If you open an image temporarily just because you want to check its size
or get it flushed, there's no real reason to open the whole backing file
chain.

This is a backport of c9fbb99 to
qemu 1.7.1.

The backport was done to fix a bug where QEMU 1.7.1 would crash or freeze
when the user take around 80 consecutives snapshots in a row.

git bisect would lead to commit: ba2ab2f
and it was clear that BDRV_NO_BACKING was missing.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Benoit Canet <benoit@irqsave.net>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
  • Loading branch information
kevmw authored and mdroth committed Jun 25, 2014
1 parent 792a403 commit b1a86eb
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 4 deletions.
4 changes: 2 additions & 2 deletions block.c
Expand Up @@ -1067,9 +1067,9 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
/* if snapshot, we create a temporary backing file and open it
instead of opening 'filename' directly */

/* if there is a backing file, use it */
bs1 = bdrv_new("");
ret = bdrv_open(bs1, filename, NULL, 0, drv, &local_err);
ret = bdrv_open(bs1, filename, NULL, BDRV_O_NO_BACKING, drv,
&local_err);
if (ret < 0) {
bdrv_unref(bs1);
goto fail;
Expand Down
3 changes: 2 additions & 1 deletion block/qcow2.c
Expand Up @@ -1605,7 +1605,8 @@ static int qcow2_create2(const char *filename, int64_t total_size,

/* Reopen the image without BDRV_O_NO_FLUSH to flush it before returning */
ret = bdrv_open(bs, filename, NULL,
BDRV_O_RDWR | BDRV_O_CACHE_WB, drv, &local_err);
BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_BACKING,
drv, &local_err);
if (error_is_set(&local_err)) {
error_propagate(errp, local_err);
goto out;
Expand Down
2 changes: 1 addition & 1 deletion block/vmdk.c
Expand Up @@ -1689,7 +1689,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options,
}
if (backing_file) {
BlockDriverState *bs = bdrv_new("");
ret = bdrv_open(bs, backing_file, NULL, 0, NULL, errp);
ret = bdrv_open(bs, backing_file, NULL, BDRV_O_NO_BACKING, NULL, errp);
if (ret != 0) {
bdrv_unref(bs);
return ret;
Expand Down

0 comments on commit b1a86eb

Please sign in to comment.