On Fri, Dec 13, 2013 at 03:35:15PM +0800, Fam Zheng wrote: > @@ -1476,6 +1486,9 @@ void bdrv_close(BlockDriverState *bs) > > if (bs->drv) { > if (bs->backing_hd) { > + assert(error_is_set(&bs->backing_blocker)); > + bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker); > + error_free(bs->backing_blocker); > bdrv_unref(bs->backing_hd); > bs->backing_hd = NULL; > }
This if statement duplicates bdrv_set_backing_hd() code. I suggest: if (bs->backing_hd) { bdrv_set_backing_hd(bs, NULL); } bdrv_set_backing_hd() needs to be modified to call error_free(bs->backing_blocker) when backing_hd is NULL.