mirror: correct buf_size
PATCH v5 1/1 mirror: correct buf_size
If bus_size is less than 0, the command fails.
If buf_size is 0, use DEFAULT_MIRROR_BUF_SIZE.
If buf_size % granularity is not 0, mirror_free_init() will do dangerous things.
Signed-off-by Wen Congyang <[email protected]>
Reviewed-by Fam Zheng <[email protected]>
--- block/mirror.c | 11 ++++++++++- blockdev.c | 4 +--- 2 files changed, 11 insertions(+), 4 deletions(-)
block/mirror.c +10 -1
@@ -19,6 +19,7 @@#define SLICE_TIME 100000000ULL/* ns */ #define MAX_IN_FLIGHT 16 +#define DEFAULT_MIRROR_BUF_SIZE (10 << 20)/* The mirroring buffer is a list of granularity-sized chunks. * Free chunks are organized in a list.
@@ -671,6 +672,14 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,return ; } +if (buf_size <0 ) { +error_setg (errp,"Invalid parameter 'buf-size'" ); +return ; + } + +if (buf_size ==0 ) { + buf_size =DEFAULT_MIRROR_BUF_SIZE ; + } s =block_job_create (driver, bs, speed, cb, opaque, errp);if (!s) {
@@ -684,7 +693,7 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target, s->is_none_mode = is_none_mode; s->base = base; s->granularity = granularity; - s->buf_size =MAX (buf_size, granularity); + s->buf_size =ROUND_UP (buf_size, granularity); s->dirty_bitmap =bdrv_create_dirty_bitmap (bs, granularity,NULL , errp);if (!s->dirty_bitmap) {
blockdev.c +1 -3
@@ -2619,8 +2619,6 @@ out:aio_context_release (aio_context); } -#define DEFAULT_MIRROR_BUF_SIZE (10 << 20) - void qmp_drive_mirror(const char *device, const char *target, bool has_format, const char *format, bool has_node_name, const char *node_name,
@@ -2661,7 +2659,7 @@ void qmp_drive_mirror(const char *device, const char *target, granularity =0 ; }if (!has_buf_size) { - buf_size =DEFAULT_MIRROR_BUF_SIZE ; + buf_size =0 ; }if (granularity !=0 && (granularity <512 || granularity >1048576 *64 )) {
Signature · 1 line
2.1.0
Ping...
Quoted 71 lines · Wen Congyang
If
bus_sizeis less than 0, the command fails.
Ifbuf_sizeis 0, useDEFAULT_MIRROR_BUF_SIZE.
Ifbuf_size% granularity is not 0,mirror_free_init()will do dangerous things.Signed-off-by Wen Congyang <[email protected]>Reviewed-by Fam Zheng <[email protected]>--- block/mirror.c | 11 ++++++++++- blockdev.c | 4 +--- 2 files changed, 11 insertions(+), 4 deletions(-)block/mirror.c +10
-1@@ -19,6 +19,7 @@#define SLICE_TIME 100000000ULL/* ns */ #define MAX_IN_FLIGHT 16 +#define DEFAULT_MIRROR_BUF_SIZE (10 << 20)/* The mirroring buffer is a list of granularity-sized chunks. * Free chunks are organized in a list. @@ -671,6 +672,14 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,return ; } +if (buf_size <0 ) { +error_setg (errp,"Invalid parameter 'buf-size'" ); +return ; + } + +if (buf_size ==0 ) { + buf_size =DEFAULT_MIRROR_BUF_SIZE ; + } s =block_job_create (driver, bs, speed, cb, opaque, errp);if (!s) {@@ -684,7 +693,7 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target, s->is_none_mode = is_none_mode; s->base = base; s->granularity = granularity; - s->buf_size =MAX (buf_size, granularity); + s->buf_size =ROUND_UP (buf_size, granularity); s->dirty_bitmap =bdrv_create_dirty_bitmap (bs, granularity,NULL , errp);if (!s->dirty_bitmap) {blockdev.c +1
-3@@ -2619,8 +2619,6 @@ out:aio_context_release (aio_context); } -#define DEFAULT_MIRROR_BUF_SIZE (10 << 20) - void qmp_drive_mirror(const char *device, const char *target, bool has_format, const char *format, bool has_node_name, const char *node_name,@@ -2661,7 +2659,7 @@ void qmp_drive_mirror(const char *device, const char *target, granularity =0 ; }if (!has_buf_size) { - buf_size =DEFAULT_MIRROR_BUF_SIZE ; + buf_size =0 ; }if (granularity !=0 && (granularity <512 || granularity >1048576 *64 )) {
Jeff Cody
AppliedQuoted 72 lines · Wen Congyang
If
bus_sizeis less than 0, the command fails.
Ifbuf_sizeis 0, useDEFAULT_MIRROR_BUF_SIZE.
Ifbuf_size% granularity is not 0,mirror_free_init()will do dangerous things.Signed-off-by Wen Congyang <[email protected]>Reviewed-by Fam Zheng <[email protected]>--- block/mirror.c | 11 ++++++++++- blockdev.c | 4 +--- 2 files changed, 11 insertions(+), 4 deletions(-)block/mirror.c +10
-1@@ -19,6 +19,7 @@#define SLICE_TIME 100000000ULL/* ns */ #define MAX_IN_FLIGHT 16 +#define DEFAULT_MIRROR_BUF_SIZE (10 << 20)/* The mirroring buffer is a list of granularity-sized chunks. * Free chunks are organized in a list. @@ -671,6 +672,14 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,return ; } +if (buf_size <0 ) { +error_setg (errp,"Invalid parameter 'buf-size'" ); +return ; + } + +if (buf_size ==0 ) { + buf_size =DEFAULT_MIRROR_BUF_SIZE ; + } s =block_job_create (driver, bs, speed, cb, opaque, errp);if (!s) {@@ -684,7 +693,7 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target, s->is_none_mode = is_none_mode; s->base = base; s->granularity = granularity; - s->buf_size =MAX (buf_size, granularity); + s->buf_size =ROUND_UP (buf_size, granularity); s->dirty_bitmap =bdrv_create_dirty_bitmap (bs, granularity,NULL , errp);if (!s->dirty_bitmap) {blockdev.c +1
-3@@ -2619,8 +2619,6 @@ out:aio_context_release (aio_context); } -#define DEFAULT_MIRROR_BUF_SIZE (10 << 20) - void qmp_drive_mirror(const char *device, const char *target, bool has_format, const char *format, bool has_node_name, const char *node_name,@@ -2661,7 +2659,7 @@ void qmp_drive_mirror(const char *device, const char *target, granularity =0 ; }if (!has_buf_size) { - buf_size =DEFAULT_MIRROR_BUF_SIZE ; + buf_size =0 ; }if (granularity !=0 && (granularity <512 || granularity >1048576 *64 )) {Signature · 1 line
2.1.0
Thanks, applied to my block tree:
https://github.com/codyprime/qemu-kvm-jtc/commits/block
Jeff