Skip to content

Commit 5797a36

Browse files
XanClicmdroth
authored andcommitted
block: Add errp to b{lk,drv}_truncate()
For one thing, this allows us to drop the error message generation from qemu-img.c and blockdev.c and instead have it unified in bdrv_truncate(). Signed-off-by: Max Reitz <[email protected]> Message-id: [email protected] Reviewed-by: Stefan Hajnoczi <[email protected]> Signed-off-by: Max Reitz <[email protected]> (cherry picked from commit ed3d2ec) * prereq for 698bdfa Signed-off-by: Michael Roth <[email protected]>
1 parent 73aa7ad commit 5797a36

22 files changed

+73
-86
lines changed

block.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3262,7 +3262,7 @@ int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
32623262
/**
32633263
* Truncate file to 'offset' bytes (needed only for file protocols)
32643264
*/
3265-
int bdrv_truncate(BdrvChild *child, int64_t offset)
3265+
int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp)
32663266
{
32673267
BlockDriverState *bs = child->bs;
32683268
BlockDriver *drv = bs->drv;
@@ -3274,19 +3274,27 @@ int bdrv_truncate(BdrvChild *child, int64_t offset)
32743274
* cannot assert this permission in that case. */
32753275
// assert(child->perm & BLK_PERM_RESIZE);
32763276

3277-
if (!drv)
3277+
if (!drv) {
3278+
error_setg(errp, "No medium inserted");
32783279
return -ENOMEDIUM;
3279-
if (!drv->bdrv_truncate)
3280+
}
3281+
if (!drv->bdrv_truncate) {
3282+
error_setg(errp, "Image format driver does not support resize");
32803283
return -ENOTSUP;
3281-
if (bs->read_only)
3284+
}
3285+
if (bs->read_only) {
3286+
error_setg(errp, "Image is read-only");
32823287
return -EACCES;
3288+
}
32833289

32843290
ret = drv->bdrv_truncate(bs, offset);
32853291
if (ret == 0) {
32863292
ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
32873293
bdrv_dirty_bitmap_truncate(bs);
32883294
bdrv_parent_cb_resize(bs);
32893295
++bs->write_gen;
3296+
} else {
3297+
error_setg_errno(errp, -ret, "Failed to resize image");
32903298
}
32913299
return ret;
32923300
}

block/blkdebug.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ static int64_t blkdebug_getlength(BlockDriverState *bs)
661661

662662
static int blkdebug_truncate(BlockDriverState *bs, int64_t offset)
663663
{
664-
return bdrv_truncate(bs->file, offset);
664+
return bdrv_truncate(bs->file, offset, NULL);
665665
}
666666

667667
static void blkdebug_refresh_filename(BlockDriverState *bs, QDict *options)

block/block-backend.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,13 +1746,14 @@ int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, const void *buf,
17461746
BDRV_REQ_WRITE_COMPRESSED);
17471747
}
17481748

1749-
int blk_truncate(BlockBackend *blk, int64_t offset)
1749+
int blk_truncate(BlockBackend *blk, int64_t offset, Error **errp)
17501750
{
17511751
if (!blk_is_available(blk)) {
1752+
error_setg(errp, "No medium inserted");
17521753
return -ENOMEDIUM;
17531754
}
17541755

1755-
return bdrv_truncate(blk->root, offset);
1756+
return bdrv_truncate(blk->root, offset, errp);
17561757
}
17571758

17581759
static void blk_pdiscard_entry(void *opaque)

block/commit.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ static void coroutine_fn commit_run(void *opaque)
151151
}
152152

153153
if (base_len < s->common.len) {
154-
ret = blk_truncate(s->base, s->common.len);
154+
ret = blk_truncate(s->base, s->common.len, NULL);
155155
if (ret) {
156156
goto out;
157157
}
@@ -511,8 +511,9 @@ int bdrv_commit(BlockDriverState *bs)
511511
* grow the backing file image if possible. If not possible,
512512
* we must return an error */
513513
if (length > backing_length) {
514-
ret = blk_truncate(backing, length);
514+
ret = blk_truncate(backing, length, &local_err);
515515
if (ret < 0) {
516+
error_report_err(local_err);
516517
goto ro_cleanup;
517518
}
518519
}

block/crypto.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ static int block_crypto_truncate(BlockDriverState *bs, int64_t offset)
389389

390390
offset += payload_offset;
391391

392-
return bdrv_truncate(bs->file, offset);
392+
return bdrv_truncate(bs->file, offset, NULL);
393393
}
394394

