• V
    block: avoid recursive block_status call if possible · 69f47505
    Vladimir Sementsov-Ogievskiy 提交于
    drv_co_block_status digs bs->file for additional, more accurate search
    for hole inside region, reported as DATA by bs since 5daa74a6.
    
    This accuracy is not free: assume we have qcow2 disk. Actually, qcow2
    knows, where are holes and where is data. But every block_status
    request calls lseek additionally. Assume a big disk, full of
    data, in any iterative copying block job (or img convert) we'll call
    lseek(HOLE) on every iteration, and each of these lseeks will have to
    iterate through all metadata up to the end of file. It's obviously
    ineffective behavior. And for many scenarios we don't need this lseek
    at all.
    
    However, lseek is needed when we have metadata-preallocated image.
    
    So, let's detect metadata-preallocation case and don't dig qcow2's
    protocol file in other cases.
    
    The idea is to compare allocation size in POV of filesystem with
    allocations size in POV of Qcow2 (by refcounts). If allocation in fs is
    significantly lower, consider it as metadata-preallocation case.
    
    102 iotest changed, as our detector can't detect shrinked file as
    metadata-preallocation, which don't seem to be wrong, as with metadata
    preallocation we always have valid file length.
    
    Two other iotests have a slight change in their QMP output sequence:
    Active 'block-commit' returns earlier because the job coroutine yields
    earlier on a blocking operation. This operation is loading the refcount
    blocks in qcow2_detect_metadata_preallocation().
    Suggested-by: NDenis V. Lunev <den@openvz.org>
    Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    69f47505
qcow2-refcount.c 120.6 KB