block-backend: Add flags to blk_truncate()

Now that node level interface bdrv_truncate() supports passing request
flags to the block driver, expose this on the BlockBackend level, too.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200424125448.63318-4-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2020-04-24 14:54:41 +02:00
parent 7b8e485742
commit 8c6242b6f3
15 changed files with 22 additions and 21 deletions

View File

@ -548,7 +548,8 @@ static int64_t create_file_fallback_truncate(BlockBackend *blk,
int64_t size; int64_t size;
int ret; int ret;
ret = blk_truncate(blk, minimum_size, false, PREALLOC_MODE_OFF, &local_err); ret = blk_truncate(blk, minimum_size, false, PREALLOC_MODE_OFF, 0,
&local_err);
if (ret < 0 && ret != -ENOTSUP) { if (ret < 0 && ret != -ENOTSUP) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return ret; return ret;

View File

@ -2137,14 +2137,14 @@ int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf,
} }
int blk_truncate(BlockBackend *blk, int64_t offset, bool exact, int blk_truncate(BlockBackend *blk, int64_t offset, bool exact,
PreallocMode prealloc, Error **errp) PreallocMode prealloc, BdrvRequestFlags flags, Error **errp)
{ {
if (!blk_is_available(blk)) { if (!blk_is_available(blk)) {
error_setg(errp, "No medium inserted"); error_setg(errp, "No medium inserted");
return -ENOMEDIUM; return -ENOMEDIUM;
} }
return bdrv_truncate(blk->root, offset, exact, prealloc, 0, errp); return bdrv_truncate(blk->root, offset, exact, prealloc, flags, errp);
} }
int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,

View File