395395
static void block_crypto_close(BlockDriverState *bs)

block/mirror.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ static void coroutine_fn mirror_run(void *opaque)
724724
}
725725

726726
if (s->bdev_length > base_length) {
727-
ret = blk_truncate(s->target, s->bdev_length);
727+
ret = blk_truncate(s->target, s->bdev_length, NULL);
728728
if (ret < 0) {
729729
goto immediate_exit;
730730
}

block/parallels.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ static int64_t allocate_clusters(BlockDriverState *bs, int64_t sector_num,
223223
space << BDRV_SECTOR_BITS, 0);
224224
} else {
225225
ret = bdrv_truncate(bs->file,
226-
(s->data_end + space) << BDRV_SECTOR_BITS);
226+
(s->data_end + space) << BDRV_SECTOR_BITS,
227+
NULL);
227228
}
228229
if (ret < 0) {
229230
return ret;
@@ -456,8 +457,10 @@ static int parallels_check(BlockDriverState *bs, BdrvCheckResult *res,
456457
size - res->image_end_offset);
457458
res->leaks += count;
458459
if (fix & BDRV_FIX_LEAKS) {
459-
ret = bdrv_truncate(bs->file, res->image_end_offset);
460+
Error *local_err = NULL;
461+
ret = bdrv_truncate(bs->file, res->image_end_offset, &local_err);
460462
if (ret < 0) {
463+
error_report_err(local_err);
461464
res->check_errors++;
462465
return ret;
463466
}
@@ -504,7 +507,7 @@ static int parallels_create(const char *filename, QemuOpts *opts, Error **errp)
504507

505508
blk_set_allow_write_beyond_eof(file, true);
506509

507-
ret = blk_truncate(file, 0);
510+
ret = blk_truncate(file, 0, errp);
508511
if (ret < 0) {
509512
goto exit;
510513
}
@@ -696,7 +699,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
696699
}
697700

698701
if (!(flags & BDRV_O_RESIZE) || !bdrv_has_zero_init(bs->file->bs) ||
699-
bdrv_truncate(bs->file, bdrv_getlength(bs->file->bs)) != 0) {
702+
bdrv_truncate(bs->file, bdrv_getlength(bs->file->bs), NULL) != 0) {
700703
s->prealloc_mode = PRL_PREALLOC_MODE_FALLOCATE;
701704
}
702705

@@ -739,7 +742,7 @@ static void parallels_close(BlockDriverState *bs)
739742
}
740743

741744
if (bs->open_flags & BDRV_O_RDWR) {
742-
bdrv_truncate(bs->file, s->data_end << BDRV_SECTOR_BITS);
745+
bdrv_truncate(bs->file, s->data_end << BDRV_SECTOR_BITS, NULL);
743746
}
744747

745748
g_free(s->bat_dirty_bmap);

block/qcow.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ static uint64_t get_cluster_offset(BlockDriverState *bs,
473473
/* round to cluster size */
474474
cluster_offset = (cluster_offset + s->cluster_size - 1) &
475475
~(s->cluster_size - 1);
476-
bdrv_truncate(bs->file, cluster_offset + s->cluster_size);
476+
bdrv_truncate(bs->file, cluster_offset + s->cluster_size, NULL);
477477
/* if encrypted, we must initialize the cluster
478478
content which won't be written */
479479
if (bs->encrypted &&
@@ -833,7 +833,7 @@ static int qcow_create(const char *filename, QemuOpts *opts, Error **errp)
833833

834834
blk_set_allow_write_beyond_eof(qcow_blk, true);
835835

836-
ret = blk_truncate(qcow_blk, 0);
836+
ret = blk_truncate(qcow_blk, 0, errp);
837837
if (ret < 0) {
838838
goto exit;
839839
}
@@ -916,7 +916,7 @@ static int qcow_make_empty(BlockDriverState *bs)
916916
if (bdrv_pwrite_sync(bs->file, s->l1_table_offset, s->l1_table,
917917
l1_length) < 0)
918918
return -1;
919-
ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length);
919+
ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length, NULL);
920920
if (ret < 0)
921921
return ret;
922922

