On Tue, May 27, 2014 at 09:57:19AM -0600, Eric Blake wrote: > On 05/27/2014 08:28 AM, Jeff Cody wrote: > > Now that node-names can reference an individual BlockDriverState without > > needing to navigate downwards from the 'device' level, in order to find > > the top-most image (active layer) we need a pointer to the overlay of a > > BDS. > > > > This will allow QMP commands to reference an image solely by its > > node-name, without also needing to pass in the corresponding 'device' > > string. > > > > Signed-off-by: Jeff Cody <jc...@redhat.com> > > --- > > block.c | 5 +++++ > > include/block/block_int.h | 1 + > > 2 files changed, 6 insertions(+) > > > > Deceptively simple - good thing we already refactored all chain > manipulations to go through bdrv_set_backing_hd(). >
Alas, it was too deceptive... it breaks in the bdrv_append() case. An example: Existing chain: [0 'base'] <--- [1 'sn1'] <--- [2 'sn2'] Perform a snapshot: [0 'base'] <--- [1 'sn1'] <--- [3 'sn2'] <---- [2 'sn3'] ^^^^^^^^^ (new BDS) [1] will have an overlay pointing to [2] still, skipping the newly injected BDS. When we perform bdrv_append(), we also need to update the overlay of the active layer's backing_hd BDS. Fortunately, this is just one additional line (although I am also adding a helper, since we just got rid of open coding bs->backing_hd, we should probably avoid doing the same thing with bs->overlay)