block: Add errp to BD.bdrv_truncate()

Add an Error parameter to the block drivers' bdrv_truncate() interface.
If a block driver does not set this in case of an error, the generic
bdrv_truncate() implementation will do so.

Where it is obvious, this patch also makes some block drivers set this
value.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-id: 20170328205129.15138-4-mreitz@redhat.com
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
master
Max Reitz 2017-03-28 22:51:28 +02:00
parent ed3d2ec98a
commit 4bff28b81a
14 changed files with 31 additions and 31 deletions

View File

@ -3328,13 +3328,13 @@ int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp)
return -EACCES; return -EACCES;
} }
ret = drv->bdrv_truncate(bs, offset); ret = drv->bdrv_truncate(bs, offset, errp);
if (ret == 0) { if (ret == 0) {
ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS); ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
bdrv_dirty_bitmap_truncate(bs); bdrv_dirty_bitmap_truncate(bs);
bdrv_parent_cb_resize(bs); bdrv_parent_cb_resize(bs);
++bs->write_gen; ++bs->write_gen;
} else { } else if (errp && !*errp) {
error_setg_errno(errp, -ret, "Failed to resize image"); error_setg_errno(errp, -ret, "Failed to resize image");
} }
return ret; return ret;

View File

@ -659,9 +659,9 @@ static int64_t blkdebug_getlength(BlockDriverState *bs)
return bdrv_getlength(bs->file->bs); return bdrv_getlength(bs->file->bs);
} }
static int blkdebug_truncate(BlockDriverState *bs, int64_t offset) static int blkdebug_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
return bdrv_truncate(bs->file, offset, NULL); return bdrv_truncate(bs->file, offset, errp);
} }
static void blkdebug_refresh_filename(BlockDriverState *bs, QDict *options) static void blkdebug_refresh_filename(BlockDriverState *bs, QDict *options)

View File

@ -381,7 +381,8 @@ static int block_crypto_create_generic(QCryptoBlockFormat format,
return ret; return ret;
} }
static int block_crypto_truncate(BlockDriverState *bs, int64_t offset) static int block_crypto_truncate(BlockDriverState *bs, int64_t offset,
Error **errp)
{ {
BlockCrypto *crypto = bs->opaque; BlockCrypto *crypto = bs->opaque;
size_t payload_offset = size_t payload_offset =
@ -389,7 +390,7 @@ static int block_crypto_truncate(BlockDriverState *bs, int64_t offset)
offset += payload_offset; offset += payload_offset;
return bdrv_truncate(bs->file, offset, NULL); return bdrv_truncate(bs->file, offset, errp);
} }
static void block_crypto_close(BlockDriverState *bs) static void block_crypto_close(BlockDriverState *bs)

View File

@ -1407,7 +1407,7 @@ static void raw_close(BlockDriverState *bs)
} }
} }
static int raw_truncate(BlockDriverState *bs, int64_t offset) static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
BDRVRawState *s = bs->opaque; BDRVRawState *s = bs->opaque;
struct stat st; struct stat st;

View File

@ -460,7 +460,7 @@ static void raw_close(BlockDriverState *bs)
} }
} }
static int raw_truncate(BlockDriverState *bs, int64_t offset) static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
BDRVRawState *s = bs->opaque; BDRVRawState *s = bs->opaque;
LONG low, high; LONG low, high;
@ -475,11 +475,11 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset)
*/ */
dwPtrLow = SetFilePointer(s->hfile, low, &high, FILE_BEGIN); dwPtrLow = SetFilePointer(s->hfile, low, &high, FILE_BEGIN);
if (dwPtrLow == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) { if (dwPtrLow == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) {
fprintf(stderr, "SetFilePointer error: %lu\n", GetLastError()); error_setg_win32(errp, GetLastError(), "SetFilePointer error");
return -EIO; return -EIO;
} }
if (SetEndOfFile(s->hfile) == 0) { if (SetEndOfFile(s->hfile) == 0) {
fprintf(stderr, "SetEndOfFile error: %lu\n", GetLastError()); error_setg_win32(errp, GetLastError(), "SetEndOfFile error");
return -EIO; return -EIO;
} }
return 0; return 0;

View File

@ -1092,7 +1092,8 @@ static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
return acb.ret; return acb.ret;
} }
static int qemu_gluster_truncate(BlockDriverState *bs, int64_t offset) static int qemu_gluster_truncate(BlockDriverState *bs, int64_t offset,
Error **errp)
{ {
int ret; int ret;
BDRVGlusterState *s = bs->opaque; BDRVGlusterState *s = bs->opaque;

View File

@ -2059,7 +2059,7 @@ static void iscsi_reopen_commit(BDRVReopenState *reopen_state)
} }
} }
static int iscsi_truncate(BlockDriverState *bs, int64_t offset) static int iscsi_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
IscsiLun *iscsilun = bs->opaque; IscsiLun *iscsilun = bs->opaque;
Error *local_err = NULL; Error *local_err = NULL;
@ -2070,7 +2070,7 @@ static int iscsi_truncate(BlockDriverState *bs, int64_t offset)
iscsi_readcapacity_sync(iscsilun, &local_err); iscsi_readcapacity_sync(iscsilun, &local_err);
if (local_err != NULL) { if (local_err != NULL) {
error_free(local_err); error_propagate(errp, local_err);
return -EIO; return -EIO;
} }

View File

