mirror of
https://github.com/qemu/qemu.git
synced 2025-01-19 03:53:28 +08:00
block: Add Error argument to bdrv_refresh_limits()
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
12ac6d3db7
commit
3baca89139
33
block.c
33
block.c
@ -508,19 +508,24 @@ int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bdrv_refresh_limits(BlockDriverState *bs)
|
void bdrv_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriver *drv = bs->drv;
|
BlockDriver *drv = bs->drv;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
memset(&bs->bl, 0, sizeof(bs->bl));
|
memset(&bs->bl, 0, sizeof(bs->bl));
|
||||||
|
|
||||||
if (!drv) {
|
if (!drv) {
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Take some limits from the children as a default */
|
/* Take some limits from the children as a default */
|
||||||
if (bs->file) {
|
if (bs->file) {
|
||||||
bdrv_refresh_limits(bs->file);
|
bdrv_refresh_limits(bs->file, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
bs->bl.opt_transfer_length = bs->file->bl.opt_transfer_length;
|
bs->bl.opt_transfer_length = bs->file->bl.opt_transfer_length;
|
||||||
bs->bl.opt_mem_alignment = bs->file->bl.opt_mem_alignment;
|
bs->bl.opt_mem_alignment = bs->file->bl.opt_mem_alignment;
|
||||||
} else {
|
} else {
|
||||||
@ -528,7 +533,11 @@ int bdrv_refresh_limits(BlockDriverState *bs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bs->backing_hd) {
|
if (bs->backing_hd) {
|
||||||
bdrv_refresh_limits(bs->backing_hd);
|
bdrv_refresh_limits(bs->backing_hd, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
bs->bl.opt_transfer_length =
|
bs->bl.opt_transfer_length =
|
||||||
MAX(bs->bl.opt_transfer_length,
|
MAX(bs->bl.opt_transfer_length,
|
||||||
bs->backing_hd->bl.opt_transfer_length);
|
bs->backing_hd->bl.opt_transfer_length);
|
||||||
@ -539,10 +548,8 @@ int bdrv_refresh_limits(BlockDriverState *bs)
|
|||||||
|
|
||||||
/* Then let the driver override it */
|
/* Then let the driver override it */
|
||||||
if (drv->bdrv_refresh_limits) {
|
if (drv->bdrv_refresh_limits) {
|
||||||
return drv->bdrv_refresh_limits(bs);
|
drv->bdrv_refresh_limits(bs, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -993,7 +1000,13 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
|
|||||||
goto free_and_fail;
|
goto free_and_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_refresh_limits(bs);
|
bdrv_refresh_limits(bs, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto free_and_fail;
|
||||||
|
}
|
||||||
|
|
||||||
assert(bdrv_opt_mem_align(bs) != 0);
|
assert(bdrv_opt_mem_align(bs) != 0);
|
||||||
assert((bs->request_alignment != 0) || bs->sg);
|
assert((bs->request_alignment != 0) || bs->sg);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1154,7 +1167,7 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
|
|||||||
bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT,
|
bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT,
|
||||||
bs->backing_blocker);
|
bs->backing_blocker);
|
||||||
out:
|
out:
|
||||||
bdrv_refresh_limits(bs);
|
bdrv_refresh_limits(bs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1778,7 +1791,7 @@ void bdrv_reopen_commit(BDRVReopenState *reopen_state)
|
|||||||
BDRV_O_CACHE_WB);
|
BDRV_O_CACHE_WB);
|
||||||
reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
|
reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
|
||||||
|
|
||||||
bdrv_refresh_limits(reopen_state->bs);
|
bdrv_refresh_limits(reopen_state->bs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1450,7 +1450,7 @@ static void iscsi_close(BlockDriverState *bs)
|
|||||||
memset(iscsilun, 0, sizeof(IscsiLun));
|
memset(iscsilun, 0, sizeof(IscsiLun));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iscsi_refresh_limits(BlockDriverState *bs)
|
static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
IscsiLun *iscsilun = bs->opaque;
|
IscsiLun *iscsilun = bs->opaque;
|
||||||
|
|
||||||
@ -1475,7 +1475,6 @@ static int iscsi_refresh_limits(BlockDriverState *bs)
|
|||||||
}
|
}
|
||||||
bs->bl.opt_transfer_length = sector_lun2qemu(iscsilun->bl.opt_xfer_len,
|
bs->bl.opt_transfer_length = sector_lun2qemu(iscsilun->bl.opt_xfer_len,
|
||||||
iscsilun);
|
iscsilun);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since iscsi_open() ignores bdrv_flags, there is nothing to do here in
|
/* Since iscsi_open() ignores bdrv_flags, there is nothing to do here in
|
||||||
|
@ -866,13 +866,11 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcow2_refresh_limits(BlockDriverState *bs)
|
static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
BDRVQcowState *s = bs->opaque;
|
BDRVQcowState *s = bs->opaque;
|
||||||
|
|
||||||
bs->bl.write_zeroes_alignment = s->cluster_sectors;
|
bs->bl.write_zeroes_alignment = s->cluster_sectors;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcow2_set_key(BlockDriverState *bs, const char *key)
|
static int qcow2_set_key(BlockDriverState *bs, const char *key)
|
||||||
|
@ -528,13 +528,11 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bdrv_qed_refresh_limits(BlockDriverState *bs)
|
static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
BDRVQEDState *s = bs->opaque;
|
BDRVQEDState *s = bs->opaque;
|
||||||
|
|
||||||
bs->bl.write_zeroes_alignment = s->header.cluster_size >> BDRV_SECTOR_BITS;
|
bs->bl.write_zeroes_alignment = s->header.cluster_size >> BDRV_SECTOR_BITS;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We have nothing to do for QED reopen, stubs just return
|
/* We have nothing to do for QED reopen, stubs just return
|
||||||
|
@ -615,14 +615,12 @@ static void raw_reopen_abort(BDRVReopenState *state)
|
|||||||
state->opaque = NULL;
|
state->opaque = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_refresh_limits(BlockDriverState *bs)
|
static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
|
|
||||||
raw_probe_alignment(bs);
|
raw_probe_alignment(bs);
|
||||||
bs->bl.opt_mem_alignment = s->buf_align;
|
bs->bl.opt_mem_alignment = s->buf_align;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t handle_aiocb_ioctl(RawPosixAIOData *aiocb)
|
static ssize_t handle_aiocb_ioctl(RawPosixAIOData *aiocb)
|
||||||
|
@ -94,10 +94,9 @@ static int raw_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
|||||||
return bdrv_get_info(bs->file, bdi);
|
return bdrv_get_info(bs->file, bdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_refresh_limits(BlockDriverState *bs)
|
static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
bs->bl = bs->file->bl;
|
bs->bl = bs->file->bl;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_truncate(BlockDriverState *bs, int64_t offset)
|
static int raw_truncate(BlockDriverState *bs, int64_t offset)
|
||||||
|
@ -76,7 +76,7 @@ static void close_unused_images(BlockDriverState *top, BlockDriverState *base,
|
|||||||
bdrv_unref(unused);
|
bdrv_unref(unused);
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_refresh_limits(top);
|
bdrv_refresh_limits(top, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void coroutine_fn stream_run(void *opaque)
|
static void coroutine_fn stream_run(void *opaque)
|
||||||
|
@ -938,7 +938,7 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int vmdk_refresh_limits(BlockDriverState *bs)
|
static void vmdk_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
BDRVVmdkState *s = bs->opaque;
|
BDRVVmdkState *s = bs->opaque;
|
||||||
int i;
|
int i;
|
||||||
@ -950,8 +950,6 @@ static int vmdk_refresh_limits(BlockDriverState *bs)
|
|||||||
s->extents[i].cluster_sectors);
|
s->extents[i].cluster_sectors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_whole_cluster(BlockDriverState *bs,
|
static int get_whole_cluster(BlockDriverState *bs,
|
||||||
|
@ -278,7 +278,7 @@ int bdrv_truncate(BlockDriverState *bs, int64_t offset);
|
|||||||
int64_t bdrv_getlength(BlockDriverState *bs);
|
int64_t bdrv_getlength(BlockDriverState *bs);
|
||||||
int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
|
int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
|
||||||
void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
|
void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
|
||||||
int bdrv_refresh_limits(BlockDriverState *bs);
|
void bdrv_refresh_limits(BlockDriverState *bs, Error **errp);
|
||||||
int bdrv_commit(BlockDriverState *bs);
|
int bdrv_commit(BlockDriverState *bs);
|
||||||
int bdrv_commit_all(void);
|
int bdrv_commit_all(void);
|
||||||
int bdrv_change_backing_file(BlockDriverState *bs,
|
int bdrv_change_backing_file(BlockDriverState *bs,
|
||||||
|
@ -240,7 +240,7 @@ struct BlockDriver {
|
|||||||
int (*bdrv_debug_resume)(BlockDriverState *bs, const char *tag);
|
int (*bdrv_debug_resume)(BlockDriverState *bs, const char *tag);
|
||||||
bool (*bdrv_debug_is_suspended)(BlockDriverState *bs, const char *tag);
|
bool (*bdrv_debug_is_suspended)(BlockDriverState *bs, const char *tag);
|
||||||
|
|
||||||
int (*bdrv_refresh_limits)(BlockDriverState *bs);
|
void (*bdrv_refresh_limits)(BlockDriverState *bs, Error **errp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns 1 if newly created images are guaranteed to contain only
|
* Returns 1 if newly created images are guaranteed to contain only
|
||||||
|
Loading…
Reference in New Issue
Block a user