On Fri, Apr 18, 2014 at 03:44:19PM +0200, BenoƮt Canet wrote: > From: Kevin Wolf <kw...@redhat.com> > > 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 c9fbb99d41b05acf0d7b93deb2fcdbf9047c238e 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: ba2ab2f2ca4150a7e314fbb19fa158bd8ddc36eb > and it was clear that BDRV_NO_BACKING was missing. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > Signed-off-by: Benoit Canet <ben...@irqsave.net> > --- > block.c | 4 ++-- > block/qcow2.c | 3 ++- > block/vmdk.c | 2 +- > 3 files changed, 5 insertions(+), 4 deletions(-)
CCed qemu-devel@nongnu.org and Mike Roth, who maintains the stable tree. This patch should go directly into stable through Mike. It's already in master so Kevin and I are not involved. > diff --git a/block.c b/block.c > index 382ea71..9f638ea 100644 > --- a/block.c > +++ b/block.c > @@ -1064,9 +1064,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; > diff --git a/block/qcow2.c b/block/qcow2.c > index 6e5d98d..344c63e 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -1588,7 +1588,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; > diff --git a/block/vmdk.c b/block/vmdk.c > index a7ebd0f..d35a9d7 100644 > --- a/block/vmdk.c > +++ b/block/vmdk.c > @@ -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; > -- > 1.7.10.4 >