提交 3baca891 编写于 作者: K Kevin Wolf 提交者: Stefan Hajnoczi

block: Add Error argument to bdrv_refresh_limits()

Signed-off-by: NKevin Wolf <kwolf@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 12ac6d3d
...@@ -508,19 +508,24 @@ int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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: ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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: ...@@ -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) ...@@ -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); ...@@ -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 { ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册