On Thu, Jun 18, 2015 at 04:49:12PM +0800, Wen Congyang wrote: > +void bdrv_connect(BlockDriverState *bs, Error **errp) > +{ > + BlockDriver *drv = bs->drv; > + > + if (drv && drv->bdrv_connect) { > + drv->bdrv_connect(bs, errp); > + } else if (bs->file) { > + bdrv_connect(bs->file, errp); > + } else { > + error_setg(errp, "this feature or command is not currently supported"); > + } > +} > + > +void bdrv_disconnect(BlockDriverState *bs) > +{ > + BlockDriver *drv = bs->drv; > + > + if (drv && drv->bdrv_disconnect) { > + drv->bdrv_disconnect(bs); > + } else if (bs->file) { > + bdrv_disconnect(bs->file); > + } > +} Please add doc comments describing the semantics of these commands. Why are these operations needed when there is already a bs->drv == NULL case which means the BDS is not ready for read/write?