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
Follow-up question: Did you look at using bdrv_ref() for the BDS <- BlockJob relationship too? blockdev.c block job code still uses the DriveInfo refcount after your series. The BDS reference would be sufficient since the DriveInfo fields are not used by block jobs. Stefan