Skip to content
Snippets Groups Projects
  • Vladimir Sementsov-Ogievskiy's avatar
    e75abeda
    block: use int64_t instead of uint64_t in driver write handlers · e75abeda
    Vladimir Sementsov-Ogievskiy authored
    
    We are generally moving to int64_t for both offset and bytes parameters
    on all io paths.
    
    Main motivation is realization of 64-bit write_zeroes operation for
    fast zeroing large disk chunks, up to the whole disk.
    
    We chose signed type, to be consistent with off_t (which is signed) and
    with possibility for signed return type (where negative value means
    error).
    
    So, convert driver write handlers parameters which are already 64bit to
    signed type.
    
    While being here, convert also flags parameter to be BdrvRequestFlags.
    
    Now let's consider all callers. Simple
    
      git grep '\->bdrv_\(aio\|co\)_pwritev\(_part\)\?'
    
    shows that's there three callers of driver function:
    
     bdrv_driver_pwritev() and bdrv_driver_pwritev_compressed() in
     block/io.c, both pass int64_t, checked by bdrv_check_qiov_request() to
     be non-negative.
    
     qcow2_save_vmstate() does bdrv_check_qiov_request().
    
    Still, the functions may be called directly, not only by drv->...
    Let's check:
    
    git grep '\.bdrv_\(aio\|co\)_pwritev\(_part\)\?\s*=' | \
    awk '{print $4}' | sed 's/,//' | sed 's/&//' | sort | uniq | \
    while read func; do git grep "$func(" | \
    grep -v "$func(BlockDriverState"; done
    
    shows several callers:
    
    qcow2:
      qcow2_co_truncate() write at most up to @offset, which is checked in
        generic qcow2_co_truncate() by bdrv_check_request().
      qcow2_co_pwritev_compressed_task() pass the request (or part of the
        request) that already went through normal write path, so it should
        be OK
    
    qcow:
      qcow_co_pwritev_compressed() pass int64_t, it's updated by this patch
    
    quorum:
      quorum_co_pwrite_zeroes() pass int64_t and int - OK
    
    throttle:
      throttle_co_pwritev_compressed() pass int64_t, it's updated by this
      patch
    
    vmdk:
      vmdk_co_pwritev_compressed() pass int64_t, it's updated by this
      patch
    
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Message-Id: <20210903102807.27127-5-vsementsov@virtuozzo.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    e75abeda
    History
    block: use int64_t instead of uint64_t in driver write handlers
    Vladimir Sementsov-Ogievskiy authored
    
    We are generally moving to int64_t for both offset and bytes parameters
    on all io paths.
    
    Main motivation is realization of 64-bit write_zeroes operation for
    fast zeroing large disk chunks, up to the whole disk.
    
    We chose signed type, to be consistent with off_t (which is signed) and
    with possibility for signed return type (where negative value means
    error).
    
    So, convert driver write handlers parameters which are already 64bit to
    signed type.
    
    While being here, convert also flags parameter to be BdrvRequestFlags.
    
    Now let's consider all callers. Simple
    
      git grep '\->bdrv_\(aio\|co\)_pwritev\(_part\)\?'
    
    shows that's there three callers of driver function:
    
     bdrv_driver_pwritev() and bdrv_driver_pwritev_compressed() in
     block/io.c, both pass int64_t, checked by bdrv_check_qiov_request() to
     be non-negative.
    
     qcow2_save_vmstate() does bdrv_check_qiov_request().
    
    Still, the functions may be called directly, not only by drv->...
    Let's check:
    
    git grep '\.bdrv_\(aio\|co\)_pwritev\(_part\)\?\s*=' | \
    awk '{print $4}' | sed 's/,//' | sed 's/&//' | sort | uniq | \
    while read func; do git grep "$func(" | \
    grep -v "$func(BlockDriverState"; done
    
    shows several callers:
    
    qcow2:
      qcow2_co_truncate() write at most up to @offset, which is checked in
        generic qcow2_co_truncate() by bdrv_check_request().
      qcow2_co_pwritev_compressed_task() pass the request (or part of the
        request) that already went through normal write path, so it should
        be OK
    
    qcow:
      qcow_co_pwritev_compressed() pass int64_t, it's updated by this patch
    
    quorum:
      quorum_co_pwrite_zeroes() pass int64_t and int - OK
    
    throttle:
      throttle_co_pwritev_compressed() pass int64_t, it's updated by this
      patch
    
    vmdk:
      vmdk_co_pwritev_compressed() pass int64_t, it's updated by this
      patch
    
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Message-Id: <20210903102807.27127-5-vsementsov@virtuozzo.com>
    Reviewed-by: default avatarEric Blake <eblake@redhat.com>
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>