Am 06.03.2013 19:06, schrieb Paolo Bonzini: > Il 06/03/2013 18:50, Peter Lieven ha scritto: >>>> Commit 9a665b2b made bdrv_truncate() call bdrv_drain_all(), but this breaks >>>> QCOW images, as well other future image formats (such as VHDX) that may >>>> call >>>> bdrv_truncate(bs->file) from within a read/write operation. For example, >>>> QCOW >>>> will cause an assert, due to tracked_requests not being empty (since the >>>> read/write that called bdrv_truncate() is still in progress). > > I'm not sure such bdrv_truncate calls are necessary. QCOW2 doesn't have > them (almost; there is one in qcow2_write_compressed, I'm not even sure > that one is necessary though), and I think QCOW's breaks using it with a > block device as a backing file.
I think we have to check the sense of bs->growable nevertheless. It is set to 1 for all drivers which can't be right?! int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) { BlockDriverState *bs; BlockDriver *drv; int ret; drv = bdrv_find_protocol(filename); if (!drv) { return -ENOENT; } bs = bdrv_new(""); ret = bdrv_open_common(bs, NULL, filename, flags, drv); if (ret < 0) { bdrv_delete(bs); return ret; } bs->growable = 1; *pbs = bs; return 0; } I think each driver should set it accordingly on its own. Peter > > Paolo >