@ -133,7 +133,7 @@ static int coroutine_fn commit_run(Job *job, Error **errp)
} }
if (base_len < len) { if (base_len < len) {
ret = blk_truncate(s->base, len, false, PREALLOC_MODE_OFF, NULL); ret = blk_truncate(s->base, len, false, PREALLOC_MODE_OFF, 0, NULL);
if (ret) { if (ret) {
goto out; goto out;
} }
@ -458,7 +458,7 @@ int bdrv_commit(BlockDriverState *bs)
* grow the backing file image if possible. If not possible, * grow the backing file image if possible. If not possible,
* we must return an error */ * we must return an error */
if (length > backing_length) { if (length > backing_length) {
ret = blk_truncate(backing, length, false, PREALLOC_MODE_OFF, ret = blk_truncate(backing, length, false, PREALLOC_MODE_OFF, 0,
&local_err); &local_err);
if (ret < 0) { if (ret < 0) {
error_report_err(local_err); error_report_err(local_err);

View File

@ -115,7 +115,7 @@ static ssize_t block_crypto_init_func(QCryptoBlock *block,
* which will be used by the crypto header * which will be used by the crypto header
*/ */
return blk_truncate(data->blk, data->size + headerlen, false, return blk_truncate(data->blk, data->size + headerlen, false,
data->prealloc, errp); data->prealloc, 0, errp);
} }

View File

@ -900,7 +900,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
if (s->bdev_length > base_length) { if (s->bdev_length > base_length) {
ret = blk_truncate(s->target, s->bdev_length, false, ret = blk_truncate(s->target, s->bdev_length, false,
PREALLOC_MODE_OFF, NULL); PREALLOC_MODE_OFF, 0, NULL);
if (ret < 0) { if (ret < 0) {
goto immediate_exit; goto immediate_exit;
} }

View File

@ -3511,7 +3511,7 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
/* Okay, now that we have a valid image, let's give it the right size */ /* Okay, now that we have a valid image, let's give it the right size */
ret = blk_truncate(blk, qcow2_opts->size, false, qcow2_opts->preallocation, ret = blk_truncate(blk, qcow2_opts->size, false, qcow2_opts->preallocation,
errp); 0, errp);
if (ret < 0) { if (ret < 0) {
error_prepend(errp, "Could not resize image: "); error_prepend(errp, "Could not resize image: ");
goto out; goto out;
@ -5374,7 +5374,7 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
* Amending image options should ensure that the image has * Amending image options should ensure that the image has
* exactly the given new values, so pass exact=true here. * exactly the given new values, so pass exact=true here.
*/ */
ret = blk_truncate(blk, new_size, true, PREALLOC_MODE_OFF, errp); ret = blk_truncate(blk, new_size, true, PREALLOC_MODE_OFF, 0, errp);
blk_unref(blk); blk_unref(blk);
if (ret < 0) { if (ret < 0) {
return ret; return ret;

View File

@ -677,7 +677,7 @@ static int coroutine_fn bdrv_qed_co_create(BlockdevCreateOptions *opts,
* The QED format associates file length with allocation status, * The QED format associates file length with allocation status,
* so a new file (which is empty) must have a length of 0. * so a new file (which is empty) must have a length of 0.
*/ */
ret = blk_truncate(blk, 0, true, PREALLOC_MODE_OFF, errp); ret = blk_truncate(blk, 0, true, PREALLOC_MODE_OFF, 0, errp);
if (ret < 0) { if (ret < 0) {
goto out; goto out;
} }

View File

@ -875,7 +875,7 @@ static int coroutine_fn vdi_co_do_create(BlockdevCreateOptions *create_options,
if (image_type == VDI_TYPE_STATIC) { if (image_type == VDI_TYPE_STATIC) {
ret = blk_truncate(blk, offset + blocks * block_size, false, ret = blk_truncate(blk, offset + blocks * block_size, false,
PREALLOC_MODE_OFF, errp); PREALLOC_MODE_OFF, 0, errp);
if (ret < 0) { if (ret < 0) {
error_prepend(errp, "Failed to statically allocate file"); error_prepend(errp, "Failed to statically allocate file");
goto exit; goto exit;

View File

@ -1703,13 +1703,13 @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
/* All zeroes, so we can just extend the file - the end of the BAT /* All zeroes, so we can just extend the file - the end of the BAT
* is the furthest thing we have written yet */ * is the furthest thing we have written yet */
ret = blk_truncate(blk, data_file_offset, false, PREALLOC_MODE_OFF, ret = blk_truncate(blk, data_file_offset, false, PREALLOC_MODE_OFF,
errp); 0, errp);
if (ret < 0) { if (ret < 0) {
goto exit; goto exit;
} }
} else if (type == VHDX_TYPE_FIXED) { } else if (type == VHDX_TYPE_FIXED) {
ret = blk_truncate(blk, data_file_offset + image_size, false, ret = blk_truncate(blk, data_file_offset + image_size, false,
PREALLOC_MODE_OFF, errp); PREALLOC_MODE_OFF, 0, errp);
if (ret < 0) { if (ret < 0) {
goto exit; goto exit;
} }

View File

@ -2118,7 +2118,7 @@ static int vmdk_init_extent(BlockBackend *blk,
int gd_buf_size; int gd_buf_size;
if (flat) { if (flat) {
ret = blk_truncate(blk, filesize, false, PREALLOC_MODE_OFF, errp); ret = blk_truncate(blk, filesize, false, PREALLOC_MODE_OFF, 0, errp);
goto exit; goto exit;
} }
magic = cpu_to_be32(VMDK4_MAGIC); magic = cpu_to_be32(VMDK4_MAGIC);
@ -2182,7 +2182,7 @@ static int vmdk_init_extent(BlockBackend *blk,
} }
ret = blk_truncate(blk, le64_to_cpu(header.grain_offset) << 9, false, ret = blk_truncate(blk, le64_to_cpu(header.grain_offset) << 9, false,
PREALLOC_MODE_OFF, errp); PREALLOC_MODE_OFF, 0, errp);
if (ret < 0) { if (ret < 0) {
goto exit; goto exit;
} }
@ -2523,7 +2523,7 @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
/* bdrv_pwrite write padding zeros to align to sector, we don't need that /* bdrv_pwrite write padding zeros to align to sector, we don't need that
* for description file */ * for description file */
if (desc_offset == 0) { if (desc_offset == 0) {
ret = blk_truncate(blk, desc_len, false, PREALLOC_MODE_OFF, errp); ret = blk_truncate(blk, desc_len, false, PREALLOC_MODE_OFF, 0, errp);
if (ret < 0) { if (ret < 0) {
goto exit; goto exit;
} }

View File

@ -898,7 +898,7 @@ static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
/* Add footer to total size */ /* Add footer to total size */
total_size += HEADER_SIZE; total_size += HEADER_SIZE;
ret = blk_truncate(blk, total_size, false, PREALLOC_MODE_OFF, errp); ret = blk_truncate(blk, total_size, false, PREALLOC_MODE_OFF, 0, errp);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }

View File

@ -2741,7 +2741,7 @@ void qmp_block_resize(bool has_device, const char *device,
} }
bdrv_drained_begin(bs); bdrv_drained_begin(bs);
ret = blk_truncate(blk, size, false, PREALLOC_MODE_OFF, errp); ret = blk_truncate(blk, size, false, PREALLOC_MODE_OFF, 0, errp);
bdrv_drained_end(bs); bdrv_drained_end(bs);
out: out:

View File

@ -237,7 +237,7 @@ int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset,
int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf, int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf,
int bytes); int bytes);
int blk_truncate(BlockBackend *blk, int64_t offset, bool exact, int blk_truncate(BlockBackend *blk, int64_t offset, bool exact,
PreallocMode prealloc, Error **errp); PreallocMode prealloc, BdrvRequestFlags flags, Error **errp);
int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes); int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes);
int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,
int64_t pos, int size); int64_t pos, int size);

View File

@ -3897,7 +3897,7 @@ static int img_resize(int argc, char **argv)
* resizing, so pass @exact=true. It is of no use to report * resizing, so pass @exact=true. It is of no use to report
* success when the image has not actually been resized. * success when the image has not actually been resized.
*/ */
ret = blk_truncate(blk, total_size, true, prealloc, &err); ret = blk_truncate(blk, total_size, true, prealloc, 0, &err);
if (!ret) { if (!ret) {
qprintf(quiet, "Image resized.\n"); qprintf(quiet, "Image resized.\n");
} else { } else {

View File

@ -1715,7 +1715,7 @@ static int truncate_f(BlockBackend *blk, int argc, char **argv)
* exact=true. It is better to err on the "emit more errors" side * exact=true. It is better to err on the "emit more errors" side
* than to be overly permissive. * than to be overly permissive.
*/ */
ret = blk_truncate(blk, offset, true, PREALLOC_MODE_OFF, &local_err); ret = blk_truncate(blk, offset, true, PREALLOC_MODE_OFF, 0, &local_err);
if (ret < 0) { if (ret < 0) {
error_report_err(local_err); error_report_err(local_err);
return ret; return ret;