On Wed, Jul 31, 2013 at 06:13:53PM +0800, Fam Zheng wrote: > BlockDriverState lifecycle management is needed by future features such as > image fleecing and blockdev-add. This series adds reference count to > BlockDriverState. > > The first two patches clean up two odd BlockDriverState use cases, so all code > uses bdrv_new() to create BlockDriverState instance. > > Then implemented bdrv_ref() and bdrv_unref() to operate on refcnt: Initially, > refcnt is 1, which means bdrv_unref is effectively a bdrv_delete() here. So > patch 04 has a search and replace to convert bdrv_delete to bdrv_unref, before > bdrv_ref is used anywhere. 05~08 patches calls bdrv_ref for device attach, > block-migration and nbd. > > The rule is: Either bdrv_ref() or bdrv_new() must have a matching > bdrv_unref() call, and the last matching bdrv_unref deletes the bs. > > v3: > 03: Removed unnecessary bdrv_close() call. > > v2: > 05: Removed: "block: use BlockDriverState refcnt for device attach/detach" > 07: Fix xen_disk blk_disconnect() as it depended on device attach refcnt. > > Fam Zheng (7): > vvfat: use bdrv_new() to allocate BlockDriverState > iscsi: use bdrv_new() instead of stack structure > block: implement reference count for BlockDriverState > block: make bdrv_delete() static > migration: omit drive ref as we have bdrv_ref now > xen_disk: simplify blk_disconnect with refcnt > nbd: use BlockDriverState refcnt > > block-migration.c | 4 ++-- > block.c | 44 +++++++++++++++++++++++++++++++++----------- > block/backup.c | 2 +- > block/blkverify.c | 4 ++-- > block/cow.c | 2 +- > block/iscsi.c | 14 +++++++------- > block/mirror.c | 2 +- > block/qcow.c | 2 +- > block/qcow2.c | 2 +- > block/qed.c | 2 +- > block/sheepdog.c | 6 +++--- > block/snapshot.c | 2 +- > block/stream.c | 2 +- > block/vmdk.c | 10 +++++----- > block/vvfat.c | 6 +++--- > blockdev-nbd.c | 10 +--------- > blockdev.c | 14 +++++++------- > hw/block/xen_disk.c | 13 ++++++------- > include/block/block.h | 3 ++- > include/block/block_int.h | 1 + > nbd.c | 5 +++++ > qemu-img.c | 26 +++++++++++++------------- > qemu-io.c | 6 +++--- > 23 files changed, 101 insertions(+), 81 deletions(-)
One interesting thing is the interaction between the DriveInfo and BDS lifecycle. Both now have refcounts but drive_init()/drive_uninit() do bdrv_ref()/bdrv_unref() so you can be sure that the BDS will not go away if you hold a DriveInfo reference. Thanks, applied to my block-next tree: https://github.com/stefanha/qemu/commits/block-next Stefan