block/qcow2-refcount.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1728,14 +1728,17 @@ static int check_refblocks(BlockDriverState *bs, BdrvCheckResult *res,
17281728

17291729
if (fix & BDRV_FIX_ERRORS) {
17301730
int64_t new_nb_clusters;
1731+
Error *local_err = NULL;
17311732

17321733
if (offset > INT64_MAX - s->cluster_size) {
17331734
ret = -EINVAL;
17341735
goto resize_fail;
17351736
}
17361737

1737-
ret = bdrv_truncate(bs->file, offset + s->cluster_size);
1738+
ret = bdrv_truncate(bs->file, offset + s->cluster_size,
1739+
&local_err);
17381740
if (ret < 0) {
1741+
error_report_err(local_err);
17391742
goto resize_fail;
17401743
}
17411744
size = bdrv_getlength(bs->file->bs);

block/qcow2.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,9 +2294,9 @@ static int qcow2_create2(const char *filename, int64_t total_size,
22942294
}
22952295

22962296
/* Okay, now that we have a valid image, let's give it the right size */
2297-
ret = blk_truncate(blk, total_size);
2297+
ret = blk_truncate(blk, total_size, errp);
22982298
if (ret < 0) {
2299-
error_setg_errno(errp, -ret, "Could not resize image");
2299+
error_prepend(errp, "Could not resize image: ");
23002300
goto out;
23012301
}
23022302

@@ -2584,7 +2584,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
25842584
/* align end of file to a sector boundary to ease reading with
25852585
sector based I/Os */
25862586
cluster_offset = bdrv_getlength(bs->file->bs);
2587-
return bdrv_truncate(bs->file, cluster_offset);
2587+
return bdrv_truncate(bs->file, cluster_offset, NULL);
25882588
}
25892589

25902590
buf = qemu_blockalign(bs, s->cluster_size);
@@ -2674,6 +2674,7 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
26742674
static int make_completely_empty(BlockDriverState *bs)
26752675
{
26762676
BDRVQcow2State *s = bs->opaque;
2677+
Error *local_err = NULL;
26772678
int ret, l1_clusters;
26782679
int64_t offset;
26792680
uint64_t *new_reftable = NULL;
@@ -2798,8 +2799,10 @@ static int make_completely_empty(BlockDriverState *bs)
27982799
goto fail;
27992800
}
28002801

2801-
ret = bdrv_truncate(bs->file, (3 + l1_clusters) * s->cluster_size);
2802+
ret = bdrv_truncate(bs->file, (3 + l1_clusters) * s->cluster_size,
2803+
&local_err);
28022804
if (ret < 0) {
2805+
error_report_err(local_err);
28032806
goto fail;
28042807
}
28052808

@@ -3273,9 +3276,10 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
32733276
return ret;
32743277
}
32753278

3276-
ret = blk_truncate(blk, new_size);
3279+
ret = blk_truncate(blk, new_size, &local_err);
32773280
blk_unref(blk);
32783281
if (ret < 0) {
3282+
error_report_err(local_err);
32793283
return ret;
32803284
}
32813285
}

block/qed.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ static int qed_create(const char *filename, uint32_t cluster_size,
635635
blk_set_allow_write_beyond_eof(blk, true);
636636

637637
/* File must start empty and grow, check truncate is supported */
638-
ret = blk_truncate(blk, 0);
638+
ret = blk_truncate(blk, 0, errp);
639639
if (ret < 0) {
640640
goto out;
641641
}

block/raw-format.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset)
341341

342342
s->size = offset;
343343
offset += s->offset;
344-
return bdrv_truncate(bs->file, offset);
344+
return bdrv_truncate(bs->file, offset, NULL);
345345
}
346346

347347
static int raw_media_changed(BlockDriverState *bs)

block/vdi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -832,9 +832,9 @@ static int vdi_create(const char *filename, QemuOpts *opts, Error **errp)
832832
}
833833

834834
if (image_type == VDI_TYPE_STATIC) {
835-
ret = blk_truncate(blk, offset + blocks * block_size);
835+
ret = blk_truncate(blk, offset + blocks * block_size, errp);
836836
if (ret < 0) {
837-
error_setg(errp, "Failed to statically allocate %s", filename);
837+
error_prepend(errp, "Failed to statically allocate %s", filename);
838838
goto exit;
839839
}
840840
}

block/vhdx-log.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ static int vhdx_log_flush(BlockDriverState *bs, BDRVVHDXState *s,
548548
if (new_file_size % (1024*1024)) {
549549
/* round up to nearest 1MB boundary */
550550
new_file_size = ((new_file_size >> 20) + 1) << 20;
551-
bdrv_truncate(bs->file, new_file_size);
551+
bdrv_truncate(bs->file, new_file_size, NULL);
552552
}
553553
}
554554
qemu_vfree(desc_entries);

