mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
ed3d2ec98a
commit
4bff28b81a
4
block.c
4
block.c
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue