• M
    block: Make bdrv_next() keep strong references · 5e003f17
    Max Reitz 提交于
    On one hand, it is a good idea for bdrv_next() to return a strong
    reference because ideally nearly every pointer should be refcounted.
    This fixes intermittent failure of iotest 194.
    
    On the other, it is absolutely necessary for bdrv_next() itself to keep
    a strong reference to both the BB (in its first phase) and the BDS (at
    least in the second phase) because when called the next time, it will
    dereference those objects to get a link to the next one.  Therefore, it
    needs these objects to stay around until then.  Just storing the pointer
    to the next in the iterator is not really viable because that pointer
    might become invalid as well.
    
    Both arguments taken together means we should probably just invoke
    bdrv_ref() and blk_ref() in bdrv_next().  This means we have to assert
    that bdrv_next() is always called from the main loop, but that was
    probably necessary already before this patch and judging from the
    callers, it also looks to actually be the case.
    
    Keeping these strong references means however that callers need to give
    them up if they decide to abort the iteration early.  They can do so
    through the new bdrv_next_cleanup() function.
    Suggested-by: NKevin Wolf <kwolf@redhat.com>
    Signed-off-by: NMax Reitz <mreitz@redhat.com>
    Message-id: 20171110172545.32609-1-mreitz@redhat.com
    Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
    Signed-off-by: NMax Reitz <mreitz@redhat.com>
    5e003f17
block.c 151.1 KB