block/vhdx.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,7 @@ static int vhdx_allocate_block(BlockDriverState *bs, BDRVVHDXState *s,
11711171
/* per the spec, the address for a block is in units of 1MB */
11721172
*new_offset = ROUND_UP(*new_offset, 1024 * 1024);
11731173

1174-
return bdrv_truncate(bs->file, *new_offset + s->block_size);
1174+
return bdrv_truncate(bs->file, *new_offset + s->block_size, NULL);
11751175
}
11761176

11771177
/*
@@ -1607,14 +1607,14 @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
16071607
if (type == VHDX_TYPE_DYNAMIC) {
16081608
/* All zeroes, so we can just extend the file - the end of the BAT
16091609
* is the furthest thing we have written yet */
1610-
ret = blk_truncate(blk, data_file_offset);
1610+
ret = blk_truncate(blk, data_file_offset, errp);
16111611
if (ret < 0) {
16121612
error_setg_errno(errp, -ret,
16131613
"Failed to resize the underlying file");
16141614
goto exit;
16151615
}
16161616
} else if (type == VHDX_TYPE_FIXED) {
1617-
ret = blk_truncate(blk, data_file_offset + image_size);
1617+
ret = blk_truncate(blk, data_file_offset + image_size, errp);
16181618
if (ret < 0) {
16191619
error_setg_errno(errp, -ret,
16201620
"Failed to resize the underlying file");

block/vmdk.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,10 +1714,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
17141714
blk_set_allow_write_beyond_eof(blk, true);
17151715

17161716
if (flat) {
1717-
ret = blk_truncate(blk, filesize);
1718-
if (ret < 0) {
1719-
error_setg_errno(errp, -ret, "Could not truncate file");
1720-
}
1717+
ret = blk_truncate(blk, filesize, errp);
17211718
goto exit;
17221719
}
17231720
magic = cpu_to_be32(VMDK4_MAGIC);
@@ -1780,9 +1777,8 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
17801777
goto exit;
17811778
}
17821779

1783-
ret = blk_truncate(blk, le64_to_cpu(header.grain_offset) << 9);
1780+
ret = blk_truncate(blk, le64_to_cpu(header.grain_offset) << 9, errp);
17841781
if (ret < 0) {
1785-
error_setg_errno(errp, -ret, "Could not truncate file");
17861782
goto exit;
17871783
}
17881784

@@ -2090,10 +2086,7 @@ static int vmdk_create(const char *filename, QemuOpts *opts, Error **errp)
20902086
/* bdrv_pwrite write padding zeros to align to sector, we don't need that
20912087
* for description file */
20922088
if (desc_offset == 0) {
2093-
ret = blk_truncate(new_blk, desc_len);
2094-
if (ret < 0) {
2095-
error_setg_errno(errp, -ret, "Could not truncate file");
2096-
}
2089+
ret = blk_truncate(new_blk, desc_len, errp);
20972090
}
20982091
exit:
20992092
if (new_blk) {

block/vpc.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -851,20 +851,21 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
851851
}
852852

853853
static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
854-
int64_t total_size)
854+
int64_t total_size, Error **errp)
855855
{
856856
int ret;
857857

858858
/* Add footer to total size */
859859
total_size += HEADER_SIZE;
860860

861-
ret = blk_truncate(blk, total_size);
861+
ret = blk_truncate(blk, total_size, errp);
862862
if (ret < 0) {
863863
return ret;
864864
}
865865

866866
ret = blk_pwrite(blk, total_size - HEADER_SIZE, buf, HEADER_SIZE, 0);
867867
if (ret < 0) {
868+
error_setg_errno(errp, -ret, "Unable to write VHD header");
868869
return ret;
869870
}
870871

@@ -996,11 +997,11 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp)
996997

997998
if (disk_type == VHD_DYNAMIC) {
998999
ret = create_dynamic_disk(blk, buf, total_sectors);
1000+
if (ret < 0) {
1001+
error_setg(errp, "Unable to create or write VHD header");
1002+
}
9991003
} else {
1000-
ret = create_fixed_disk(blk, buf, total_size);
1001-
}
1002-
if (ret < 0) {
1003-
error_setg(errp, "Unable to create or write VHD header");
1004+
ret = create_fixed_disk(blk, buf, total_size, errp);
10041005
}
10051006

10061007
out:

0 commit comments

Comments
 (0)