@ -764,7 +764,7 @@ static int64_t nfs_get_allocated_file_size(BlockDriverState *bs)
return (task.ret < 0 ? task.ret : st.st_blocks * 512); return (task.ret < 0 ? task.ret : st.st_blocks * 512);
} }
static int nfs_file_truncate(BlockDriverState *bs, int64_t offset) static int nfs_file_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
NFSClient *client = bs->opaque; NFSClient *client = bs->opaque;
return nfs_ftruncate(client->context, client->fh, offset); return nfs_ftruncate(client->context, client->fh, offset);

View File

@ -2525,26 +2525,26 @@ static coroutine_fn int qcow2_co_pdiscard(BlockDriverState *bs,
return ret; return ret;
} }
static int qcow2_truncate(BlockDriverState *bs, int64_t offset) static int qcow2_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
int64_t new_l1_size; int64_t new_l1_size;
int ret; int ret;
if (offset & 511) { if (offset & 511) {
error_report("The new size must be a multiple of 512"); error_setg(errp, "The new size must be a multiple of 512");
return -EINVAL; return -EINVAL;
} }
/* cannot proceed if image has snapshots */ /* cannot proceed if image has snapshots */
if (s->nb_snapshots) { if (s->nb_snapshots) {
error_report("Can't resize an image which has snapshots"); error_setg(errp, "Can't resize an image which has snapshots");
return -ENOTSUP; return -ENOTSUP;
} }
/* shrinking is currently not supported */ /* shrinking is currently not supported */
if (offset < bs->total_sectors * 512) { if (offset < bs->total_sectors * 512) {
error_report("qcow2 doesn't support shrinking images yet"); error_setg(errp, "qcow2 doesn't support shrinking images yet");
return -ENOTSUP; return -ENOTSUP;
} }

View File

@ -1518,7 +1518,7 @@ static int coroutine_fn bdrv_qed_co_pwrite_zeroes(BlockDriverState *bs,
return cb.ret; return cb.ret;
} }
static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset) static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
BDRVQEDState *s = bs->opaque; BDRVQEDState *s = bs->opaque;
uint64_t old_image_size; uint64_t old_image_size;

View File

@ -327,7 +327,7 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
} }
} }
static int raw_truncate(BlockDriverState *bs, int64_t offset) static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
BDRVRawState *s = bs->opaque; BDRVRawState *s = bs->opaque;
@ -341,7 +341,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset)
s->size = offset; s->size = offset;
offset += s->offset; offset += s->offset;
return bdrv_truncate(bs->file, offset, NULL); return bdrv_truncate(bs->file, offset, errp);
} }
static int raw_media_changed(BlockDriverState *bs) static int raw_media_changed(BlockDriverState *bs)

View File

@ -916,7 +916,7 @@ static int64_t qemu_rbd_getlength(BlockDriverState *bs)
return info.size; return info.size;
} }
static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset) static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
BDRVRBDState *s = bs->opaque; BDRVRBDState *s = bs->opaque;
int r; int r;

View File

@ -2159,9 +2159,8 @@ static int64_t sd_getlength(BlockDriverState *bs)
return s->inode.vdi_size; return s->inode.vdi_size;
} }
static int sd_truncate(BlockDriverState *bs, int64_t offset) static int sd_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{ {
Error *local_err = NULL;
BDRVSheepdogState *s = bs->opaque; BDRVSheepdogState *s = bs->opaque;
int ret, fd; int ret, fd;
unsigned int datalen; unsigned int datalen;
@ -2169,16 +2168,15 @@ static int sd_truncate(BlockDriverState *bs, int64_t offset)
max_vdi_size = (UINT64_C(1) << s->inode.block_size_shift) * MAX_DATA_OBJS; max_vdi_size = (UINT64_C(1) << s->inode.block_size_shift) * MAX_DATA_OBJS;
if (offset < s->inode.vdi_size) { if (offset < s->inode.vdi_size) {
error_report("shrinking is not supported"); error_setg(errp, "shrinking is not supported");
return -EINVAL; return -EINVAL;
} else if (offset > max_vdi_size) { } else if (offset > max_vdi_size) {
error_report("too big image size"); error_setg(errp, "too big image size");
return -EINVAL; return -EINVAL;
} }
fd = connect_to_sdog(s, &local_err); fd = connect_to_sdog(s, errp);
if (fd < 0) { if (fd < 0) {
error_report_err(local_err);
return fd; return fd;
} }
@ -2191,7 +2189,7 @@ static int sd_truncate(BlockDriverState *bs, int64_t offset)
close(fd); close(fd);
if (ret < 0) { if (ret < 0) {
error_report("failed to update an inode."); error_setg_errno(errp, -ret, "failed to update an inode");
} }
return ret; return ret;
@ -2456,7 +2454,7 @@ static coroutine_fn int sd_co_writev(BlockDriverState *bs, int64_t sector_num,
BDRVSheepdogState *s = bs->opaque; BDRVSheepdogState *s = bs->opaque;
if (offset > s->inode.vdi_size) { if (offset > s->inode.vdi_size) {
ret = sd_truncate(bs, offset); ret = sd_truncate(bs, offset, NULL);
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }

View File

@ -196,7 +196,7 @@ struct BlockDriver {
int coroutine_fn (*bdrv_co_flush_to_os)(BlockDriverState *bs); int coroutine_fn (*bdrv_co_flush_to_os)(BlockDriverState *bs);
const char *protocol_name; const char *protocol_name;
int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset); int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset, Error **errp);
int64_t (*bdrv_getlength)(BlockDriverState *bs); int64_t (*bdrv_getlength)(BlockDriverState *bs);
bool has_variable_length; bool has_variable_length;