update submodule and patches to QEMU 9.0.0
Biggest change is that AioContext locking got removed, but no changes required other than dropping the calls to acquire and release it. As a consequence, the single parameter for the bdrv_graph_wrlock() call got removed which also required adaptation. QAPI docs became stricter requiring to document all members. Other minor changes: - Single parameter from migration_is_running() was dropped. - qemu_mutex_(un)lock_iothread() got renamed to bql_(un)lock(). Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
766c61f1b6
commit
4fbd50e2f9
@ -38,7 +38,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
5 files changed, 142 insertions(+), 28 deletions(-)
|
5 files changed, 142 insertions(+), 28 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/mirror.c b/block/mirror.c
|
diff --git a/block/mirror.c b/block/mirror.c
|
||||||
index abbddb39e4..ed14c8b498 100644
|
index 1bdce3b657..0c5c72df2e 100644
|
||||||
--- a/block/mirror.c
|
--- a/block/mirror.c
|
||||||
+++ b/block/mirror.c
|
+++ b/block/mirror.c
|
||||||
@@ -51,7 +51,7 @@ typedef struct MirrorBlockJob {
|
@@ -51,7 +51,7 @@ typedef struct MirrorBlockJob {
|
||||||
@ -59,7 +59,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
BdrvDirtyBitmap *dirty_bitmap;
|
BdrvDirtyBitmap *dirty_bitmap;
|
||||||
BdrvDirtyBitmapIter *dbi;
|
BdrvDirtyBitmapIter *dbi;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
@@ -724,7 +726,8 @@ static int mirror_exit_common(Job *job)
|
@@ -722,7 +724,8 @@ static int mirror_exit_common(Job *job)
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
|
||||||
if (!abort && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) {
|
if (!abort && s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) {
|
||||||
@ -69,7 +69,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
BlockDriverState *unfiltered_target = bdrv_skip_filters(target_bs);
|
BlockDriverState *unfiltered_target = bdrv_skip_filters(target_bs);
|
||||||
|
|
||||||
if (bdrv_cow_bs(unfiltered_target) != backing) {
|
if (bdrv_cow_bs(unfiltered_target) != backing) {
|
||||||
@@ -831,6 +834,16 @@ static void mirror_abort(Job *job)
|
@@ -819,6 +822,16 @@ static void mirror_abort(Job *job)
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
static void coroutine_fn mirror_throttle(MirrorBlockJob *s)
|
static void coroutine_fn mirror_throttle(MirrorBlockJob *s)
|
||||||
{
|
{
|
||||||
int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
||||||
@@ -1027,7 +1040,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
@@ -1015,7 +1028,8 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
||||||
mirror_free_init(s);
|
mirror_free_init(s);
|
||||||
|
|
||||||
s->last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
s->last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
||||||
@ -96,7 +96,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
ret = mirror_dirty_init(s);
|
ret = mirror_dirty_init(s);
|
||||||
if (ret < 0 || job_is_cancelled(&s->common.job)) {
|
if (ret < 0 || job_is_cancelled(&s->common.job)) {
|
||||||
goto immediate_exit;
|
goto immediate_exit;
|
||||||
@@ -1323,6 +1337,7 @@ static const BlockJobDriver mirror_job_driver = {
|
@@ -1304,6 +1318,7 @@ static const BlockJobDriver mirror_job_driver = {
|
||||||
.run = mirror_run,
|
.run = mirror_run,
|
||||||
.prepare = mirror_prepare,
|
.prepare = mirror_prepare,
|
||||||
.abort = mirror_abort,
|
.abort = mirror_abort,
|
||||||
@ -104,7 +104,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
.pause = mirror_pause,
|
.pause = mirror_pause,
|
||||||
.complete = mirror_complete,
|
.complete = mirror_complete,
|
||||||
.cancel = mirror_cancel,
|
.cancel = mirror_cancel,
|
||||||
@@ -1341,6 +1356,7 @@ static const BlockJobDriver commit_active_job_driver = {
|
@@ -1322,6 +1337,7 @@ static const BlockJobDriver commit_active_job_driver = {
|
||||||
.run = mirror_run,
|
.run = mirror_run,
|
||||||
.prepare = mirror_prepare,
|
.prepare = mirror_prepare,
|
||||||
.abort = mirror_abort,
|
.abort = mirror_abort,
|
||||||
@ -112,7 +112,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
.pause = mirror_pause,
|
.pause = mirror_pause,
|
||||||
.complete = mirror_complete,
|
.complete = mirror_complete,
|
||||||
.cancel = commit_active_cancel,
|
.cancel = commit_active_cancel,
|
||||||
@@ -1733,7 +1749,10 @@ static BlockJob *mirror_start_job(
|
@@ -1714,7 +1730,10 @@ static BlockJob *mirror_start_job(
|
||||||
BlockCompletionFunc *cb,
|
BlockCompletionFunc *cb,
|
||||||
void *opaque,
|
void *opaque,
|
||||||
const BlockJobDriver *driver,
|
const BlockJobDriver *driver,
|
||||||
@ -124,7 +124,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
bool auto_complete, const char *filter_node_name,
|
bool auto_complete, const char *filter_node_name,
|
||||||
bool is_mirror, MirrorCopyMode copy_mode,
|
bool is_mirror, MirrorCopyMode copy_mode,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
@@ -1747,10 +1766,39 @@ static BlockJob *mirror_start_job(
|
@@ -1728,10 +1747,39 @@ static BlockJob *mirror_start_job(
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
assert(is_power_of_2(granularity));
|
assert(is_power_of_2(granularity));
|
||||||
|
|
||||||
if (buf_size < 0) {
|
if (buf_size < 0) {
|
||||||
@@ -1890,7 +1938,9 @@ static BlockJob *mirror_start_job(
|
@@ -1871,7 +1919,9 @@ static BlockJob *mirror_start_job(
|
||||||
s->replaces = g_strdup(replaces);
|
s->replaces = g_strdup(replaces);
|
||||||
s->on_source_error = on_source_error;
|
s->on_source_error = on_source_error;
|
||||||
s->on_target_error = on_target_error;
|
s->on_target_error = on_target_error;
|
||||||
@ -177,7 +177,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
s->backing_mode = backing_mode;
|
s->backing_mode = backing_mode;
|
||||||
s->zero_target = zero_target;
|
s->zero_target = zero_target;
|
||||||
qatomic_set(&s->copy_mode, copy_mode);
|
qatomic_set(&s->copy_mode, copy_mode);
|
||||||
@@ -1916,6 +1966,18 @@ static BlockJob *mirror_start_job(
|
@@ -1897,6 +1947,18 @@ static BlockJob *mirror_start_job(
|
||||||
*/
|
*/
|
||||||
bdrv_disable_dirty_bitmap(s->dirty_bitmap);
|
bdrv_disable_dirty_bitmap(s->dirty_bitmap);
|
||||||
|
|
||||||
@ -193,10 +193,10 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
bdrv_graph_wrlock(bs);
|
bdrv_graph_wrlock();
|
||||||
ret = block_job_add_bdrv(&s->common, "source", bs, 0,
|
ret = block_job_add_bdrv(&s->common, "source", bs, 0,
|
||||||
BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE |
|
BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE |
|
||||||
@@ -1998,6 +2060,9 @@ fail:
|
@@ -1979,6 +2041,9 @@ fail:
|
||||||
if (s->dirty_bitmap) {
|
if (s->dirty_bitmap) {
|
||||||
bdrv_release_dirty_bitmap(s->dirty_bitmap);
|
bdrv_release_dirty_bitmap(s->dirty_bitmap);
|
||||||
}
|
}
|
||||||
@ -206,7 +206,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
job_early_fail(&s->common.job);
|
job_early_fail(&s->common.job);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2020,35 +2085,28 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
@@ -2001,35 +2066,28 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
||||||
BlockDriverState *target, const char *replaces,
|
BlockDriverState *target, const char *replaces,
|
||||||
int creation_flags, int64_t speed,
|
int creation_flags, int64_t speed,
|
||||||
uint32_t granularity, int64_t buf_size,
|
uint32_t granularity, int64_t buf_size,
|
||||||
@ -247,7 +247,7 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
|
BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
|
||||||
@@ -2075,7 +2133,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
|
@@ -2056,7 +2114,8 @@ BlockJob *commit_active_start(const char *job_id, BlockDriverState *bs,
|
||||||
job_id, bs, creation_flags, base, NULL, speed, 0, 0,
|
job_id, bs, creation_flags, base, NULL, speed, 0, 0,
|
||||||
MIRROR_LEAVE_BACKING_CHAIN, false,
|
MIRROR_LEAVE_BACKING_CHAIN, false,
|
||||||
on_error, on_error, true, cb, opaque,
|
on_error, on_error, true, cb, opaque,
|
||||||
@ -258,10 +258,10 @@ index abbddb39e4..ed14c8b498 100644
|
|||||||
errp);
|
errp);
|
||||||
if (!job) {
|
if (!job) {
|
||||||
diff --git a/blockdev.c b/blockdev.c
|
diff --git a/blockdev.c b/blockdev.c
|
||||||
index c91f49e7b6..8c8e8b604a 100644
|
index 057601dcf0..8682814a7a 100644
|
||||||
--- a/blockdev.c
|
--- a/blockdev.c
|
||||||
+++ b/blockdev.c
|
+++ b/blockdev.c
|
||||||
@@ -2903,6 +2903,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
@@ -2776,6 +2776,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
||||||
BlockDriverState *target,
|
BlockDriverState *target,
|
||||||
const char *replaces,
|
const char *replaces,
|
||||||
enum MirrorSyncMode sync,
|
enum MirrorSyncMode sync,
|
||||||
@ -271,7 +271,7 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
BlockMirrorBackingMode backing_mode,
|
BlockMirrorBackingMode backing_mode,
|
||||||
bool zero_target,
|
bool zero_target,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
@@ -2921,6 +2924,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
@@ -2794,6 +2797,7 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
||||||
{
|
{
|
||||||
BlockDriverState *unfiltered_bs;
|
BlockDriverState *unfiltered_bs;
|
||||||
int job_flags = JOB_DEFAULT;
|
int job_flags = JOB_DEFAULT;
|
||||||
@ -279,7 +279,7 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
@@ -2975,6 +2979,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
@@ -2848,6 +2852,29 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
||||||
sync = MIRROR_SYNC_MODE_FULL;
|
sync = MIRROR_SYNC_MODE_FULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
if (!replaces) {
|
if (!replaces) {
|
||||||
/* We want to mirror from @bs, but keep implicit filters on top */
|
/* We want to mirror from @bs, but keep implicit filters on top */
|
||||||
unfiltered_bs = bdrv_skip_implicit_filters(bs);
|
unfiltered_bs = bdrv_skip_implicit_filters(bs);
|
||||||
@@ -3030,8 +3057,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
@@ -2889,8 +2916,8 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
||||||
* and will allow to check whether the node still exist at mirror completion
|
* and will allow to check whether the node still exist at mirror completion
|
||||||
*/
|
*/
|
||||||
mirror_start(job_id, bs, target,
|
mirror_start(job_id, bs, target,
|
||||||
@ -320,7 +320,7 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
on_source_error, on_target_error, unmap, filter_node_name,
|
on_source_error, on_target_error, unmap, filter_node_name,
|
||||||
copy_mode, errp);
|
copy_mode, errp);
|
||||||
}
|
}
|
||||||
@@ -3189,6 +3216,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
|
@@ -3034,6 +3061,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
|
||||||
|
|
||||||
blockdev_mirror_common(arg->job_id, bs, target_bs,
|
blockdev_mirror_common(arg->job_id, bs, target_bs,
|
||||||
arg->replaces, arg->sync,
|
arg->replaces, arg->sync,
|
||||||
@ -329,7 +329,7 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
backing_mode, zero_target,
|
backing_mode, zero_target,
|
||||||
arg->has_speed, arg->speed,
|
arg->has_speed, arg->speed,
|
||||||
arg->has_granularity, arg->granularity,
|
arg->has_granularity, arg->granularity,
|
||||||
@@ -3210,6 +3239,8 @@ void qmp_blockdev_mirror(const char *job_id,
|
@@ -3053,6 +3082,8 @@ void qmp_blockdev_mirror(const char *job_id,
|
||||||
const char *device, const char *target,
|
const char *device, const char *target,
|
||||||
const char *replaces,
|
const char *replaces,
|
||||||
MirrorSyncMode sync,
|
MirrorSyncMode sync,
|
||||||
@ -338,7 +338,7 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_granularity, uint32_t granularity,
|
bool has_granularity, uint32_t granularity,
|
||||||
bool has_buf_size, int64_t buf_size,
|
bool has_buf_size, int64_t buf_size,
|
||||||
@@ -3258,7 +3289,8 @@ void qmp_blockdev_mirror(const char *job_id,
|
@@ -3093,7 +3124,8 @@ void qmp_blockdev_mirror(const char *job_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
blockdev_mirror_common(job_id, bs, target_bs,
|
blockdev_mirror_common(job_id, bs, target_bs,
|
||||||
@ -349,10 +349,10 @@ index c91f49e7b6..8c8e8b604a 100644
|
|||||||
has_granularity, granularity,
|
has_granularity, granularity,
|
||||||
has_buf_size, buf_size,
|
has_buf_size, buf_size,
|
||||||
diff --git a/include/block/block_int-global-state.h b/include/block/block_int-global-state.h
|
diff --git a/include/block/block_int-global-state.h b/include/block/block_int-global-state.h
|
||||||
index ef31c58bb3..57265a617a 100644
|
index d2201e27f4..cc1387ae02 100644
|
||||||
--- a/include/block/block_int-global-state.h
|
--- a/include/block/block_int-global-state.h
|
||||||
+++ b/include/block/block_int-global-state.h
|
+++ b/include/block/block_int-global-state.h
|
||||||
@@ -152,7 +152,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
@@ -158,7 +158,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
||||||
BlockDriverState *target, const char *replaces,
|
BlockDriverState *target, const char *replaces,
|
||||||
int creation_flags, int64_t speed,
|
int creation_flags, int64_t speed,
|
||||||
uint32_t granularity, int64_t buf_size,
|
uint32_t granularity, int64_t buf_size,
|
||||||
@ -364,10 +364,10 @@ index ef31c58bb3..57265a617a 100644
|
|||||||
BlockdevOnError on_source_error,
|
BlockdevOnError on_source_error,
|
||||||
BlockdevOnError on_target_error,
|
BlockdevOnError on_target_error,
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index ca390c5700..8db0986e9e 100644
|
index 746d1694c2..45ab548dfe 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -2163,6 +2163,15 @@
|
@@ -2174,6 +2174,15 @@
|
||||||
# destination (all the disk, only the sectors allocated in the
|
# destination (all the disk, only the sectors allocated in the
|
||||||
# topmost image, or only new I/O).
|
# topmost image, or only new I/O).
|
||||||
#
|
#
|
||||||
@ -383,7 +383,7 @@ index ca390c5700..8db0986e9e 100644
|
|||||||
# @granularity: granularity of the dirty bitmap, default is 64K if the
|
# @granularity: granularity of the dirty bitmap, default is 64K if the
|
||||||
# image format doesn't have clusters, 4K if the clusters are
|
# image format doesn't have clusters, 4K if the clusters are
|
||||||
# smaller than that, else the cluster size. Must be a power of 2
|
# smaller than that, else the cluster size. Must be a power of 2
|
||||||
@@ -2205,7 +2214,9 @@
|
@@ -2216,7 +2225,9 @@
|
||||||
{ 'struct': 'DriveMirror',
|
{ 'struct': 'DriveMirror',
|
||||||
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
||||||
'*format': 'str', '*node-name': 'str', '*replaces': 'str',
|
'*format': 'str', '*node-name': 'str', '*replaces': 'str',
|
||||||
@ -394,7 +394,7 @@ index ca390c5700..8db0986e9e 100644
|
|||||||
'*speed': 'int', '*granularity': 'uint32',
|
'*speed': 'int', '*granularity': 'uint32',
|
||||||
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
|
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
|
||||||
'*on-target-error': 'BlockdevOnError',
|
'*on-target-error': 'BlockdevOnError',
|
||||||
@@ -2489,6 +2500,15 @@
|
@@ -2496,6 +2507,15 @@
|
||||||
# destination (all the disk, only the sectors allocated in the
|
# destination (all the disk, only the sectors allocated in the
|
||||||
# topmost image, or only new I/O).
|
# topmost image, or only new I/O).
|
||||||
#
|
#
|
||||||
@ -410,7 +410,7 @@ index ca390c5700..8db0986e9e 100644
|
|||||||
# @granularity: granularity of the dirty bitmap, default is 64K if the
|
# @granularity: granularity of the dirty bitmap, default is 64K if the
|
||||||
# image format doesn't have clusters, 4K if the clusters are
|
# image format doesn't have clusters, 4K if the clusters are
|
||||||
# smaller than that, else the cluster size. Must be a power of 2
|
# smaller than that, else the cluster size. Must be a power of 2
|
||||||
@@ -2539,7 +2559,8 @@
|
@@ -2544,7 +2564,8 @@
|
||||||
{ 'command': 'blockdev-mirror',
|
{ 'command': 'blockdev-mirror',
|
||||||
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
||||||
'*replaces': 'str',
|
'*replaces': 'str',
|
||||||
@ -421,12 +421,12 @@ index ca390c5700..8db0986e9e 100644
|
|||||||
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
|
'*buf-size': 'int', '*on-source-error': 'BlockdevOnError',
|
||||||
'*on-target-error': 'BlockdevOnError',
|
'*on-target-error': 'BlockdevOnError',
|
||||||
diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
|
diff --git a/tests/unit/test-block-iothread.c b/tests/unit/test-block-iothread.c
|
||||||
index 9b15d2768c..54acd47188 100644
|
index 3766d5de6b..afa44cbd34 100644
|
||||||
--- a/tests/unit/test-block-iothread.c
|
--- a/tests/unit/test-block-iothread.c
|
||||||
+++ b/tests/unit/test-block-iothread.c
|
+++ b/tests/unit/test-block-iothread.c
|
||||||
@@ -766,8 +766,8 @@ static void test_propagate_mirror(void)
|
@@ -755,8 +755,8 @@ static void test_propagate_mirror(void)
|
||||||
|
|
||||||
/* Start a mirror job */
|
/* Start a mirror job */
|
||||||
aio_context_acquire(main_ctx);
|
|
||||||
mirror_start("job0", src, target, NULL, JOB_DEFAULT, 0, 0, 0,
|
mirror_start("job0", src, target, NULL, JOB_DEFAULT, 0, 0, 0,
|
||||||
- MIRROR_SYNC_MODE_NONE, MIRROR_OPEN_BACKING_CHAIN, false,
|
- MIRROR_SYNC_MODE_NONE, MIRROR_OPEN_BACKING_CHAIN, false,
|
||||||
- BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
|
- BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
|
||||||
@ -434,4 +434,4 @@ index 9b15d2768c..54acd47188 100644
|
|||||||
+ false, BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
|
+ false, BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
|
||||||
false, "filter_node", MIRROR_COPY_MODE_BACKGROUND,
|
false, "filter_node", MIRROR_COPY_MODE_BACKGROUND,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
aio_context_release(main_ctx);
|
|
||||||
|
@ -24,10 +24,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/mirror.c b/block/mirror.c
|
diff --git a/block/mirror.c b/block/mirror.c
|
||||||
index ed14c8b498..beb98f2e07 100644
|
index 0c5c72df2e..37fee3fa25 100644
|
||||||
--- a/block/mirror.c
|
--- a/block/mirror.c
|
||||||
+++ b/block/mirror.c
|
+++ b/block/mirror.c
|
||||||
@@ -695,8 +695,6 @@ static int mirror_exit_common(Job *job)
|
@@ -693,8 +693,6 @@ static int mirror_exit_common(Job *job)
|
||||||
bdrv_unfreeze_backing_chain(mirror_top_bs, target_bs);
|
bdrv_unfreeze_backing_chain(mirror_top_bs, target_bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ index ed14c8b498..beb98f2e07 100644
|
|||||||
/* Make sure that the source BDS doesn't go away during bdrv_replace_node,
|
/* Make sure that the source BDS doesn't go away during bdrv_replace_node,
|
||||||
* before we can call bdrv_drained_end */
|
* before we can call bdrv_drained_end */
|
||||||
bdrv_ref(src);
|
bdrv_ref(src);
|
||||||
@@ -810,6 +808,18 @@ static int mirror_exit_common(Job *job)
|
@@ -800,6 +798,18 @@ static int mirror_exit_common(Job *job)
|
||||||
bdrv_drained_end(target_bs);
|
bdrv_drained_end(target_bs);
|
||||||
bdrv_unref(target_bs);
|
bdrv_unref(target_bs);
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ index ed14c8b498..beb98f2e07 100644
|
|||||||
bs_opaque->job = NULL;
|
bs_opaque->job = NULL;
|
||||||
|
|
||||||
bdrv_drained_end(src);
|
bdrv_drained_end(src);
|
||||||
@@ -1776,10 +1786,6 @@ static BlockJob *mirror_start_job(
|
@@ -1757,10 +1767,6 @@ static BlockJob *mirror_start_job(
|
||||||
" sync mode",
|
" sync mode",
|
||||||
MirrorSyncMode_str(sync_mode));
|
MirrorSyncMode_str(sync_mode));
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -66,7 +66,7 @@ index ed14c8b498..beb98f2e07 100644
|
|||||||
}
|
}
|
||||||
} else if (bitmap) {
|
} else if (bitmap) {
|
||||||
error_setg(errp,
|
error_setg(errp,
|
||||||
@@ -1796,6 +1802,12 @@ static BlockJob *mirror_start_job(
|
@@ -1777,6 +1783,12 @@ static BlockJob *mirror_start_job(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
granularity = bdrv_dirty_bitmap_granularity(bitmap);
|
granularity = bdrv_dirty_bitmap_granularity(bitmap);
|
||||||
|
@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 3 insertions(+)
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
diff --git a/blockdev.c b/blockdev.c
|
diff --git a/blockdev.c b/blockdev.c
|
||||||
index 8c8e8b604a..cdfe7b33b1 100644
|
index 8682814a7a..5b75a085ee 100644
|
||||||
--- a/blockdev.c
|
--- a/blockdev.c
|
||||||
+++ b/blockdev.c
|
+++ b/blockdev.c
|
||||||
@@ -3000,6 +3000,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
@@ -2873,6 +2873,9 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
||||||
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_ALLOW_RO, errp)) {
|
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_ALLOW_RO, errp)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 4 insertions(+), 7 deletions(-)
|
1 file changed, 4 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/mirror.c b/block/mirror.c
|
diff --git a/block/mirror.c b/block/mirror.c
|
||||||
index beb98f2e07..1aa75e7384 100644
|
index 37fee3fa25..6b3cce1007 100644
|
||||||
--- a/block/mirror.c
|
--- a/block/mirror.c
|
||||||
+++ b/block/mirror.c
|
+++ b/block/mirror.c
|
||||||
@@ -814,8 +814,8 @@ static int mirror_exit_common(Job *job)
|
@@ -804,8 +804,8 @@ static int mirror_exit_common(Job *job)
|
||||||
job->ret == 0 && ret == 0)) {
|
job->ret == 0 && ret == 0)) {
|
||||||
/* Success; synchronize copy back to sync. */
|
/* Success; synchronize copy back to sync. */
|
||||||
bdrv_clear_dirty_bitmap(s->sync_bitmap, NULL);
|
bdrv_clear_dirty_bitmap(s->sync_bitmap, NULL);
|
||||||
@ -30,7 +30,7 @@ index beb98f2e07..1aa75e7384 100644
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
bdrv_release_dirty_bitmap(s->dirty_bitmap);
|
bdrv_release_dirty_bitmap(s->dirty_bitmap);
|
||||||
@@ -1983,11 +1983,8 @@ static BlockJob *mirror_start_job(
|
@@ -1964,11 +1964,8 @@ static BlockJob *mirror_start_job(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->sync_mode == MIRROR_SYNC_MODE_BITMAP) {
|
if (s->sync_mode == MIRROR_SYNC_MODE_BITMAP) {
|
||||||
@ -43,4 +43,4 @@ index beb98f2e07..1aa75e7384 100644
|
|||||||
+ NULL, true);
|
+ NULL, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_graph_wrlock(bs);
|
bdrv_graph_wrlock();
|
||||||
|
@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
3 files changed, 70 insertions(+), 59 deletions(-)
|
3 files changed, 70 insertions(+), 59 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/mirror.c b/block/mirror.c
|
diff --git a/block/mirror.c b/block/mirror.c
|
||||||
index 1aa75e7384..a02efbfbbd 100644
|
index 6b3cce1007..2f1223852b 100644
|
||||||
--- a/block/mirror.c
|
--- a/block/mirror.c
|
||||||
+++ b/block/mirror.c
|
+++ b/block/mirror.c
|
||||||
@@ -1776,31 +1776,13 @@ static BlockJob *mirror_start_job(
|
@@ -1757,31 +1757,13 @@ static BlockJob *mirror_start_job(
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
|
||||||
@ -62,10 +62,10 @@ index 1aa75e7384..a02efbfbbd 100644
|
|||||||
|
|
||||||
if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) {
|
if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) {
|
||||||
diff --git a/blockdev.c b/blockdev.c
|
diff --git a/blockdev.c b/blockdev.c
|
||||||
index cdfe7b33b1..38a40e3e32 100644
|
index 5b75a085ee..d27d8c38ec 100644
|
||||||
--- a/blockdev.c
|
--- a/blockdev.c
|
||||||
+++ b/blockdev.c
|
+++ b/blockdev.c
|
||||||
@@ -2979,7 +2979,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
@@ -2852,7 +2852,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
||||||
sync = MIRROR_SYNC_MODE_FULL;
|
sync = MIRROR_SYNC_MODE_FULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ index a239945e8d..589c9524f8 100644
|
|||||||
monitor_qmp_caps_reset(mon);
|
monitor_qmp_caps_reset(mon);
|
||||||
data = qmp_greeting(mon);
|
data = qmp_greeting(mon);
|
||||||
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
|
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
|
||||||
index 176b549473..790bb7d1da 100644
|
index f3488afeef..2624eb3470 100644
|
||||||
--- a/qapi/qmp-dispatch.c
|
--- a/qapi/qmp-dispatch.c
|
||||||
+++ b/qapi/qmp-dispatch.c
|
+++ b/qapi/qmp-dispatch.c
|
||||||
@@ -117,16 +117,28 @@ typedef struct QmpDispatchBH {
|
@@ -117,16 +117,28 @@ typedef struct QmpDispatchBH {
|
||||||
@ -180,7 +180,7 @@ index 176b549473..790bb7d1da 100644
|
|||||||
aio_co_wake(data->co);
|
aio_co_wake(data->co);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,6 +265,7 @@ QDict *coroutine_mixed_fn qmp_dispatch(const QmpCommandList *cmds, QObject *requ
|
@@ -250,6 +262,7 @@ QDict *coroutine_mixed_fn qmp_dispatch(const QmpCommandList *cmds, QObject *requ
|
||||||
.ret = &ret,
|
.ret = &ret,
|
||||||
.errp = &err,
|
.errp = &err,
|
||||||
.co = qemu_coroutine_self(),
|
.co = qemu_coroutine_self(),
|
||||||
|
@ -22,7 +22,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 12 deletions(-)
|
1 file changed, 2 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
|
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
|
||||||
index 32c70c9e99..984b6a3145 100644
|
index 2d0c607177..97e51733af 100644
|
||||||
--- a/hw/scsi/megasas.c
|
--- a/hw/scsi/megasas.c
|
||||||
+++ b/hw/scsi/megasas.c
|
+++ b/hw/scsi/megasas.c
|
||||||
@@ -1781,7 +1781,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
|
@@ -1781,7 +1781,7 @@ static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
|
||||||
|
@ -55,7 +55,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
diff --git a/hw/ide/core.c b/hw/ide/core.c
|
diff --git a/hw/ide/core.c b/hw/ide/core.c
|
||||||
index 8a0579bff4..254255f8dc 100644
|
index e8cb2dac92..3b21acf651 100644
|
||||||
--- a/hw/ide/core.c
|
--- a/hw/ide/core.c
|
||||||
+++ b/hw/ide/core.c
|
+++ b/hw/ide/core.c
|
||||||
@@ -456,7 +456,7 @@ static void ide_trim_bh_cb(void *opaque)
|
@@ -456,7 +456,7 @@ static void ide_trim_bh_cb(void *opaque)
|
||||||
|
@ -24,10 +24,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 6 deletions(-)
|
1 file changed, 2 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
||||||
index 1e178341de..d8694b338e 100644
|
index 53f804ac16..9b1b9f0412 100644
|
||||||
--- a/hw/i386/acpi-build.c
|
--- a/hw/i386/acpi-build.c
|
||||||
+++ b/hw/i386/acpi-build.c
|
+++ b/hw/i386/acpi-build.c
|
||||||
@@ -357,13 +357,9 @@ Aml *aml_pci_device_dsm(void)
|
@@ -347,13 +347,9 @@ Aml *aml_pci_device_dsm(void)
|
||||||
{
|
{
|
||||||
Aml *params = aml_local(0);
|
Aml *params = aml_local(0);
|
||||||
Aml *pkg = aml_package(2);
|
Aml *pkg = aml_package(2);
|
@ -1,48 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Fiona Ebner <f.ebner@proxmox.com>
|
|
||||||
Date: Fri, 28 Jul 2023 10:47:48 +0200
|
|
||||||
Subject: [PATCH] migration/block-dirty-bitmap: fix loading bitmap when there
|
|
||||||
is an iothread
|
|
||||||
|
|
||||||
The bdrv_create_dirty_bitmap() function (which is also called by
|
|
||||||
bdrv_dirty_bitmap_create_successor()) uses bdrv_getlength(bs). This is
|
|
||||||
a wrapper around a coroutine, and thus uses bdrv_poll_co(). Polling
|
|
||||||
tries to release the AioContext which will trigger an assert() if it
|
|
||||||
hasn't been acquired before.
|
|
||||||
|
|
||||||
The issue does not happen for migration, because there we are in a
|
|
||||||
coroutine already, so the wrapper will just call bdrv_co_getlength()
|
|
||||||
directly without polling.
|
|
||||||
|
|
||||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
||||||
---
|
|
||||||
migration/block-dirty-bitmap.c | 6 ++++++
|
|
||||||
1 file changed, 6 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
|
|
||||||
index 24347ab0f7..0070b13b6f 100644
|
|
||||||
--- a/migration/block-dirty-bitmap.c
|
|
||||||
+++ b/migration/block-dirty-bitmap.c
|
|
||||||
@@ -809,8 +809,11 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
|
|
||||||
"destination", bdrv_dirty_bitmap_name(s->bitmap));
|
|
||||||
return -EINVAL;
|
|
||||||
} else {
|
|
||||||
+ AioContext *ctx = bdrv_get_aio_context(s->bs);
|
|
||||||
+ aio_context_acquire(ctx);
|
|
||||||
s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity,
|
|
||||||
s->bitmap_name, &local_err);
|
|
||||||
+ aio_context_release(ctx);
|
|
||||||
if (!s->bitmap) {
|
|
||||||
error_report_err(local_err);
|
|
||||||
return -EINVAL;
|
|
||||||
@@ -837,7 +840,10 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
|
|
||||||
|
|
||||||
bdrv_disable_dirty_bitmap(s->bitmap);
|
|
||||||
if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) {
|
|
||||||
+ AioContext *ctx = bdrv_get_aio_context(s->bs);
|
|
||||||
+ aio_context_acquire(ctx);
|
|
||||||
bdrv_dirty_bitmap_create_successor(s->bitmap, &local_err);
|
|
||||||
+ aio_context_release(ctx);
|
|
||||||
if (local_err) {
|
|
||||||
error_report_err(local_err);
|
|
||||||
return -EINVAL;
|
|
@ -1,119 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Fiona Ebner <f.ebner@proxmox.com>
|
|
||||||
Date: Mon, 18 Dec 2023 11:13:40 +0100
|
|
||||||
Subject: [PATCH] qemu_init: increase NOFILE soft limit on POSIX
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
In many configurations, e.g. multiple vNICs with multiple queues or
|
|
||||||
with many Ceph OSDs, the default soft limit of 1024 is not enough.
|
|
||||||
QEMU is supposed to work fine with file descriptors >= 1024 and does
|
|
||||||
not use select() on POSIX. Bump the soft limit to the allowed hard
|
|
||||||
limit to avoid issues with the aforementioned configurations.
|
|
||||||
|
|
||||||
Of course the limit could be raised from the outside, but the man page
|
|
||||||
of systemd.exec states about 'LimitNOFILE=':
|
|
||||||
|
|
||||||
> Don't use.
|
|
||||||
> [...]
|
|
||||||
> Typically applications should increase their soft limit to the hard
|
|
||||||
> limit on their own, if they are OK with working with file
|
|
||||||
> descriptors above 1023,
|
|
||||||
|
|
||||||
If the soft limit is already the same as the hard limit, avoid the
|
|
||||||
superfluous setrlimit call. This can avoid a warning with a strict
|
|
||||||
seccomp filter blocking setrlimit if NOFILE was already raised before
|
|
||||||
executing QEMU.
|
|
||||||
|
|
||||||
Buglink: https://bugzilla.proxmox.com/show_bug.cgi?id=4507
|
|
||||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
||||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
||||||
---
|
|
||||||
include/sysemu/os-posix.h | 1 +
|
|
||||||
include/sysemu/os-win32.h | 5 +++++
|
|
||||||
os-posix.c | 22 ++++++++++++++++++++++
|
|
||||||
system/vl.c | 2 ++
|
|
||||||
4 files changed, 30 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/include/sysemu/os-posix.h b/include/sysemu/os-posix.h
|
|
||||||
index dff32ae185..b881ac6c6f 100644
|
|
||||||
--- a/include/sysemu/os-posix.h
|
|
||||||
+++ b/include/sysemu/os-posix.h
|
|
||||||
@@ -51,6 +51,7 @@ bool is_daemonized(void);
|
|
||||||
void os_daemonize(void);
|
|
||||||
bool os_set_runas(const char *user_id);
|
|
||||||
void os_set_chroot(const char *path);
|
|
||||||
+void os_setup_limits(void);
|
|
||||||
void os_setup_post(void);
|
|
||||||
int os_mlock(void);
|
|
||||||
|
|
||||||
diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h
|
|
||||||
index 1047d260cb..106f155037 100644
|
|
||||||
--- a/include/sysemu/os-win32.h
|
|
||||||
+++ b/include/sysemu/os-win32.h
|
|
||||||
@@ -128,6 +128,11 @@ static inline int os_mlock(void)
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
+void os_setup_limits(void)
|
|
||||||
+{
|
|
||||||
+ return;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#define fsync _commit
|
|
||||||
|
|
||||||
#if !defined(lseek)
|
|
||||||
diff --git a/os-posix.c b/os-posix.c
|
|
||||||
index 52ef6990ff..a4284e2c07 100644
|
|
||||||
--- a/os-posix.c
|
|
||||||
+++ b/os-posix.c
|
|
||||||
@@ -24,6 +24,7 @@
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
|
||||||
+#include <sys/resource.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
@@ -256,6 +257,27 @@ void os_daemonize(void)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+void os_setup_limits(void)
|
|
||||||
+{
|
|
||||||
+ struct rlimit nofile;
|
|
||||||
+
|
|
||||||
+ if (getrlimit(RLIMIT_NOFILE, &nofile) < 0) {
|
|
||||||
+ warn_report("unable to query NOFILE limit: %s", strerror(errno));
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (nofile.rlim_cur == nofile.rlim_max) {
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ nofile.rlim_cur = nofile.rlim_max;
|
|
||||||
+
|
|
||||||
+ if (setrlimit(RLIMIT_NOFILE, &nofile) < 0) {
|
|
||||||
+ warn_report("unable to set NOFILE limit: %s", strerror(errno));
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void os_setup_post(void)
|
|
||||||
{
|
|
||||||
int fd = 0;
|
|
||||||
diff --git a/system/vl.c b/system/vl.c
|
|
||||||
index e18fa3ce46..d2a3b3f457 100644
|
|
||||||
--- a/system/vl.c
|
|
||||||
+++ b/system/vl.c
|
|
||||||
@@ -2782,6 +2782,8 @@ void qemu_init(int argc, char **argv)
|
|
||||||
error_init(argv[0]);
|
|
||||||
qemu_init_exec_dir(argv[0]);
|
|
||||||
|
|
||||||
+ os_setup_limits();
|
|
||||||
+
|
|
||||||
qemu_init_arch_modules();
|
|
||||||
|
|
||||||
qemu_init_subsystems();
|
|
@ -1,79 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kevin Wolf <kwolf@redhat.com>
|
|
||||||
Date: Wed, 13 Mar 2024 16:30:00 +0100
|
|
||||||
Subject: [PATCH] mirror: Don't call job_pause_point() under graph lock
|
|
||||||
|
|
||||||
Calling job_pause_point() while holding the graph reader lock
|
|
||||||
potentially results in a deadlock: bdrv_graph_wrlock() first drains
|
|
||||||
everything, including the mirror job, which pauses it. The job is only
|
|
||||||
unpaused at the end of the drain section, which is when the graph writer
|
|
||||||
lock has been successfully taken. However, if the job happens to be
|
|
||||||
paused at a pause point where it still holds the reader lock, the writer
|
|
||||||
lock can't be taken as long as the job is still paused.
|
|
||||||
|
|
||||||
Mark job_pause_point() as GRAPH_UNLOCKED and fix mirror accordingly.
|
|
||||||
|
|
||||||
Cc: qemu-stable@nongnu.org
|
|
||||||
Buglink: https://issues.redhat.com/browse/RHEL-28125
|
|
||||||
Fixes: 004915a96a7a ("block: Protect bs->backing with graph_lock")
|
|
||||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
||||||
Message-ID: <20240313153000.33121-1-kwolf@redhat.com>
|
|
||||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
||||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
||||||
(cherry picked from commit ae5a40e8581185654a667fbbf7e4adbc2a2a3e45)
|
|
||||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
||||||
---
|
|
||||||
block/mirror.c | 10 ++++++----
|
|
||||||
include/qemu/job.h | 2 +-
|
|
||||||
2 files changed, 7 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/block/mirror.c b/block/mirror.c
|
|
||||||
index cd9d3ad4a8..abbddb39e4 100644
|
|
||||||
--- a/block/mirror.c
|
|
||||||
+++ b/block/mirror.c
|
|
||||||
@@ -479,9 +479,9 @@ static unsigned mirror_perform(MirrorBlockJob *s, int64_t offset,
|
|
||||||
return bytes_handled;
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void coroutine_fn GRAPH_RDLOCK mirror_iteration(MirrorBlockJob *s)
|
|
||||||
+static void coroutine_fn GRAPH_UNLOCKED mirror_iteration(MirrorBlockJob *s)
|
|
||||||
{
|
|
||||||
- BlockDriverState *source = s->mirror_top_bs->backing->bs;
|
|
||||||
+ BlockDriverState *source;
|
|
||||||
MirrorOp *pseudo_op;
|
|
||||||
int64_t offset;
|
|
||||||
/* At least the first dirty chunk is mirrored in one iteration. */
|
|
||||||
@@ -489,6 +489,10 @@ static void coroutine_fn GRAPH_RDLOCK mirror_iteration(MirrorBlockJob *s)
|
|
||||||
bool write_zeroes_ok = bdrv_can_write_zeroes_with_unmap(blk_bs(s->target));
|
|
||||||
int max_io_bytes = MAX(s->buf_size / MAX_IN_FLIGHT, MAX_IO_BYTES);
|
|
||||||
|
|
||||||
+ bdrv_graph_co_rdlock();
|
|
||||||
+ source = s->mirror_top_bs->backing->bs;
|
|
||||||
+ bdrv_graph_co_rdunlock();
|
|
||||||
+
|
|
||||||
bdrv_dirty_bitmap_lock(s->dirty_bitmap);
|
|
||||||
offset = bdrv_dirty_iter_next(s->dbi);
|
|
||||||
if (offset < 0) {
|
|
||||||
@@ -1078,9 +1082,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
|
||||||
mirror_wait_for_free_in_flight_slot(s);
|
|
||||||
continue;
|
|
||||||
} else if (cnt != 0) {
|
|
||||||
- bdrv_graph_co_rdlock();
|
|
||||||
mirror_iteration(s);
|
|
||||||
- bdrv_graph_co_rdunlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/include/qemu/job.h b/include/qemu/job.h
|
|
||||||
index e502787dd8..b4bc2e174b 100644
|
|
||||||
--- a/include/qemu/job.h
|
|
||||||
+++ b/include/qemu/job.h
|
|
||||||
@@ -503,7 +503,7 @@ void job_enter(Job *job);
|
|
||||||
*
|
|
||||||
* Called with job_mutex *not* held.
|
|
||||||
*/
|
|
||||||
-void coroutine_fn job_pause_point(Job *job);
|
|
||||||
+void coroutine_fn GRAPH_UNLOCKED job_pause_point(Job *job);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @job: The job that calls the function.
|
|
@ -14,7 +14,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||||
index b862406c71..bc09aefe3b 100644
|
index 35684f7e21..43bc0bd520 100644
|
||||||
--- a/block/file-posix.c
|
--- a/block/file-posix.c
|
||||||
+++ b/block/file-posix.c
|
+++ b/block/file-posix.c
|
||||||
@@ -563,7 +563,7 @@ static QemuOptsList raw_runtime_opts = {
|
@@ -563,7 +563,7 @@ static QemuOptsList raw_runtime_opts = {
|
||||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
diff --git a/include/net/net.h b/include/net/net.h
|
diff --git a/include/net/net.h b/include/net/net.h
|
||||||
index ffbd2c8d56..e857c75f4c 100644
|
index b1f9b35fcc..096c0d52e4 100644
|
||||||
--- a/include/net/net.h
|
--- a/include/net/net.h
|
||||||
+++ b/include/net/net.h
|
+++ b/include/net/net.h
|
||||||
@@ -263,8 +263,8 @@ void netdev_add(QemuOpts *opts, Error **errp);
|
@@ -317,8 +317,8 @@ void netdev_add(QemuOpts *opts, Error **errp);
|
||||||
int net_hub_id_for_client(NetClientState *nc, int *id);
|
int net_hub_id_for_client(NetClientState *nc, int *id);
|
||||||
NetClientState *net_hub_port_find(int hub_id);
|
NetClientState *net_hub_port_find(int hub_id);
|
||||||
|
|
||||||
|
@ -10,10 +10,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||||
index 705d925e6c..ba269e5f1e 100644
|
index 6b05738079..d82869900a 100644
|
||||||
--- a/target/i386/cpu.h
|
--- a/target/i386/cpu.h
|
||||||
+++ b/target/i386/cpu.h
|
+++ b/target/i386/cpu.h
|
||||||
@@ -2281,9 +2281,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
@@ -2291,9 +2291,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
||||||
#define CPU_RESOLVING_TYPE TYPE_X86_CPU
|
#define CPU_RESOLVING_TYPE TYPE_X86_CPU
|
||||||
|
|
||||||
#ifdef TARGET_X86_64
|
#ifdef TARGET_X86_64
|
||||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
diff --git a/ui/spice-core.c b/ui/spice-core.c
|
diff --git a/ui/spice-core.c b/ui/spice-core.c
|
||||||
index db21db2c94..0eb138cf43 100644
|
index 15be640286..ea20e6153c 100644
|
||||||
--- a/ui/spice-core.c
|
--- a/ui/spice-core.c
|
||||||
+++ b/ui/spice-core.c
|
+++ b/ui/spice-core.c
|
||||||
@@ -691,32 +691,35 @@ static void qemu_spice_init(void)
|
@@ -690,32 +690,35 @@ static void qemu_spice_init(void)
|
||||||
|
|
||||||
if (tls_port) {
|
if (tls_port) {
|
||||||
x509_dir = qemu_opt_get(opts, "x509-dir");
|
x509_dir = qemu_opt_get(opts, "x509-dir");
|
||||||
|
@ -9,10 +9,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/qemu-img.c b/qemu-img.c
|
diff --git a/qemu-img.c b/qemu-img.c
|
||||||
index 5a77f67719..de51233825 100644
|
index 7668f86769..2575e97b43 100644
|
||||||
--- a/qemu-img.c
|
--- a/qemu-img.c
|
||||||
+++ b/qemu-img.c
|
+++ b/qemu-img.c
|
||||||
@@ -3079,7 +3079,8 @@ static int img_info(int argc, char **argv)
|
@@ -3075,7 +3075,8 @@ static int img_info(int argc, char **argv)
|
||||||
list = collect_image_info_list(image_opts, filename, fmt, chain,
|
list = collect_image_info_list(image_opts, filename, fmt, chain,
|
||||||
force_share);
|
force_share);
|
||||||
if (!list) {
|
if (!list) {
|
||||||
|
@ -38,10 +38,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
2 files changed, 133 insertions(+), 73 deletions(-)
|
2 files changed, 133 insertions(+), 73 deletions(-)
|
||||||
|
|
||||||
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
||||||
index 068692d13e..73e0bb1d2c 100644
|
index c9dd70a892..048788b23d 100644
|
||||||
--- a/qemu-img-cmds.hx
|
--- a/qemu-img-cmds.hx
|
||||||
+++ b/qemu-img-cmds.hx
|
+++ b/qemu-img-cmds.hx
|
||||||
@@ -58,9 +58,9 @@ SRST
|
@@ -60,9 +60,9 @@ SRST
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
DEF("dd", img_dd,
|
DEF("dd", img_dd,
|
||||||
@ -54,10 +54,10 @@ index 068692d13e..73e0bb1d2c 100644
|
|||||||
|
|
||||||
DEF("info", img_info,
|
DEF("info", img_info,
|
||||||
diff --git a/qemu-img.c b/qemu-img.c
|
diff --git a/qemu-img.c b/qemu-img.c
|
||||||
index de51233825..ad770f6570 100644
|
index 2575e97b43..8ec68b346f 100644
|
||||||
--- a/qemu-img.c
|
--- a/qemu-img.c
|
||||||
+++ b/qemu-img.c
|
+++ b/qemu-img.c
|
||||||
@@ -4997,10 +4997,12 @@ static int img_bitmap(int argc, char **argv)
|
@@ -4993,10 +4993,12 @@ static int img_bitmap(int argc, char **argv)
|
||||||
#define C_IF 04
|
#define C_IF 04
|
||||||
#define C_OF 010
|
#define C_OF 010
|
||||||
#define C_SKIP 020
|
#define C_SKIP 020
|
||||||
@ -70,7 +70,7 @@ index de51233825..ad770f6570 100644
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct DdIo {
|
struct DdIo {
|
||||||
@@ -5076,6 +5078,19 @@ static int img_dd_skip(const char *arg,
|
@@ -5072,6 +5074,19 @@ static int img_dd_skip(const char *arg,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ index de51233825..ad770f6570 100644
|
|||||||
static int img_dd(int argc, char **argv)
|
static int img_dd(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -5116,6 +5131,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5112,6 +5127,7 @@ static int img_dd(int argc, char **argv)
|
||||||
{ "if", img_dd_if, C_IF },
|
{ "if", img_dd_if, C_IF },
|
||||||
{ "of", img_dd_of, C_OF },
|
{ "of", img_dd_of, C_OF },
|
||||||
{ "skip", img_dd_skip, C_SKIP },
|
{ "skip", img_dd_skip, C_SKIP },
|
||||||
@ -98,7 +98,7 @@ index de51233825..ad770f6570 100644
|
|||||||
{ NULL, NULL, 0 }
|
{ NULL, NULL, 0 }
|
||||||
};
|
};
|
||||||
const struct option long_options[] = {
|
const struct option long_options[] = {
|
||||||
@@ -5191,91 +5207,112 @@ static int img_dd(int argc, char **argv)
|
@@ -5187,91 +5203,112 @@ static int img_dd(int argc, char **argv)
|
||||||
arg = NULL;
|
arg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ index de51233825..ad770f6570 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
|
if (dd.flags & C_SKIP && (in.offset > INT64_MAX / in.bsz ||
|
||||||
@@ -5292,20 +5329,43 @@ static int img_dd(int argc, char **argv)
|
@@ -5288,20 +5325,43 @@ static int img_dd(int argc, char **argv)
|
||||||
in.buf = g_new(uint8_t, in.bsz);
|
in.buf = g_new(uint8_t, in.bsz);
|
||||||
|
|
||||||
for (out_pos = 0; in_pos < size; ) {
|
for (out_pos = 0; in_pos < size; ) {
|
||||||
|
@ -16,10 +16,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
1 file changed, 25 insertions(+), 3 deletions(-)
|
1 file changed, 25 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/qemu-img.c b/qemu-img.c
|
diff --git a/qemu-img.c b/qemu-img.c
|
||||||
index ad770f6570..b0839a5d18 100644
|
index 8ec68b346f..b98184bba1 100644
|
||||||
--- a/qemu-img.c
|
--- a/qemu-img.c
|
||||||
+++ b/qemu-img.c
|
+++ b/qemu-img.c
|
||||||
@@ -4998,11 +4998,13 @@ static int img_bitmap(int argc, char **argv)
|
@@ -4994,11 +4994,13 @@ static int img_bitmap(int argc, char **argv)
|
||||||
#define C_OF 010
|
#define C_OF 010
|
||||||
#define C_SKIP 020
|
#define C_SKIP 020
|
||||||
#define C_OSIZE 040
|
#define C_OSIZE 040
|
||||||
@ -33,7 +33,7 @@ index ad770f6570..b0839a5d18 100644
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct DdIo {
|
struct DdIo {
|
||||||
@@ -5091,6 +5093,19 @@ static int img_dd_osize(const char *arg,
|
@@ -5087,6 +5089,19 @@ static int img_dd_osize(const char *arg,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ index ad770f6570..b0839a5d18 100644
|
|||||||
static int img_dd(int argc, char **argv)
|
static int img_dd(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@@ -5105,12 +5120,14 @@ static int img_dd(int argc, char **argv)
|
@@ -5101,12 +5116,14 @@ static int img_dd(int argc, char **argv)
|
||||||
int c, i;
|
int c, i;
|
||||||
const char *out_fmt = "raw";
|
const char *out_fmt = "raw";
|
||||||
const char *fmt = NULL;
|
const char *fmt = NULL;
|
||||||
@ -69,7 +69,7 @@ index ad770f6570..b0839a5d18 100644
|
|||||||
};
|
};
|
||||||
struct DdIo in = {
|
struct DdIo in = {
|
||||||
.bsz = 512, /* Block size is by default 512 bytes */
|
.bsz = 512, /* Block size is by default 512 bytes */
|
||||||
@@ -5132,6 +5149,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5128,6 +5145,7 @@ static int img_dd(int argc, char **argv)
|
||||||
{ "of", img_dd_of, C_OF },
|
{ "of", img_dd_of, C_OF },
|
||||||
{ "skip", img_dd_skip, C_SKIP },
|
{ "skip", img_dd_skip, C_SKIP },
|
||||||
{ "osize", img_dd_osize, C_OSIZE },
|
{ "osize", img_dd_osize, C_OSIZE },
|
||||||
@ -77,7 +77,7 @@ index ad770f6570..b0839a5d18 100644
|
|||||||
{ NULL, NULL, 0 }
|
{ NULL, NULL, 0 }
|
||||||
};
|
};
|
||||||
const struct option long_options[] = {
|
const struct option long_options[] = {
|
||||||
@@ -5328,9 +5346,10 @@ static int img_dd(int argc, char **argv)
|
@@ -5324,9 +5342,10 @@ static int img_dd(int argc, char **argv)
|
||||||
|
|
||||||
in.buf = g_new(uint8_t, in.bsz);
|
in.buf = g_new(uint8_t, in.bsz);
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ index ad770f6570..b0839a5d18 100644
|
|||||||
if (blk1) {
|
if (blk1) {
|
||||||
in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
|
in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
|
||||||
if (in_ret == 0) {
|
if (in_ret == 0) {
|
||||||
@@ -5339,6 +5358,9 @@ static int img_dd(int argc, char **argv)
|
@@ -5335,6 +5354,9 @@ static int img_dd(int argc, char **argv)
|
||||||
} else {
|
} else {
|
||||||
in_ret = read(STDIN_FILENO, in.buf, bytes);
|
in_ret = read(STDIN_FILENO, in.buf, bytes);
|
||||||
if (in_ret == 0) {
|
if (in_ret == 0) {
|
||||||
|
@ -13,7 +13,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
3 files changed, 26 insertions(+), 12 deletions(-)
|
3 files changed, 26 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
|
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
|
||||||
index 4459c065f1..c6bc902182 100644
|
index 3653adb963..d83e8fb3c0 100644
|
||||||
--- a/docs/tools/qemu-img.rst
|
--- a/docs/tools/qemu-img.rst
|
||||||
+++ b/docs/tools/qemu-img.rst
|
+++ b/docs/tools/qemu-img.rst
|
||||||
@@ -212,6 +212,10 @@ Parameters to convert subcommand:
|
@@ -212,6 +212,10 @@ Parameters to convert subcommand:
|
||||||
@ -49,10 +49,10 @@ index 4459c065f1..c6bc902182 100644
|
|||||||
|
|
||||||
Give information about the disk image *FILENAME*. Use it in
|
Give information about the disk image *FILENAME*. Use it in
|
||||||
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
||||||
index 73e0bb1d2c..32749b416e 100644
|
index 048788b23d..0b29a67a06 100644
|
||||||
--- a/qemu-img-cmds.hx
|
--- a/qemu-img-cmds.hx
|
||||||
+++ b/qemu-img-cmds.hx
|
+++ b/qemu-img-cmds.hx
|
||||||
@@ -58,9 +58,9 @@ SRST
|
@@ -60,9 +60,9 @@ SRST
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
DEF("dd", img_dd,
|
DEF("dd", img_dd,
|
||||||
@ -65,10 +65,10 @@ index 73e0bb1d2c..32749b416e 100644
|
|||||||
|
|
||||||
DEF("info", img_info,
|
DEF("info", img_info,
|
||||||
diff --git a/qemu-img.c b/qemu-img.c
|
diff --git a/qemu-img.c b/qemu-img.c
|
||||||
index b0839a5d18..4acdf75879 100644
|
index b98184bba1..6fc8384f64 100644
|
||||||
--- a/qemu-img.c
|
--- a/qemu-img.c
|
||||||
+++ b/qemu-img.c
|
+++ b/qemu-img.c
|
||||||
@@ -5122,7 +5122,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5118,7 +5118,7 @@ static int img_dd(int argc, char **argv)
|
||||||
const char *fmt = NULL;
|
const char *fmt = NULL;
|
||||||
int64_t size = 0, readsize = 0;
|
int64_t size = 0, readsize = 0;
|
||||||
int64_t out_pos, in_pos;
|
int64_t out_pos, in_pos;
|
||||||
@ -77,7 +77,7 @@ index b0839a5d18..4acdf75879 100644
|
|||||||
struct DdInfo dd = {
|
struct DdInfo dd = {
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.count = 0,
|
.count = 0,
|
||||||
@@ -5160,7 +5160,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5156,7 +5156,7 @@ static int img_dd(int argc, char **argv)
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ index b0839a5d18..4acdf75879 100644
|
|||||||
if (c == EOF) {
|
if (c == EOF) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -5180,6 +5180,9 @@ static int img_dd(int argc, char **argv)
|
@@ -5176,6 +5176,9 @@ static int img_dd(int argc, char **argv)
|
||||||
case 'h':
|
case 'h':
|
||||||
help();
|
help();
|
||||||
break;
|
break;
|
||||||
@ -96,7 +96,7 @@ index b0839a5d18..4acdf75879 100644
|
|||||||
case 'U':
|
case 'U':
|
||||||
force_share = true;
|
force_share = true;
|
||||||
break;
|
break;
|
||||||
@@ -5310,13 +5313,15 @@ static int img_dd(int argc, char **argv)
|
@@ -5306,13 +5309,15 @@ static int img_dd(int argc, char **argv)
|
||||||
size - in.bsz * in.offset, &error_abort);
|
size - in.bsz * in.offset, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
3 files changed, 36 insertions(+), 7 deletions(-)
|
3 files changed, 36 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
|
diff --git a/docs/tools/qemu-img.rst b/docs/tools/qemu-img.rst
|
||||||
index c6bc902182..fe2241856e 100644
|
index d83e8fb3c0..61c6b21859 100644
|
||||||
--- a/docs/tools/qemu-img.rst
|
--- a/docs/tools/qemu-img.rst
|
||||||
+++ b/docs/tools/qemu-img.rst
|
+++ b/docs/tools/qemu-img.rst
|
||||||
@@ -496,10 +496,10 @@ Command description:
|
@@ -496,10 +496,10 @@ Command description:
|
||||||
@ -30,10 +30,10 @@ index c6bc902182..fe2241856e 100644
|
|||||||
The data is by default read and written using blocks of 512 bytes but can be
|
The data is by default read and written using blocks of 512 bytes but can be
|
||||||
modified by specifying *BLOCK_SIZE*. If count=\ *BLOCKS* is specified
|
modified by specifying *BLOCK_SIZE*. If count=\ *BLOCKS* is specified
|
||||||
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
|
||||||
index 32749b416e..40ee9c0ed8 100644
|
index 0b29a67a06..758f397232 100644
|
||||||
--- a/qemu-img-cmds.hx
|
--- a/qemu-img-cmds.hx
|
||||||
+++ b/qemu-img-cmds.hx
|
+++ b/qemu-img-cmds.hx
|
||||||
@@ -58,9 +58,9 @@ SRST
|
@@ -60,9 +60,9 @@ SRST
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
DEF("dd", img_dd,
|
DEF("dd", img_dd,
|
||||||
@ -46,10 +46,10 @@ index 32749b416e..40ee9c0ed8 100644
|
|||||||
|
|
||||||
DEF("info", img_info,
|
DEF("info", img_info,
|
||||||
diff --git a/qemu-img.c b/qemu-img.c
|
diff --git a/qemu-img.c b/qemu-img.c
|
||||||
index 4acdf75879..a9632b5951 100644
|
index 6fc8384f64..a6c88e0860 100644
|
||||||
--- a/qemu-img.c
|
--- a/qemu-img.c
|
||||||
+++ b/qemu-img.c
|
+++ b/qemu-img.c
|
||||||
@@ -5114,6 +5114,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5110,6 +5110,7 @@ static int img_dd(int argc, char **argv)
|
||||||
BlockDriver *drv = NULL, *proto_drv = NULL;
|
BlockDriver *drv = NULL, *proto_drv = NULL;
|
||||||
BlockBackend *blk1 = NULL, *blk2 = NULL;
|
BlockBackend *blk1 = NULL, *blk2 = NULL;
|
||||||
QemuOpts *opts = NULL;
|
QemuOpts *opts = NULL;
|
||||||
@ -57,7 +57,7 @@ index 4acdf75879..a9632b5951 100644
|
|||||||
QemuOptsList *create_opts = NULL;
|
QemuOptsList *create_opts = NULL;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
@@ -5123,6 +5124,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5119,6 +5120,7 @@ static int img_dd(int argc, char **argv)
|
||||||
int64_t size = 0, readsize = 0;
|
int64_t size = 0, readsize = 0;
|
||||||
int64_t out_pos, in_pos;
|
int64_t out_pos, in_pos;
|
||||||
bool force_share = false, skip_create = false;
|
bool force_share = false, skip_create = false;
|
||||||
@ -65,7 +65,7 @@ index 4acdf75879..a9632b5951 100644
|
|||||||
struct DdInfo dd = {
|
struct DdInfo dd = {
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.count = 0,
|
.count = 0,
|
||||||
@@ -5160,7 +5162,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5156,7 +5158,7 @@ static int img_dd(int argc, char **argv)
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ index 4acdf75879..a9632b5951 100644
|
|||||||
if (c == EOF) {
|
if (c == EOF) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -5183,6 +5185,19 @@ static int img_dd(int argc, char **argv)
|
@@ -5179,6 +5181,19 @@ static int img_dd(int argc, char **argv)
|
||||||
case 'n':
|
case 'n':
|
||||||
skip_create = true;
|
skip_create = true;
|
||||||
break;
|
break;
|
||||||
@ -94,7 +94,7 @@ index 4acdf75879..a9632b5951 100644
|
|||||||
case 'U':
|
case 'U':
|
||||||
force_share = true;
|
force_share = true;
|
||||||
break;
|
break;
|
||||||
@@ -5242,11 +5257,24 @@ static int img_dd(int argc, char **argv)
|
@@ -5238,11 +5253,24 @@ static int img_dd(int argc, char **argv)
|
||||||
if (dd.flags & C_IF) {
|
if (dd.flags & C_IF) {
|
||||||
blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
|
blk1 = img_open(image_opts, in.filename, fmt, 0, false, false,
|
||||||
force_share);
|
force_share);
|
||||||
@ -120,7 +120,7 @@ index 4acdf75879..a9632b5951 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dd.flags & C_OSIZE) {
|
if (dd.flags & C_OSIZE) {
|
||||||
@@ -5401,6 +5429,7 @@ static int img_dd(int argc, char **argv)
|
@@ -5397,6 +5425,7 @@ static int img_dd(int argc, char **argv)
|
||||||
out:
|
out:
|
||||||
g_free(arg);
|
g_free(arg);
|
||||||
qemu_opts_del(opts);
|
qemu_opts_del(opts);
|
||||||
|
@ -59,10 +59,10 @@ index a6ff6a4875..e7f74d1c63 100644
|
|||||||
qapi_free_BalloonInfo(info);
|
qapi_free_BalloonInfo(info);
|
||||||
}
|
}
|
||||||
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
|
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
|
||||||
index d004cf29d2..2660ed520b 100644
|
index 609e39a821..8cb6dfcac3 100644
|
||||||
--- a/hw/virtio/virtio-balloon.c
|
--- a/hw/virtio/virtio-balloon.c
|
||||||
+++ b/hw/virtio/virtio-balloon.c
|
+++ b/hw/virtio/virtio-balloon.c
|
||||||
@@ -782,8 +782,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
|
@@ -781,8 +781,37 @@ static uint64_t virtio_balloon_get_features(VirtIODevice *vdev, uint64_t f,
|
||||||
static void virtio_balloon_stat(void *opaque, BalloonInfo *info)
|
static void virtio_balloon_stat(void *opaque, BalloonInfo *info)
|
||||||
{
|
{
|
||||||
VirtIOBalloon *dev = opaque;
|
VirtIOBalloon *dev = opaque;
|
||||||
@ -103,10 +103,10 @@ index d004cf29d2..2660ed520b 100644
|
|||||||
|
|
||||||
static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
|
static void virtio_balloon_to_target(void *opaque, ram_addr_t target)
|
||||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||||
index b6d634b30d..03a72efc11 100644
|
index e8b60641f2..2054cdc70d 100644
|
||||||
--- a/qapi/machine.json
|
--- a/qapi/machine.json
|
||||||
+++ b/qapi/machine.json
|
+++ b/qapi/machine.json
|
||||||
@@ -1087,9 +1087,29 @@
|
@@ -1079,9 +1079,29 @@
|
||||||
# @actual: the logical size of the VM in bytes Formula used:
|
# @actual: the logical size of the VM in bytes Formula used:
|
||||||
# logical_vm_size = vm_ram_size - balloon_size
|
# logical_vm_size = vm_ram_size - balloon_size
|
||||||
#
|
#
|
||||||
@ -138,10 +138,10 @@ index b6d634b30d..03a72efc11 100644
|
|||||||
##
|
##
|
||||||
# @query-balloon:
|
# @query-balloon:
|
||||||
diff --git a/qapi/pragma.json b/qapi/pragma.json
|
diff --git a/qapi/pragma.json b/qapi/pragma.json
|
||||||
index 0aa4eeddd3..eae9f54700 100644
|
index 59fbe74b8c..be8fa304c5 100644
|
||||||
--- a/qapi/pragma.json
|
--- a/qapi/pragma.json
|
||||||
+++ b/qapi/pragma.json
|
+++ b/qapi/pragma.json
|
||||||
@@ -35,6 +35,7 @@
|
@@ -90,6 +90,7 @@
|
||||||
'member-name-exceptions': [ # visible in:
|
'member-name-exceptions': [ # visible in:
|
||||||
'ACPISlotType', # query-acpi-ospm-status
|
'ACPISlotType', # query-acpi-ospm-status
|
||||||
'AcpiTableOptions', # -acpitable
|
'AcpiTableOptions', # -acpitable
|
||||||
|
@ -13,10 +13,10 @@ Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
|
|||||||
2 files changed, 9 insertions(+), 1 deletion(-)
|
2 files changed, 9 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
|
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
|
||||||
index 3860a50c3b..40821e2317 100644
|
index 4b72009cd3..314351cdff 100644
|
||||||
--- a/hw/core/machine-qmp-cmds.c
|
--- a/hw/core/machine-qmp-cmds.c
|
||||||
+++ b/hw/core/machine-qmp-cmds.c
|
+++ b/hw/core/machine-qmp-cmds.c
|
||||||
@@ -91,6 +91,12 @@ MachineInfoList *qmp_query_machines(Error **errp)
|
@@ -90,6 +90,12 @@ MachineInfoList *qmp_query_machines(Error **errp)
|
||||||
info->numa_mem_supported = mc->numa_mem_supported;
|
info->numa_mem_supported = mc->numa_mem_supported;
|
||||||
info->deprecated = !!mc->deprecation_reason;
|
info->deprecated = !!mc->deprecation_reason;
|
||||||
info->acpi = !!object_class_property_find(OBJECT_CLASS(mc), "acpi");
|
info->acpi = !!object_class_property_find(OBJECT_CLASS(mc), "acpi");
|
||||||
@ -30,7 +30,7 @@ index 3860a50c3b..40821e2317 100644
|
|||||||
info->default_cpu_type = g_strdup(mc->default_cpu_type);
|
info->default_cpu_type = g_strdup(mc->default_cpu_type);
|
||||||
}
|
}
|
||||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||||
index 03a72efc11..297ad0e0e5 100644
|
index 2054cdc70d..a024d5b05d 100644
|
||||||
--- a/qapi/machine.json
|
--- a/qapi/machine.json
|
||||||
+++ b/qapi/machine.json
|
+++ b/qapi/machine.json
|
||||||
@@ -146,6 +146,8 @@
|
@@ -146,6 +146,8 @@
|
||||||
|
@ -14,10 +14,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
2 files changed, 7 insertions(+)
|
2 files changed, 7 insertions(+)
|
||||||
|
|
||||||
diff --git a/qapi/ui.json b/qapi/ui.json
|
diff --git a/qapi/ui.json b/qapi/ui.json
|
||||||
index a0158baf23..20d8994f49 100644
|
index f610bce118..6ea26a9acb 100644
|
||||||
--- a/qapi/ui.json
|
--- a/qapi/ui.json
|
||||||
+++ b/qapi/ui.json
|
+++ b/qapi/ui.json
|
||||||
@@ -318,11 +318,14 @@
|
@@ -314,11 +314,14 @@
|
||||||
#
|
#
|
||||||
# @channels: a list of @SpiceChannel for each active spice channel
|
# @channels: a list of @SpiceChannel for each active spice channel
|
||||||
#
|
#
|
||||||
@ -33,7 +33,7 @@ index a0158baf23..20d8994f49 100644
|
|||||||
'if': 'CONFIG_SPICE' }
|
'if': 'CONFIG_SPICE' }
|
||||||
|
|
||||||
diff --git a/ui/spice-core.c b/ui/spice-core.c
|
diff --git a/ui/spice-core.c b/ui/spice-core.c
|
||||||
index 0eb138cf43..56d677efe1 100644
|
index ea20e6153c..55a15fba8b 100644
|
||||||
--- a/ui/spice-core.c
|
--- a/ui/spice-core.c
|
||||||
+++ b/ui/spice-core.c
|
+++ b/ui/spice-core.c
|
||||||
@@ -548,6 +548,10 @@ static SpiceInfo *qmp_query_spice_real(Error **errp)
|
@@ -548,6 +548,10 @@ static SpiceInfo *qmp_query_spice_real(Error **errp)
|
||||||
|
@ -271,7 +271,7 @@ index 0000000000..17ae2cb261
|
|||||||
+
|
+
|
||||||
+#endif /* QIO_CHANNEL_SAVEVM_ASYNC_H */
|
+#endif /* QIO_CHANNEL_SAVEVM_ASYNC_H */
|
||||||
diff --git a/migration/meson.build b/migration/meson.build
|
diff --git a/migration/meson.build b/migration/meson.build
|
||||||
index 92b1cc4297..0e689eac09 100644
|
index 1eeb915ff6..95d1cf2250 100644
|
||||||
--- a/migration/meson.build
|
--- a/migration/meson.build
|
||||||
+++ b/migration/meson.build
|
+++ b/migration/meson.build
|
||||||
@@ -13,6 +13,7 @@ system_ss.add(files(
|
@@ -13,6 +13,7 @@ system_ss.add(files(
|
||||||
|
@ -35,17 +35,17 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
include/migration/snapshot.h | 2 +
|
include/migration/snapshot.h | 2 +
|
||||||
include/monitor/hmp.h | 3 +
|
include/monitor/hmp.h | 3 +
|
||||||
migration/meson.build | 1 +
|
migration/meson.build | 1 +
|
||||||
migration/savevm-async.c | 534 +++++++++++++++++++++++++++++++++++
|
migration/savevm-async.c | 531 +++++++++++++++++++++++++++++++++++
|
||||||
monitor/hmp-cmds.c | 38 +++
|
monitor/hmp-cmds.c | 38 +++
|
||||||
qapi/migration.json | 34 +++
|
qapi/migration.json | 34 +++
|
||||||
qapi/misc.json | 16 ++
|
qapi/misc.json | 18 ++
|
||||||
qemu-options.hx | 12 +
|
qemu-options.hx | 12 +
|
||||||
system/vl.c | 10 +
|
system/vl.c | 10 +
|
||||||
11 files changed, 680 insertions(+)
|
11 files changed, 679 insertions(+)
|
||||||
create mode 100644 migration/savevm-async.c
|
create mode 100644 migration/savevm-async.c
|
||||||
|
|
||||||
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
|
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
|
||||||
index f5b37eb74a..10fdd822e0 100644
|
index ad1b1306e3..d5ab880492 100644
|
||||||
--- a/hmp-commands-info.hx
|
--- a/hmp-commands-info.hx
|
||||||
+++ b/hmp-commands-info.hx
|
+++ b/hmp-commands-info.hx
|
||||||
@@ -525,6 +525,19 @@ SRST
|
@@ -525,6 +525,19 @@ SRST
|
||||||
@ -69,10 +69,10 @@ index f5b37eb74a..10fdd822e0 100644
|
|||||||
.name = "balloon",
|
.name = "balloon",
|
||||||
.args_type = "",
|
.args_type = "",
|
||||||
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
||||||
index 765349ed14..893c3bd240 100644
|
index 2e2a3bcf98..7506de251c 100644
|
||||||
--- a/hmp-commands.hx
|
--- a/hmp-commands.hx
|
||||||
+++ b/hmp-commands.hx
|
+++ b/hmp-commands.hx
|
||||||
@@ -1875,3 +1875,20 @@ SRST
|
@@ -1862,3 +1862,20 @@ SRST
|
||||||
List event channels in the guest
|
List event channels in the guest
|
||||||
ERST
|
ERST
|
||||||
#endif
|
#endif
|
||||||
@ -94,12 +94,12 @@ index 765349ed14..893c3bd240 100644
|
|||||||
+ .coroutine = true,
|
+ .coroutine = true,
|
||||||
+ },
|
+ },
|
||||||
diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
|
diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
|
||||||
index e72083b117..c846d37806 100644
|
index 9e4dcaaa75..2581730d74 100644
|
||||||
--- a/include/migration/snapshot.h
|
--- a/include/migration/snapshot.h
|
||||||
+++ b/include/migration/snapshot.h
|
+++ b/include/migration/snapshot.h
|
||||||
@@ -61,4 +61,6 @@ bool delete_snapshot(const char *name,
|
@@ -68,4 +68,6 @@ bool delete_snapshot(const char *name,
|
||||||
bool has_devices, strList *devices,
|
*/
|
||||||
Error **errp);
|
void load_snapshot_resume(RunState state);
|
||||||
|
|
||||||
+int load_snapshot_from_blockdev(const char *filename, Error **errp);
|
+int load_snapshot_from_blockdev(const char *filename, Error **errp);
|
||||||
+
|
+
|
||||||
@ -126,10 +126,10 @@ index 13f9a2dedb..7a7def7530 100644
|
|||||||
void coroutine_fn hmp_screendump(Monitor *mon, const QDict *qdict);
|
void coroutine_fn hmp_screendump(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_chardev_add(Monitor *mon, const QDict *qdict);
|
void hmp_chardev_add(Monitor *mon, const QDict *qdict);
|
||||||
diff --git a/migration/meson.build b/migration/meson.build
|
diff --git a/migration/meson.build b/migration/meson.build
|
||||||
index 0e689eac09..8f9d122187 100644
|
index 95d1cf2250..800f12a60d 100644
|
||||||
--- a/migration/meson.build
|
--- a/migration/meson.build
|
||||||
+++ b/migration/meson.build
|
+++ b/migration/meson.build
|
||||||
@@ -27,6 +27,7 @@ system_ss.add(files(
|
@@ -28,6 +28,7 @@ system_ss.add(files(
|
||||||
'options.c',
|
'options.c',
|
||||||
'postcopy-ram.c',
|
'postcopy-ram.c',
|
||||||
'savevm.c',
|
'savevm.c',
|
||||||
@ -139,10 +139,10 @@ index 0e689eac09..8f9d122187 100644
|
|||||||
'threadinfo.c',
|
'threadinfo.c',
|
||||||
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
|
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..8f63c4c637
|
index 0000000000..779e4e2a78
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/migration/savevm-async.c
|
+++ b/migration/savevm-async.c
|
||||||
@@ -0,0 +1,534 @@
|
@@ -0,0 +1,531 @@
|
||||||
+#include "qemu/osdep.h"
|
+#include "qemu/osdep.h"
|
||||||
+#include "migration/channel-savevm-async.h"
|
+#include "migration/channel-savevm-async.h"
|
||||||
+#include "migration/migration.h"
|
+#include "migration/migration.h"
|
||||||
@ -300,7 +300,6 @@ index 0000000000..8f63c4c637
|
|||||||
+static void process_savevm_finalize(void *opaque)
|
+static void process_savevm_finalize(void *opaque)
|
||||||
+{
|
+{
|
||||||
+ int ret;
|
+ int ret;
|
||||||
+ AioContext *iohandler_ctx = iohandler_get_aio_context();
|
|
||||||
+ MigrationState *ms = migrate_get_current();
|
+ MigrationState *ms = migrate_get_current();
|
||||||
+
|
+
|
||||||
+ bool aborted = savevm_aborted();
|
+ bool aborted = savevm_aborted();
|
||||||
@ -317,9 +316,7 @@ index 0000000000..8f63c4c637
|
|||||||
+ * so move it back. It can stay in the main context and live out its live
|
+ * so move it back. It can stay in the main context and live out its live
|
||||||
+ * there, since we're done with it after this method ends anyway.
|
+ * there, since we're done with it after this method ends anyway.
|
||||||
+ */
|
+ */
|
||||||
+ aio_context_acquire(iohandler_ctx);
|
|
||||||
+ blk_set_aio_context(snap_state.target, qemu_get_aio_context(), NULL);
|
+ blk_set_aio_context(snap_state.target, qemu_get_aio_context(), NULL);
|
||||||
+ aio_context_release(iohandler_ctx);
|
|
||||||
+
|
+
|
||||||
+ ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
|
+ ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE);
|
||||||
+ if (ret < 0) {
|
+ if (ret < 0) {
|
||||||
@ -396,12 +393,12 @@ index 0000000000..8f63c4c637
|
|||||||
+ * lock. Similar to what is done in migration.c, call the exact variant
|
+ * lock. Similar to what is done in migration.c, call the exact variant
|
||||||
+ * only once pend_precopy in the estimate is below the threshold.
|
+ * only once pend_precopy in the estimate is below the threshold.
|
||||||
+ */
|
+ */
|
||||||
+ qemu_mutex_unlock_iothread();
|
+ bql_unlock();
|
||||||
+ qemu_savevm_state_pending_estimate(&pend_precopy, &pend_postcopy);
|
+ qemu_savevm_state_pending_estimate(&pend_precopy, &pend_postcopy);
|
||||||
+ if (pend_precopy <= threshold) {
|
+ if (pend_precopy <= threshold) {
|
||||||
+ qemu_savevm_state_pending_exact(&pend_precopy, &pend_postcopy);
|
+ qemu_savevm_state_pending_exact(&pend_precopy, &pend_postcopy);
|
||||||
+ }
|
+ }
|
||||||
+ qemu_mutex_lock_iothread();
|
+ bql_lock();
|
||||||
+ pending_size = pend_precopy + pend_postcopy;
|
+ pending_size = pend_precopy + pend_postcopy;
|
||||||
+
|
+
|
||||||
+ /*
|
+ /*
|
||||||
@ -482,7 +479,7 @@ index 0000000000..8f63c4c637
|
|||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ if (migration_is_running(ms->state)) {
|
+ if (migration_is_running()) {
|
||||||
+ error_set(errp, ERROR_CLASS_GENERIC_ERROR, QERR_MIGRATION_ACTIVE);
|
+ error_set(errp, ERROR_CLASS_GENERIC_ERROR, QERR_MIGRATION_ACTIVE);
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
@ -731,10 +728,10 @@ index 871898ac46..ef4634e5c1 100644
|
|||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
diff --git a/qapi/migration.json b/qapi/migration.json
|
diff --git a/qapi/migration.json b/qapi/migration.json
|
||||||
index 197d3faa43..b41465fbe9 100644
|
index 8c65b90328..ed20d066cd 100644
|
||||||
--- a/qapi/migration.json
|
--- a/qapi/migration.json
|
||||||
+++ b/qapi/migration.json
|
+++ b/qapi/migration.json
|
||||||
@@ -298,6 +298,40 @@
|
@@ -297,6 +297,40 @@
|
||||||
'*dirty-limit-throttle-time-per-round': 'uint64',
|
'*dirty-limit-throttle-time-per-round': 'uint64',
|
||||||
'*dirty-limit-ring-full-time': 'uint64'} }
|
'*dirty-limit-ring-full-time': 'uint64'} }
|
||||||
|
|
||||||
@ -776,10 +773,10 @@ index 197d3faa43..b41465fbe9 100644
|
|||||||
# @query-migrate:
|
# @query-migrate:
|
||||||
#
|
#
|
||||||
diff --git a/qapi/misc.json b/qapi/misc.json
|
diff --git a/qapi/misc.json b/qapi/misc.json
|
||||||
index cda2effa81..94a58bb0bf 100644
|
index ec30e5c570..7147199a12 100644
|
||||||
--- a/qapi/misc.json
|
--- a/qapi/misc.json
|
||||||
+++ b/qapi/misc.json
|
+++ b/qapi/misc.json
|
||||||
@@ -456,6 +456,22 @@
|
@@ -454,6 +454,24 @@
|
||||||
##
|
##
|
||||||
{ 'command': 'query-fdsets', 'returns': ['FdsetInfo'] }
|
{ 'command': 'query-fdsets', 'returns': ['FdsetInfo'] }
|
||||||
|
|
||||||
@ -788,6 +785,8 @@ index cda2effa81..94a58bb0bf 100644
|
|||||||
+#
|
+#
|
||||||
+# Prepare for snapshot and halt VM. Save VM state to statefile.
|
+# Prepare for snapshot and halt VM. Save VM state to statefile.
|
||||||
+#
|
+#
|
||||||
|
+# @statefile: target file that state should be written to.
|
||||||
|
+#
|
||||||
+##
|
+##
|
||||||
+{ 'command': 'savevm-start', 'data': { '*statefile': 'str' } }
|
+{ 'command': 'savevm-start', 'data': { '*statefile': 'str' } }
|
||||||
+
|
+
|
||||||
@ -803,10 +802,10 @@ index cda2effa81..94a58bb0bf 100644
|
|||||||
# @CommandLineParameterType:
|
# @CommandLineParameterType:
|
||||||
#
|
#
|
||||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||||
index b6b4ad9e67..881b0b3c43 100644
|
index 8ce85d4559..511ab9415e 100644
|
||||||
--- a/qemu-options.hx
|
--- a/qemu-options.hx
|
||||||
+++ b/qemu-options.hx
|
+++ b/qemu-options.hx
|
||||||
@@ -4590,6 +4590,18 @@ SRST
|
@@ -4610,6 +4610,18 @@ SRST
|
||||||
Start right away with a saved state (``loadvm`` in monitor)
|
Start right away with a saved state (``loadvm`` in monitor)
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
@ -826,7 +825,7 @@ index b6b4ad9e67..881b0b3c43 100644
|
|||||||
DEF("daemonize", 0, QEMU_OPTION_daemonize, \
|
DEF("daemonize", 0, QEMU_OPTION_daemonize, \
|
||||||
"-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
|
"-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
|
||||||
diff --git a/system/vl.c b/system/vl.c
|
diff --git a/system/vl.c b/system/vl.c
|
||||||
index d2a3b3f457..57f7ba0525 100644
|
index c644222982..2738ab7c91 100644
|
||||||
--- a/system/vl.c
|
--- a/system/vl.c
|
||||||
+++ b/system/vl.c
|
+++ b/system/vl.c
|
||||||
@@ -163,6 +163,7 @@ static const char *accelerators;
|
@@ -163,6 +163,7 @@ static const char *accelerators;
|
||||||
@ -837,10 +836,10 @@ index d2a3b3f457..57f7ba0525 100644
|
|||||||
static QTAILQ_HEAD(, ObjectOption) object_opts = QTAILQ_HEAD_INITIALIZER(object_opts);
|
static QTAILQ_HEAD(, ObjectOption) object_opts = QTAILQ_HEAD_INITIALIZER(object_opts);
|
||||||
static QTAILQ_HEAD(, DeviceOption) device_opts = QTAILQ_HEAD_INITIALIZER(device_opts);
|
static QTAILQ_HEAD(, DeviceOption) device_opts = QTAILQ_HEAD_INITIALIZER(device_opts);
|
||||||
static int display_remote;
|
static int display_remote;
|
||||||
@@ -2715,6 +2716,12 @@ void qmp_x_exit_preconfig(Error **errp)
|
@@ -2712,6 +2713,12 @@ void qmp_x_exit_preconfig(Error **errp)
|
||||||
|
RunState state = autostart ? RUN_STATE_RUNNING : runstate_get();
|
||||||
if (loadvm) {
|
|
||||||
load_snapshot(loadvm, NULL, false, NULL, &error_fatal);
|
load_snapshot(loadvm, NULL, false, NULL, &error_fatal);
|
||||||
|
load_snapshot_resume(state);
|
||||||
+ } else if (loadstate) {
|
+ } else if (loadstate) {
|
||||||
+ Error *local_err = NULL;
|
+ Error *local_err = NULL;
|
||||||
+ if (load_snapshot_from_blockdev(loadstate, &local_err) < 0) {
|
+ if (load_snapshot_from_blockdev(loadstate, &local_err) < 0) {
|
||||||
@ -850,7 +849,7 @@ index d2a3b3f457..57f7ba0525 100644
|
|||||||
}
|
}
|
||||||
if (replay_mode != REPLAY_MODE_NONE) {
|
if (replay_mode != REPLAY_MODE_NONE) {
|
||||||
replay_vmstate_init();
|
replay_vmstate_init();
|
||||||
@@ -3265,6 +3272,9 @@ void qemu_init(int argc, char **argv)
|
@@ -3259,6 +3266,9 @@ void qemu_init(int argc, char **argv)
|
||||||
case QEMU_OPTION_loadvm:
|
case QEMU_OPTION_loadvm:
|
||||||
loadvm = optarg;
|
loadvm = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -19,12 +19,12 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
3 files changed, 39 insertions(+), 18 deletions(-)
|
3 files changed, 39 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
|
diff --git a/migration/qemu-file.c b/migration/qemu-file.c
|
||||||
index 94231ff295..afda98292f 100644
|
index a10882d47f..19c1de0472 100644
|
||||||
--- a/migration/qemu-file.c
|
--- a/migration/qemu-file.c
|
||||||
+++ b/migration/qemu-file.c
|
+++ b/migration/qemu-file.c
|
||||||
@@ -34,8 +34,8 @@
|
@@ -35,8 +35,8 @@
|
||||||
#include "qapi/error.h"
|
|
||||||
#include "rdma.h"
|
#include "rdma.h"
|
||||||
|
#include "io/channel-file.h"
|
||||||
|
|
||||||
-#define IO_BUF_SIZE 32768
|
-#define IO_BUF_SIZE 32768
|
||||||
-#define MAX_IOV_SIZE MIN_CONST(IOV_MAX, 64)
|
-#define MAX_IOV_SIZE MIN_CONST(IOV_MAX, 64)
|
||||||
@ -33,7 +33,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
|
|
||||||
struct QEMUFile {
|
struct QEMUFile {
|
||||||
QIOChannel *ioc;
|
QIOChannel *ioc;
|
||||||
@@ -43,7 +43,8 @@ struct QEMUFile {
|
@@ -44,7 +44,8 @@ struct QEMUFile {
|
||||||
|
|
||||||
int buf_index;
|
int buf_index;
|
||||||
int buf_size; /* 0 when writing */
|
int buf_size; /* 0 when writing */
|
||||||
@ -43,7 +43,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
|
|
||||||
DECLARE_BITMAP(may_free, MAX_IOV_SIZE);
|
DECLARE_BITMAP(may_free, MAX_IOV_SIZE);
|
||||||
struct iovec iov[MAX_IOV_SIZE];
|
struct iovec iov[MAX_IOV_SIZE];
|
||||||
@@ -97,7 +98,9 @@ int qemu_file_shutdown(QEMUFile *f)
|
@@ -101,7 +102,9 @@ int qemu_file_shutdown(QEMUFile *f)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
{
|
{
|
||||||
QEMUFile *f;
|
QEMUFile *f;
|
||||||
|
|
||||||
@@ -106,6 +109,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
|
@@ -110,6 +113,8 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
|
||||||
object_ref(ioc);
|
object_ref(ioc);
|
||||||
f->ioc = ioc;
|
f->ioc = ioc;
|
||||||
f->is_writable = is_writable;
|
f->is_writable = is_writable;
|
||||||
@ -63,7 +63,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
|
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
@@ -116,17 +121,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
|
@@ -120,17 +125,27 @@ static QEMUFile *qemu_file_new_impl(QIOChannel *ioc, bool is_writable)
|
||||||
*/
|
*/
|
||||||
QEMUFile *qemu_file_get_return_path(QEMUFile *f)
|
QEMUFile *qemu_file_get_return_path(QEMUFile *f)
|
||||||
{
|
{
|
||||||
@ -94,7 +94,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -320,7 +335,7 @@ static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f)
|
@@ -328,7 +343,7 @@ static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f)
|
||||||
do {
|
do {
|
||||||
len = qio_channel_read(f->ioc,
|
len = qio_channel_read(f->ioc,
|
||||||
(char *)f->buf + pending,
|
(char *)f->buf + pending,
|
||||||
@ -103,7 +103,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
&local_error);
|
&local_error);
|
||||||
if (len == QIO_CHANNEL_ERR_BLOCK) {
|
if (len == QIO_CHANNEL_ERR_BLOCK) {
|
||||||
if (qemu_in_coroutine()) {
|
if (qemu_in_coroutine()) {
|
||||||
@@ -360,6 +375,9 @@ int qemu_fclose(QEMUFile *f)
|
@@ -368,6 +383,9 @@ int qemu_fclose(QEMUFile *f)
|
||||||
ret = ret2;
|
ret = ret2;
|
||||||
}
|
}
|
||||||
g_clear_pointer(&f->ioc, object_unref);
|
g_clear_pointer(&f->ioc, object_unref);
|
||||||
@ -113,7 +113,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
error_free(f->last_error_obj);
|
error_free(f->last_error_obj);
|
||||||
g_free(f);
|
g_free(f);
|
||||||
trace_qemu_file_fclose();
|
trace_qemu_file_fclose();
|
||||||
@@ -408,7 +426,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len)
|
@@ -416,7 +434,7 @@ static void add_buf_to_iovec(QEMUFile *f, size_t len)
|
||||||
{
|
{
|
||||||
if (!add_to_iovec(f, f->buf + f->buf_index, len, false)) {
|
if (!add_to_iovec(f, f->buf + f->buf_index, len, false)) {
|
||||||
f->buf_index += len;
|
f->buf_index += len;
|
||||||
@ -122,7 +122,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
qemu_fflush(f);
|
qemu_fflush(f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -433,7 +451,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size)
|
@@ -441,7 +459,7 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size > 0) {
|
while (size > 0) {
|
||||||
@ -131,7 +131,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
if (l > size) {
|
if (l > size) {
|
||||||
l = size;
|
l = size;
|
||||||
}
|
}
|
||||||
@@ -478,8 +496,8 @@ size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t si
|
@@ -587,8 +605,8 @@ size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t si
|
||||||
size_t index;
|
size_t index;
|
||||||
|
|
||||||
assert(!qemu_file_is_writable(f));
|
assert(!qemu_file_is_writable(f));
|
||||||
@ -142,7 +142,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
|
|
||||||
/* The 1st byte to read from */
|
/* The 1st byte to read from */
|
||||||
index = f->buf_index + offset;
|
index = f->buf_index + offset;
|
||||||
@@ -529,7 +547,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
|
@@ -638,7 +656,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
|
||||||
size_t res;
|
size_t res;
|
||||||
uint8_t *src;
|
uint8_t *src;
|
||||||
|
|
||||||
@ -151,7 +151,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
@@ -563,7 +581,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
|
@@ -672,7 +690,7 @@ size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size
|
||||||
*/
|
*/
|
||||||
size_t coroutine_mixed_fn qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size)
|
size_t coroutine_mixed_fn qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size)
|
||||||
{
|
{
|
||||||
@ -160,7 +160,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
size_t res;
|
size_t res;
|
||||||
uint8_t *src = NULL;
|
uint8_t *src = NULL;
|
||||||
|
|
||||||
@@ -588,7 +606,7 @@ int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset)
|
@@ -697,7 +715,7 @@ int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset)
|
||||||
int index = f->buf_index + offset;
|
int index = f->buf_index + offset;
|
||||||
|
|
||||||
assert(!qemu_file_is_writable(f));
|
assert(!qemu_file_is_writable(f));
|
||||||
@ -169,7 +169,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
|
|
||||||
if (index >= f->buf_size) {
|
if (index >= f->buf_size) {
|
||||||
qemu_fill_buffer(f);
|
qemu_fill_buffer(f);
|
||||||
@@ -702,7 +720,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len,
|
@@ -811,7 +829,7 @@ static int qemu_compress_data(z_stream *stream, uint8_t *dest, size_t dest_len,
|
||||||
ssize_t qemu_put_compression_data(QEMUFile *f, z_stream *stream,
|
ssize_t qemu_put_compression_data(QEMUFile *f, z_stream *stream,
|
||||||
const uint8_t *p, size_t size)
|
const uint8_t *p, size_t size)
|
||||||
{
|
{
|
||||||
@ -179,7 +179,7 @@ index 94231ff295..afda98292f 100644
|
|||||||
if (blen < compressBound(size)) {
|
if (blen < compressBound(size)) {
|
||||||
return -1;
|
return -1;
|
||||||
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
|
diff --git a/migration/qemu-file.h b/migration/qemu-file.h
|
||||||
index 8aec9fabf7..5d0b18c51c 100644
|
index 32fd4a34fd..36a0cd8cc8 100644
|
||||||
--- a/migration/qemu-file.h
|
--- a/migration/qemu-file.h
|
||||||
+++ b/migration/qemu-file.h
|
+++ b/migration/qemu-file.h
|
||||||
@@ -30,7 +30,9 @@
|
@@ -30,7 +30,9 @@
|
||||||
@ -193,10 +193,10 @@ index 8aec9fabf7..5d0b18c51c 100644
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
|
diff --git a/migration/savevm-async.c b/migration/savevm-async.c
|
||||||
index 8f63c4c637..f8d1c2f2b1 100644
|
index 779e4e2a78..bf36fc06d2 100644
|
||||||
--- a/migration/savevm-async.c
|
--- a/migration/savevm-async.c
|
||||||
+++ b/migration/savevm-async.c
|
+++ b/migration/savevm-async.c
|
||||||
@@ -382,7 +382,7 @@ void qmp_savevm_start(const char *statefile, Error **errp)
|
@@ -379,7 +379,7 @@ void qmp_savevm_start(const char *statefile, Error **errp)
|
||||||
|
|
||||||
QIOChannel *ioc = QIO_CHANNEL(qio_channel_savevm_async_new(snap_state.target,
|
QIOChannel *ioc = QIO_CHANNEL(qio_channel_savevm_async_new(snap_state.target,
|
||||||
&snap_state.bs_pos));
|
&snap_state.bs_pos));
|
||||||
@ -205,7 +205,7 @@ index 8f63c4c637..f8d1c2f2b1 100644
|
|||||||
|
|
||||||
if (!snap_state.file) {
|
if (!snap_state.file) {
|
||||||
error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile);
|
error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile);
|
||||||
@@ -499,7 +499,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp)
|
@@ -496,7 +496,8 @@ int load_snapshot_from_blockdev(const char *filename, Error **errp)
|
||||||
blk_op_block_all(be, blocker);
|
blk_op_block_all(be, blocker);
|
||||||
|
|
||||||
/* restore the VM state */
|
/* restore the VM state */
|
||||||
|
@ -14,7 +14,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
create mode 100644 block/zeroinit.c
|
create mode 100644 block/zeroinit.c
|
||||||
|
|
||||||
diff --git a/block/meson.build b/block/meson.build
|
diff --git a/block/meson.build b/block/meson.build
|
||||||
index 59ff6d380c..8ded0dc18b 100644
|
index e1f03fd773..b530e117b5 100644
|
||||||
--- a/block/meson.build
|
--- a/block/meson.build
|
||||||
+++ b/block/meson.build
|
+++ b/block/meson.build
|
||||||
@@ -39,6 +39,7 @@ block_ss.add(files(
|
@@ -39,6 +39,7 @@ block_ss.add(files(
|
||||||
@ -27,7 +27,7 @@ index 59ff6d380c..8ded0dc18b 100644
|
|||||||
system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
|
system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
|
||||||
diff --git a/block/zeroinit.c b/block/zeroinit.c
|
diff --git a/block/zeroinit.c b/block/zeroinit.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..1f2032bf99
|
index 0000000000..696558d8d6
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/block/zeroinit.c
|
+++ b/block/zeroinit.c
|
||||||
@@ -0,0 +1,214 @@
|
@@ -0,0 +1,214 @@
|
||||||
@ -116,9 +116,9 @@ index 0000000000..1f2032bf99
|
|||||||
+ &child_of_bds,
|
+ &child_of_bds,
|
||||||
+ BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, false,
|
+ BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, false,
|
||||||
+ &local_err);
|
+ &local_err);
|
||||||
+ bdrv_graph_wrlock(bs);
|
+ bdrv_graph_wrlock();
|
||||||
+ bs->file = file;
|
+ bs->file = file;
|
||||||
+ bdrv_graph_wrunlock(bs);
|
+ bdrv_graph_wrunlock();
|
||||||
+ if (local_err) {
|
+ if (local_err) {
|
||||||
+ ret = -EINVAL;
|
+ ret = -EINVAL;
|
||||||
+ error_propagate(errp, local_err);
|
+ error_propagate(errp, local_err);
|
||||||
@ -131,9 +131,9 @@ index 0000000000..1f2032bf99
|
|||||||
+ ret = 0;
|
+ ret = 0;
|
||||||
+fail:
|
+fail:
|
||||||
+ if (ret < 0) {
|
+ if (ret < 0) {
|
||||||
+ bdrv_graph_wrlock(bs);
|
+ bdrv_graph_wrlock();
|
||||||
+ bdrv_unref_child(bs, bs->file);
|
+ bdrv_unref_child(bs, bs->file);
|
||||||
+ bdrv_graph_wrunlock(bs);
|
+ bdrv_graph_wrunlock();
|
||||||
+ }
|
+ }
|
||||||
+ qemu_opts_del(opts);
|
+ qemu_opts_del(opts);
|
||||||
+ return ret;
|
+ return ret;
|
||||||
|
@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
2 files changed, 11 insertions(+)
|
2 files changed, 11 insertions(+)
|
||||||
|
|
||||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||||
index 881b0b3c43..c17374916c 100644
|
index 511ab9415e..92e301d545 100644
|
||||||
--- a/qemu-options.hx
|
--- a/qemu-options.hx
|
||||||
+++ b/qemu-options.hx
|
+++ b/qemu-options.hx
|
||||||
@@ -1218,6 +1218,9 @@ legacy PC, they are not recommended for modern configurations.
|
@@ -1237,6 +1237,9 @@ legacy PC, they are not recommended for modern configurations.
|
||||||
|
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
@ -28,10 +28,10 @@ index 881b0b3c43..c17374916c 100644
|
|||||||
"-fda/-fdb file use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL)
|
"-fda/-fdb file use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL)
|
||||||
DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL)
|
DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL)
|
||||||
diff --git a/system/vl.c b/system/vl.c
|
diff --git a/system/vl.c b/system/vl.c
|
||||||
index 57f7ba0525..56d715c818 100644
|
index 2738ab7c91..20ebf2c920 100644
|
||||||
--- a/system/vl.c
|
--- a/system/vl.c
|
||||||
+++ b/system/vl.c
|
+++ b/system/vl.c
|
||||||
@@ -2751,6 +2751,7 @@ void qemu_init(int argc, char **argv)
|
@@ -2748,6 +2748,7 @@ void qemu_init(int argc, char **argv)
|
||||||
MachineClass *machine_class;
|
MachineClass *machine_class;
|
||||||
bool userconfig = true;
|
bool userconfig = true;
|
||||||
FILE *vmstate_dump_file = NULL;
|
FILE *vmstate_dump_file = NULL;
|
||||||
@ -39,7 +39,7 @@ index 57f7ba0525..56d715c818 100644
|
|||||||
|
|
||||||
qemu_add_opts(&qemu_drive_opts);
|
qemu_add_opts(&qemu_drive_opts);
|
||||||
qemu_add_drive_opts(&qemu_legacy_drive_opts);
|
qemu_add_drive_opts(&qemu_legacy_drive_opts);
|
||||||
@@ -3377,6 +3378,13 @@ void qemu_init(int argc, char **argv)
|
@@ -3371,6 +3372,13 @@ void qemu_init(int argc, char **argv)
|
||||||
machine_parse_property_opt(qemu_find_opts("smp-opts"),
|
machine_parse_property_opt(qemu_find_opts("smp-opts"),
|
||||||
"smp", optarg);
|
"smp", optarg);
|
||||||
break;
|
break;
|
||||||
|
@ -11,10 +11,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 9 insertions(+)
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
|
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
|
||||||
index bccb4241c2..bd0db7567a 100644
|
index d8fc1e2815..789694b8b3 100644
|
||||||
--- a/hw/intc/apic_common.c
|
--- a/hw/intc/apic_common.c
|
||||||
+++ b/hw/intc/apic_common.c
|
+++ b/hw/intc/apic_common.c
|
||||||
@@ -251,6 +251,15 @@ static void apic_reset_common(DeviceState *dev)
|
@@ -263,6 +263,15 @@ static void apic_reset_common(DeviceState *dev)
|
||||||
info->vapic_base_update(s);
|
info->vapic_base_update(s);
|
||||||
|
|
||||||
apic_init_reset(dev);
|
apic_init_reset(dev);
|
||||||
|
@ -9,14 +9,14 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|||||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
block/file-posix.c | 59 ++++++++++++++++++++++++++++++--------------
|
block/file-posix.c | 59 ++++++++++++++++++++++++++++++--------------
|
||||||
qapi/block-core.json | 3 ++-
|
qapi/block-core.json | 7 +++++-
|
||||||
2 files changed, 42 insertions(+), 20 deletions(-)
|
2 files changed, 46 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||||
index bc09aefe3b..36a53d8682 100644
|
index 43bc0bd520..60e98c87f1 100644
|
||||||
--- a/block/file-posix.c
|
--- a/block/file-posix.c
|
||||||
+++ b/block/file-posix.c
|
+++ b/block/file-posix.c
|
||||||
@@ -2873,6 +2873,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
@@ -2876,6 +2876,7 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||||
int fd;
|
int fd;
|
||||||
uint64_t perm, shared;
|
uint64_t perm, shared;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
@ -24,7 +24,7 @@ index bc09aefe3b..36a53d8682 100644
|
|||||||
|
|
||||||
/* Validate options and set default values */
|
/* Validate options and set default values */
|
||||||
assert(options->driver == BLOCKDEV_DRIVER_FILE);
|
assert(options->driver == BLOCKDEV_DRIVER_FILE);
|
||||||
@@ -2913,19 +2914,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
@@ -2916,19 +2917,22 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||||
perm = BLK_PERM_WRITE | BLK_PERM_RESIZE;
|
perm = BLK_PERM_WRITE | BLK_PERM_RESIZE;
|
||||||
shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE;
|
shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE;
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ index bc09aefe3b..36a53d8682 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the file by truncating it to 0 */
|
/* Clear the file by truncating it to 0 */
|
||||||
@@ -2979,13 +2983,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
@@ -2982,13 +2986,15 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
@ -82,7 +82,7 @@ index bc09aefe3b..36a53d8682 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
out_close:
|
out_close:
|
||||||
@@ -3009,6 +3015,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
@@ -3012,6 +3018,7 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
||||||
PreallocMode prealloc;
|
PreallocMode prealloc;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
@ -90,7 +90,7 @@ index bc09aefe3b..36a53d8682 100644
|
|||||||
|
|
||||||
/* Skip file: protocol prefix */
|
/* Skip file: protocol prefix */
|
||||||
strstart(filename, "file:", &filename);
|
strstart(filename, "file:", &filename);
|
||||||
@@ -3031,6 +3038,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
@@ -3034,6 +3041,18 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ index bc09aefe3b..36a53d8682 100644
|
|||||||
options = (BlockdevCreateOptions) {
|
options = (BlockdevCreateOptions) {
|
||||||
.driver = BLOCKDEV_DRIVER_FILE,
|
.driver = BLOCKDEV_DRIVER_FILE,
|
||||||
.u.file = {
|
.u.file = {
|
||||||
@@ -3042,6 +3061,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
@@ -3045,6 +3064,8 @@ raw_co_create_opts(BlockDriver *drv, const char *filename,
|
||||||
.nocow = nocow,
|
.nocow = nocow,
|
||||||
.has_extent_size_hint = has_extent_size_hint,
|
.has_extent_size_hint = has_extent_size_hint,
|
||||||
.extent_size_hint = extent_size_hint,
|
.extent_size_hint = extent_size_hint,
|
||||||
@ -119,10 +119,21 @@ index bc09aefe3b..36a53d8682 100644
|
|||||||
};
|
};
|
||||||
return raw_co_create(&options, errp);
|
return raw_co_create(&options, errp);
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index 8db0986e9e..299e3fc350 100644
|
index 45ab548dfe..f7c2b63c5d 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -4935,7 +4935,8 @@
|
@@ -4956,6 +4956,10 @@
|
||||||
|
# @extent-size-hint: Extent size hint to add to the image file; 0 for
|
||||||
|
# not adding an extent size hint (default: 1 MB, since 5.1)
|
||||||
|
#
|
||||||
|
+# @locking: whether to enable file locking. If set to 'auto', only
|
||||||
|
+# enable when Open File Descriptor (OFD) locking API is available
|
||||||
|
+# (default: auto).
|
||||||
|
+#
|
||||||
|
# Since: 2.12
|
||||||
|
##
|
||||||
|
{ 'struct': 'BlockdevCreateOptionsFile',
|
||||||
|
@@ -4963,7 +4967,8 @@
|
||||||
'size': 'size',
|
'size': 'size',
|
||||||
'*preallocation': 'PreallocMode',
|
'*preallocation': 'PreallocMode',
|
||||||
'*nocow': 'bool',
|
'*nocow': 'bool',
|
||||||
|
@ -26,10 +26,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
diff --git a/hw/core/machine.c b/hw/core/machine.c
|
||||||
index 0c17398141..36621d58a7 100644
|
index 37ede0e7d4..513e49bab1 100644
|
||||||
--- a/hw/core/machine.c
|
--- a/hw/core/machine.c
|
||||||
+++ b/hw/core/machine.c
|
+++ b/hw/core/machine.c
|
||||||
@@ -152,7 +152,8 @@ GlobalProperty hw_compat_4_0[] = {
|
@@ -161,7 +161,8 @@ GlobalProperty hw_compat_4_0[] = {
|
||||||
{ "virtio-vga", "edid", "false" },
|
{ "virtio-vga", "edid", "false" },
|
||||||
{ "virtio-gpu-device", "edid", "false" },
|
{ "virtio-gpu-device", "edid", "false" },
|
||||||
{ "virtio-device", "use-started", "false" },
|
{ "virtio-device", "use-started", "false" },
|
||||||
|
@ -21,10 +21,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
4 files changed, 35 insertions(+), 1 deletion(-)
|
4 files changed, 35 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
|
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
|
||||||
index 40821e2317..ee93ddd69a 100644
|
index 314351cdff..628a3537c5 100644
|
||||||
--- a/hw/core/machine-qmp-cmds.c
|
--- a/hw/core/machine-qmp-cmds.c
|
||||||
+++ b/hw/core/machine-qmp-cmds.c
|
+++ b/hw/core/machine-qmp-cmds.c
|
||||||
@@ -95,6 +95,11 @@ MachineInfoList *qmp_query_machines(Error **errp)
|
@@ -94,6 +94,11 @@ MachineInfoList *qmp_query_machines(Error **errp)
|
||||||
if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) {
|
if (strcmp(mc->name, MACHINE_GET_CLASS(current_machine)->name) == 0) {
|
||||||
info->has_is_current = true;
|
info->has_is_current = true;
|
||||||
info->is_current = true;
|
info->is_current = true;
|
||||||
@ -37,10 +37,10 @@ index 40821e2317..ee93ddd69a 100644
|
|||||||
|
|
||||||
if (mc->default_cpu_type) {
|
if (mc->default_cpu_type) {
|
||||||
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
diff --git a/include/hw/boards.h b/include/hw/boards.h
|
||||||
index da85f86efb..1aa0987020 100644
|
index 8b8f6d5c00..dd6d0a1447 100644
|
||||||
--- a/include/hw/boards.h
|
--- a/include/hw/boards.h
|
||||||
+++ b/include/hw/boards.h
|
+++ b/include/hw/boards.h
|
||||||
@@ -240,6 +240,8 @@ struct MachineClass {
|
@@ -246,6 +246,8 @@ struct MachineClass {
|
||||||
const char *desc;
|
const char *desc;
|
||||||
const char *deprecation_reason;
|
const char *deprecation_reason;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ index da85f86efb..1aa0987020 100644
|
|||||||
void (*reset)(MachineState *state, ShutdownCause reason);
|
void (*reset)(MachineState *state, ShutdownCause reason);
|
||||||
void (*wakeup)(MachineState *state);
|
void (*wakeup)(MachineState *state);
|
||||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||||
index 297ad0e0e5..a9fd40d844 100644
|
index a024d5b05d..1d69bffaa0 100644
|
||||||
--- a/qapi/machine.json
|
--- a/qapi/machine.json
|
||||||
+++ b/qapi/machine.json
|
+++ b/qapi/machine.json
|
||||||
@@ -168,6 +168,8 @@
|
@@ -168,6 +168,8 @@
|
||||||
@ -72,10 +72,10 @@ index 297ad0e0e5..a9fd40d844 100644
|
|||||||
##
|
##
|
||||||
# @query-machines:
|
# @query-machines:
|
||||||
diff --git a/system/vl.c b/system/vl.c
|
diff --git a/system/vl.c b/system/vl.c
|
||||||
index 56d715c818..87f03e61a1 100644
|
index 20ebf2c920..4d39e32097 100644
|
||||||
--- a/system/vl.c
|
--- a/system/vl.c
|
||||||
+++ b/system/vl.c
|
+++ b/system/vl.c
|
||||||
@@ -1660,6 +1660,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv,
|
@@ -1659,6 +1659,7 @@ static const QEMUOption *lookup_opt(int argc, char **argv,
|
||||||
static MachineClass *select_machine(QDict *qdict, Error **errp)
|
static MachineClass *select_machine(QDict *qdict, Error **errp)
|
||||||
{
|
{
|
||||||
const char *machine_type = qdict_get_try_str(qdict, "type");
|
const char *machine_type = qdict_get_try_str(qdict, "type");
|
||||||
@ -83,7 +83,7 @@ index 56d715c818..87f03e61a1 100644
|
|||||||
GSList *machines = object_class_get_list(TYPE_MACHINE, false);
|
GSList *machines = object_class_get_list(TYPE_MACHINE, false);
|
||||||
MachineClass *machine_class;
|
MachineClass *machine_class;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
@@ -1677,6 +1678,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
|
@@ -1676,6 +1677,11 @@ static MachineClass *select_machine(QDict *qdict, Error **errp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ index 56d715c818..87f03e61a1 100644
|
|||||||
g_slist_free(machines);
|
g_slist_free(machines);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_append_hint(&local_err, "Use -machine help to list supported machines\n");
|
error_append_hint(&local_err, "Use -machine help to list supported machines\n");
|
||||||
@@ -3319,12 +3325,31 @@ void qemu_init(int argc, char **argv)
|
@@ -3313,12 +3319,31 @@ void qemu_init(int argc, char **argv)
|
||||||
case QEMU_OPTION_machine:
|
case QEMU_OPTION_machine:
|
||||||
{
|
{
|
||||||
bool help;
|
bool help;
|
||||||
|
@ -25,7 +25,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/backup.c b/block/backup.c
|
diff --git a/block/backup.c b/block/backup.c
|
||||||
index 8aae5836d7..2516eac5a7 100644
|
index ec29d6b810..270957c0cd 100644
|
||||||
--- a/block/backup.c
|
--- a/block/backup.c
|
||||||
+++ b/block/backup.c
|
+++ b/block/backup.c
|
||||||
@@ -237,8 +237,8 @@ static void backup_init_bcs_bitmap(BackupBlockJob *job)
|
@@ -237,8 +237,8 @@ static void backup_init_bcs_bitmap(BackupBlockJob *job)
|
||||||
@ -50,7 +50,7 @@ index 8aae5836d7..2516eac5a7 100644
|
|||||||
int64_t count;
|
int64_t count;
|
||||||
@@ -501,6 +499,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
@@ -501,6 +499,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
bdrv_graph_wrunlock(target);
|
bdrv_graph_wrunlock();
|
||||||
|
|
||||||
+ backup_init_bcs_bitmap(job);
|
+ backup_init_bcs_bitmap(job);
|
||||||
+
|
+
|
||||||
|
@ -26,7 +26,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
create mode 100644 vma.h
|
create mode 100644 vma.h
|
||||||
|
|
||||||
diff --git a/block/meson.build b/block/meson.build
|
diff --git a/block/meson.build b/block/meson.build
|
||||||
index 8ded0dc18b..e709b67d37 100644
|
index b530e117b5..b245daa98e 100644
|
||||||
--- a/block/meson.build
|
--- a/block/meson.build
|
||||||
+++ b/block/meson.build
|
+++ b/block/meson.build
|
||||||
@@ -42,6 +42,8 @@ block_ss.add(files(
|
@@ -42,6 +42,8 @@ block_ss.add(files(
|
||||||
@ -39,10 +39,10 @@ index 8ded0dc18b..e709b67d37 100644
|
|||||||
system_ss.add(files('block-ram-registrar.c'))
|
system_ss.add(files('block-ram-registrar.c'))
|
||||||
|
|
||||||
diff --git a/meson.build b/meson.build
|
diff --git a/meson.build b/meson.build
|
||||||
index 6c77d9687d..8cb1ccd5e1 100644
|
index 91a0aa64c6..620cc594b2 100644
|
||||||
--- a/meson.build
|
--- a/meson.build
|
||||||
+++ b/meson.build
|
+++ b/meson.build
|
||||||
@@ -1802,6 +1802,8 @@ endif
|
@@ -1922,6 +1922,8 @@ endif
|
||||||
|
|
||||||
has_gettid = cc.has_function('gettid')
|
has_gettid = cc.has_function('gettid')
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ index 6c77d9687d..8cb1ccd5e1 100644
|
|||||||
# libselinux
|
# libselinux
|
||||||
selinux = dependency('libselinux',
|
selinux = dependency('libselinux',
|
||||||
required: get_option('selinux'),
|
required: get_option('selinux'),
|
||||||
@@ -3975,6 +3977,9 @@ if have_tools
|
@@ -4023,6 +4025,9 @@ if have_tools
|
||||||
dependencies: [blockdev, qemuutil, gnutls, selinux],
|
dependencies: [blockdev, qemuutil, gnutls, selinux],
|
||||||
install: true)
|
install: true)
|
||||||
|
|
||||||
@ -59,8 +59,8 @@ index 6c77d9687d..8cb1ccd5e1 100644
|
|||||||
+ dependencies: [authz, block, crypto, io, qom], install: true)
|
+ dependencies: [authz, block, crypto, io, qom], install: true)
|
||||||
+
|
+
|
||||||
subdir('storage-daemon')
|
subdir('storage-daemon')
|
||||||
subdir('contrib/rdmacm-mux')
|
|
||||||
subdir('contrib/elf2dmp')
|
foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
|
||||||
diff --git a/vma-reader.c b/vma-reader.c
|
diff --git a/vma-reader.c b/vma-reader.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..d0b6721812
|
index 0000000000..d0b6721812
|
||||||
|
@ -199,7 +199,7 @@ index 0000000000..e46abf1070
|
|||||||
+ return bs;
|
+ return bs;
|
||||||
+}
|
+}
|
||||||
diff --git a/block/backup.c b/block/backup.c
|
diff --git a/block/backup.c b/block/backup.c
|
||||||
index 2516eac5a7..aec140e0c8 100644
|
index 270957c0cd..16d611c4ca 100644
|
||||||
--- a/block/backup.c
|
--- a/block/backup.c
|
||||||
+++ b/block/backup.c
|
+++ b/block/backup.c
|
||||||
@@ -29,28 +29,6 @@
|
@@ -29,28 +29,6 @@
|
||||||
@ -247,7 +247,7 @@ index 2516eac5a7..aec140e0c8 100644
|
|||||||
if (perf->max_chunk && perf->max_chunk < cluster_size) {
|
if (perf->max_chunk && perf->max_chunk < cluster_size) {
|
||||||
error_setg(errp, "Required max-chunk (%" PRIi64 ") is less than backup "
|
error_setg(errp, "Required max-chunk (%" PRIi64 ") is less than backup "
|
||||||
diff --git a/block/meson.build b/block/meson.build
|
diff --git a/block/meson.build b/block/meson.build
|
||||||
index e709b67d37..f7d1b7ac42 100644
|
index b245daa98e..e99914eaa4 100644
|
||||||
--- a/block/meson.build
|
--- a/block/meson.build
|
||||||
+++ b/block/meson.build
|
+++ b/block/meson.build
|
||||||
@@ -4,6 +4,7 @@ block_ss.add(files(
|
@@ -4,6 +4,7 @@ block_ss.add(files(
|
||||||
@ -259,7 +259,7 @@ index e709b67d37..f7d1b7ac42 100644
|
|||||||
'blklogwrites.c',
|
'blklogwrites.c',
|
||||||
'blkverify.c',
|
'blkverify.c',
|
||||||
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
|
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
|
||||||
index 4e31d161c5..2fc6c37bc9 100644
|
index 761276127e..b3e6697613 100644
|
||||||
--- a/include/block/block_int-common.h
|
--- a/include/block/block_int-common.h
|
||||||
+++ b/include/block/block_int-common.h
|
+++ b/include/block/block_int-common.h
|
||||||
@@ -26,6 +26,7 @@
|
@@ -26,6 +26,7 @@
|
||||||
@ -312,7 +312,7 @@ index 4e31d161c5..2fc6c37bc9 100644
|
|||||||
BDRV_TRACKED_READ,
|
BDRV_TRACKED_READ,
|
||||||
BDRV_TRACKED_WRITE,
|
BDRV_TRACKED_WRITE,
|
||||||
diff --git a/job.c b/job.c
|
diff --git a/job.c b/job.c
|
||||||
index 99a2e54b54..d7a18b8e6a 100644
|
index 660ce22c56..baf54c8d60 100644
|
||||||
--- a/job.c
|
--- a/job.c
|
||||||
+++ b/job.c
|
+++ b/job.c
|
||||||
@@ -331,7 +331,8 @@ static bool job_started_locked(Job *job)
|
@@ -331,7 +331,8 @@ static bool job_started_locked(Job *job)
|
||||||
|
@ -11,10 +11,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
2 files changed, 46 insertions(+)
|
2 files changed, 46 insertions(+)
|
||||||
|
|
||||||
diff --git a/include/qemu/job.h b/include/qemu/job.h
|
diff --git a/include/qemu/job.h b/include/qemu/job.h
|
||||||
index b4bc2e174b..4586dc2d3c 100644
|
index 2b873f2576..528cd6acb9 100644
|
||||||
--- a/include/qemu/job.h
|
--- a/include/qemu/job.h
|
||||||
+++ b/include/qemu/job.h
|
+++ b/include/qemu/job.h
|
||||||
@@ -381,6 +381,18 @@ void job_unlock(void);
|
@@ -362,6 +362,18 @@ void job_unlock(void);
|
||||||
*/
|
*/
|
||||||
JobTxn *job_txn_new(void);
|
JobTxn *job_txn_new(void);
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ index b4bc2e174b..4586dc2d3c 100644
|
|||||||
* Release a reference that was previously acquired with job_txn_add_job or
|
* Release a reference that was previously acquired with job_txn_add_job or
|
||||||
* job_txn_new. If it's the last reference to the object, it will be freed.
|
* job_txn_new. If it's the last reference to the object, it will be freed.
|
||||||
diff --git a/job.c b/job.c
|
diff --git a/job.c b/job.c
|
||||||
index d7a18b8e6a..868df1b4ce 100644
|
index baf54c8d60..3ac5e5cde2 100644
|
||||||
--- a/job.c
|
--- a/job.c
|
||||||
+++ b/job.c
|
+++ b/job.c
|
||||||
@@ -94,6 +94,8 @@ struct JobTxn {
|
@@ -94,6 +94,8 @@ struct JobTxn {
|
||||||
@ -72,7 +72,7 @@ index d7a18b8e6a..868df1b4ce 100644
|
|||||||
/* Called with job_mutex held. */
|
/* Called with job_mutex held. */
|
||||||
static void job_txn_ref_locked(JobTxn *txn)
|
static void job_txn_ref_locked(JobTxn *txn)
|
||||||
{
|
{
|
||||||
@@ -1058,6 +1079,12 @@ static void job_completed_txn_success_locked(Job *job)
|
@@ -1042,6 +1063,12 @@ static void job_completed_txn_success_locked(Job *job)
|
||||||
*/
|
*/
|
||||||
QLIST_FOREACH(other_job, &txn->jobs, txn_list) {
|
QLIST_FOREACH(other_job, &txn->jobs, txn_list) {
|
||||||
if (!job_is_completed_locked(other_job)) {
|
if (!job_is_completed_locked(other_job)) {
|
||||||
@ -85,7 +85,7 @@ index d7a18b8e6a..868df1b4ce 100644
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(other_job->ret == 0);
|
assert(other_job->ret == 0);
|
||||||
@@ -1269,6 +1296,13 @@ int job_finish_sync_locked(Job *job,
|
@@ -1253,6 +1280,13 @@ int job_finish_sync_locked(Job *job,
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,17 +94,17 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
monitor/hmp-cmds.c | 72 +++
|
monitor/hmp-cmds.c | 72 +++
|
||||||
proxmox-backup-client.c | 146 +++++
|
proxmox-backup-client.c | 146 +++++
|
||||||
proxmox-backup-client.h | 60 ++
|
proxmox-backup-client.h | 60 ++
|
||||||
pve-backup.c | 1103 ++++++++++++++++++++++++++++++++
|
pve-backup.c | 1098 ++++++++++++++++++++++++++++++++
|
||||||
qapi/block-core.json | 229 +++++++
|
qapi/block-core.json | 233 +++++++
|
||||||
qapi/common.json | 14 +
|
qapi/common.json | 14 +
|
||||||
qapi/machine.json | 16 +-
|
qapi/machine.json | 16 +-
|
||||||
14 files changed, 1718 insertions(+), 14 deletions(-)
|
14 files changed, 1717 insertions(+), 14 deletions(-)
|
||||||
create mode 100644 proxmox-backup-client.c
|
create mode 100644 proxmox-backup-client.c
|
||||||
create mode 100644 proxmox-backup-client.h
|
create mode 100644 proxmox-backup-client.h
|
||||||
create mode 100644 pve-backup.c
|
create mode 100644 pve-backup.c
|
||||||
|
|
||||||
diff --git a/block/meson.build b/block/meson.build
|
diff --git a/block/meson.build b/block/meson.build
|
||||||
index f7d1b7ac42..9df99aceb5 100644
|
index e99914eaa4..6bba803f94 100644
|
||||||
--- a/block/meson.build
|
--- a/block/meson.build
|
||||||
+++ b/block/meson.build
|
+++ b/block/meson.build
|
||||||
@@ -44,6 +44,11 @@ block_ss.add(files(
|
@@ -44,6 +44,11 @@ block_ss.add(files(
|
||||||
@ -120,10 +120,10 @@ index f7d1b7ac42..9df99aceb5 100644
|
|||||||
system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
|
system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
|
||||||
system_ss.add(files('block-ram-registrar.c'))
|
system_ss.add(files('block-ram-registrar.c'))
|
||||||
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
|
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
|
||||||
index c729cbf1eb..1656859e03 100644
|
index d954bec6f1..5000c084c5 100644
|
||||||
--- a/block/monitor/block-hmp-cmds.c
|
--- a/block/monitor/block-hmp-cmds.c
|
||||||
+++ b/block/monitor/block-hmp-cmds.c
|
+++ b/block/monitor/block-hmp-cmds.c
|
||||||
@@ -1037,3 +1037,42 @@ void hmp_change_medium(Monitor *mon, const char *device, const char *target,
|
@@ -1008,3 +1008,42 @@ void hmp_change_medium(Monitor *mon, const char *device, const char *target,
|
||||||
qmp_blockdev_change_medium(device, NULL, target, arg, true, force,
|
qmp_blockdev_change_medium(device, NULL, target, arg, true, force,
|
||||||
!!read_only, read_only_mode, errp);
|
!!read_only, read_only_mode, errp);
|
||||||
}
|
}
|
||||||
@ -167,7 +167,7 @@ index c729cbf1eb..1656859e03 100644
|
|||||||
+ hmp_handle_error(mon, error);
|
+ hmp_handle_error(mon, error);
|
||||||
+}
|
+}
|
||||||
diff --git a/blockdev.c b/blockdev.c
|
diff --git a/blockdev.c b/blockdev.c
|
||||||
index 38a40e3e32..3049811be8 100644
|
index d27d8c38ec..5e5dbc1da9 100644
|
||||||
--- a/blockdev.c
|
--- a/blockdev.c
|
||||||
+++ b/blockdev.c
|
+++ b/blockdev.c
|
||||||
@@ -37,6 +37,7 @@
|
@@ -37,6 +37,7 @@
|
||||||
@ -179,7 +179,7 @@ index 38a40e3e32..3049811be8 100644
|
|||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
|
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
|
||||||
index 10fdd822e0..15937793c1 100644
|
index d5ab880492..6c97248d1b 100644
|
||||||
--- a/hmp-commands-info.hx
|
--- a/hmp-commands-info.hx
|
||||||
+++ b/hmp-commands-info.hx
|
+++ b/hmp-commands-info.hx
|
||||||
@@ -471,6 +471,20 @@ SRST
|
@@ -471,6 +471,20 @@ SRST
|
||||||
@ -204,7 +204,7 @@ index 10fdd822e0..15937793c1 100644
|
|||||||
{
|
{
|
||||||
.name = "usernet",
|
.name = "usernet",
|
||||||
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
diff --git a/hmp-commands.hx b/hmp-commands.hx
|
||||||
index 893c3bd240..5c1ffbc602 100644
|
index 7506de251c..d5f9c28194 100644
|
||||||
--- a/hmp-commands.hx
|
--- a/hmp-commands.hx
|
||||||
+++ b/hmp-commands.hx
|
+++ b/hmp-commands.hx
|
||||||
@@ -101,6 +101,35 @@ ERST
|
@@ -101,6 +101,35 @@ ERST
|
||||||
@ -265,10 +265,10 @@ index 7a7def7530..cba7afe70c 100644
|
|||||||
void hmp_device_add(Monitor *mon, const QDict *qdict);
|
void hmp_device_add(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_device_del(Monitor *mon, const QDict *qdict);
|
void hmp_device_del(Monitor *mon, const QDict *qdict);
|
||||||
diff --git a/meson.build b/meson.build
|
diff --git a/meson.build b/meson.build
|
||||||
index 8cb1ccd5e1..955f579308 100644
|
index 620cc594b2..d16b97cf3c 100644
|
||||||
--- a/meson.build
|
--- a/meson.build
|
||||||
+++ b/meson.build
|
+++ b/meson.build
|
||||||
@@ -1803,6 +1803,7 @@ endif
|
@@ -1923,6 +1923,7 @@ endif
|
||||||
has_gettid = cc.has_function('gettid')
|
has_gettid = cc.has_function('gettid')
|
||||||
|
|
||||||
libuuid = cc.find_library('uuid', required: true)
|
libuuid = cc.find_library('uuid', required: true)
|
||||||
@ -586,10 +586,10 @@ index 0000000000..8cbf645b2c
|
|||||||
+#endif /* PROXMOX_BACKUP_CLIENT_H */
|
+#endif /* PROXMOX_BACKUP_CLIENT_H */
|
||||||
diff --git a/pve-backup.c b/pve-backup.c
|
diff --git a/pve-backup.c b/pve-backup.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..903afcd7e9
|
index 0000000000..9c13a92623
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/pve-backup.c
|
+++ b/pve-backup.c
|
||||||
@@ -0,0 +1,1103 @@
|
@@ -0,0 +1,1098 @@
|
||||||
+#include "proxmox-backup-client.h"
|
+#include "proxmox-backup-client.h"
|
||||||
+#include "vma.h"
|
+#include "vma.h"
|
||||||
+
|
+
|
||||||
@ -1112,9 +1112,6 @@ index 0000000000..903afcd7e9
|
|||||||
+ sync_mode = MIRROR_SYNC_MODE_BITMAP;
|
+ sync_mode = MIRROR_SYNC_MODE_BITMAP;
|
||||||
+ bitmap_mode = BITMAP_SYNC_MODE_ON_SUCCESS;
|
+ bitmap_mode = BITMAP_SYNC_MODE_ON_SUCCESS;
|
||||||
+ }
|
+ }
|
||||||
+ AioContext *aio_context = bdrv_get_aio_context(di->bs);
|
|
||||||
+ aio_context_acquire(aio_context);
|
|
||||||
+
|
|
||||||
+ bdrv_drained_begin(di->bs);
|
+ bdrv_drained_begin(di->bs);
|
||||||
+
|
+
|
||||||
+ BlockJob *job = backup_job_create(
|
+ BlockJob *job = backup_job_create(
|
||||||
@ -1125,8 +1122,6 @@ index 0000000000..903afcd7e9
|
|||||||
+
|
+
|
||||||
+ bdrv_drained_end(di->bs);
|
+ bdrv_drained_end(di->bs);
|
||||||
+
|
+
|
||||||
+ aio_context_release(aio_context);
|
|
||||||
+
|
|
||||||
+ di->job = job;
|
+ di->job = job;
|
||||||
+ if (job) {
|
+ if (job) {
|
||||||
+ WITH_JOB_LOCK_GUARD() {
|
+ WITH_JOB_LOCK_GUARD() {
|
||||||
@ -1694,10 +1689,10 @@ index 0000000000..903afcd7e9
|
|||||||
+ return ret;
|
+ return ret;
|
||||||
+}
|
+}
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index 299e3fc350..c155d74230 100644
|
index f7c2b63c5d..e49c7b5bc9 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -841,6 +841,235 @@
|
@@ -851,6 +851,239 @@
|
||||||
{ 'command': 'query-block', 'returns': ['BlockInfo'],
|
{ 'command': 'query-block', 'returns': ['BlockInfo'],
|
||||||
'allow-preconfig': true }
|
'allow-preconfig': true }
|
||||||
|
|
||||||
@ -1766,6 +1761,9 @@ index 299e3fc350..c155d74230 100644
|
|||||||
+# @config-file: a configuration file to include into
|
+# @config-file: a configuration file to include into
|
||||||
+# the backup archive.
|
+# the backup archive.
|
||||||
+#
|
+#
|
||||||
|
+# @firewall-file: a firewall configuration file to include into the backup
|
||||||
|
+# archive.
|
||||||
|
+#
|
||||||
+# @speed: the maximum speed, in bytes per second
|
+# @speed: the maximum speed, in bytes per second
|
||||||
+#
|
+#
|
||||||
+# @devlist: list of block device names (separated by ',', ';'
|
+# @devlist: list of block device names (separated by ',', ';'
|
||||||
@ -1833,8 +1831,6 @@ index 299e3fc350..c155d74230 100644
|
|||||||
+#
|
+#
|
||||||
+# Cancel the current executing backup process.
|
+# Cancel the current executing backup process.
|
||||||
+#
|
+#
|
||||||
+# Returns: nothing on success
|
|
||||||
+#
|
|
||||||
+# Notes: This command succeeds even if there is no backup process running.
|
+# Notes: This command succeeds even if there is no backup process running.
|
||||||
+#
|
+#
|
||||||
+##
|
+##
|
||||||
@ -1858,6 +1854,9 @@ index 299e3fc350..c155d74230 100644
|
|||||||
+#
|
+#
|
||||||
+# @pbs-library-version: Running version of libproxmox-backup-qemu0 library.
|
+# @pbs-library-version: Running version of libproxmox-backup-qemu0 library.
|
||||||
+#
|
+#
|
||||||
|
+# @backup-max-workers: Whether the 'max-workers' @BackupPerf setting is
|
||||||
|
+# supported or not.
|
||||||
|
+#
|
||||||
+##
|
+##
|
||||||
+{ 'struct': 'ProxmoxSupportStatus',
|
+{ 'struct': 'ProxmoxSupportStatus',
|
||||||
+ 'data': { 'pbs-dirty-bitmap': 'bool',
|
+ 'data': { 'pbs-dirty-bitmap': 'bool',
|
||||||
@ -1934,10 +1933,10 @@ index 299e3fc350..c155d74230 100644
|
|||||||
# @BlockDeviceTimedStats:
|
# @BlockDeviceTimedStats:
|
||||||
#
|
#
|
||||||
diff --git a/qapi/common.json b/qapi/common.json
|
diff --git a/qapi/common.json b/qapi/common.json
|
||||||
index 6fed9cde1a..630a2a8f9a 100644
|
index 7558ce5430..6e3d800373 100644
|
||||||
--- a/qapi/common.json
|
--- a/qapi/common.json
|
||||||
+++ b/qapi/common.json
|
+++ b/qapi/common.json
|
||||||
@@ -207,3 +207,17 @@
|
@@ -200,3 +200,17 @@
|
||||||
##
|
##
|
||||||
{ 'struct': 'HumanReadableText',
|
{ 'struct': 'HumanReadableText',
|
||||||
'data': { 'human-readable-text': 'str' } }
|
'data': { 'human-readable-text': 'str' } }
|
||||||
@ -1956,7 +1955,7 @@ index 6fed9cde1a..630a2a8f9a 100644
|
|||||||
+##
|
+##
|
||||||
+{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }
|
+{ 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }
|
||||||
diff --git a/qapi/machine.json b/qapi/machine.json
|
diff --git a/qapi/machine.json b/qapi/machine.json
|
||||||
index a9fd40d844..d97f024173 100644
|
index 1d69bffaa0..731d8d2f60 100644
|
||||||
--- a/qapi/machine.json
|
--- a/qapi/machine.json
|
||||||
+++ b/qapi/machine.json
|
+++ b/qapi/machine.json
|
||||||
@@ -4,6 +4,8 @@
|
@@ -4,6 +4,8 @@
|
||||||
|
@ -14,10 +14,10 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|||||||
create mode 100644 pbs-restore.c
|
create mode 100644 pbs-restore.c
|
||||||
|
|
||||||
diff --git a/meson.build b/meson.build
|
diff --git a/meson.build b/meson.build
|
||||||
index 955f579308..c70f2a4937 100644
|
index d16b97cf3c..6de51c34cb 100644
|
||||||
--- a/meson.build
|
--- a/meson.build
|
||||||
+++ b/meson.build
|
+++ b/meson.build
|
||||||
@@ -3981,6 +3981,10 @@ if have_tools
|
@@ -4029,6 +4029,10 @@ if have_tools
|
||||||
vma = executable('vma', files('vma.c', 'vma-reader.c') + genh,
|
vma = executable('vma', files('vma.c', 'vma-reader.c') + genh,
|
||||||
dependencies: [authz, block, crypto, io, qom], install: true)
|
dependencies: [authz, block, crypto, io, qom], install: true)
|
||||||
|
|
||||||
@ -26,8 +26,8 @@ index 955f579308..c70f2a4937 100644
|
|||||||
+ libproxmox_backup_qemu], install: true)
|
+ libproxmox_backup_qemu], install: true)
|
||||||
+
|
+
|
||||||
subdir('storage-daemon')
|
subdir('storage-daemon')
|
||||||
subdir('contrib/rdmacm-mux')
|
|
||||||
subdir('contrib/elf2dmp')
|
foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
|
||||||
diff --git a/pbs-restore.c b/pbs-restore.c
|
diff --git a/pbs-restore.c b/pbs-restore.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..f03d9bab8d
|
index 0000000000..f03d9bab8d
|
||||||
|
@ -17,13 +17,13 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
block/meson.build | 2 +
|
block/meson.build | 2 +
|
||||||
block/pbs.c | 307 +++++++++++++++++++++++++++++++++++++++++++
|
block/pbs.c | 307 +++++++++++++++++++++++++++++++++++++++++++
|
||||||
meson.build | 2 +-
|
meson.build | 2 +-
|
||||||
qapi/block-core.json | 13 ++
|
qapi/block-core.json | 29 ++++
|
||||||
qapi/pragma.json | 1 +
|
qapi/pragma.json | 1 +
|
||||||
5 files changed, 324 insertions(+), 1 deletion(-)
|
5 files changed, 340 insertions(+), 1 deletion(-)
|
||||||
create mode 100644 block/pbs.c
|
create mode 100644 block/pbs.c
|
||||||
|
|
||||||
diff --git a/block/meson.build b/block/meson.build
|
diff --git a/block/meson.build b/block/meson.build
|
||||||
index 9df99aceb5..549c0c7103 100644
|
index 6bba803f94..1945e04eeb 100644
|
||||||
--- a/block/meson.build
|
--- a/block/meson.build
|
||||||
+++ b/block/meson.build
|
+++ b/block/meson.build
|
||||||
@@ -49,6 +49,8 @@ block_ss.add(files(
|
@@ -49,6 +49,8 @@ block_ss.add(files(
|
||||||
@ -349,10 +349,10 @@ index 0000000000..dd72356bd3
|
|||||||
+
|
+
|
||||||
+block_init(bdrv_pbs_init);
|
+block_init(bdrv_pbs_init);
|
||||||
diff --git a/meson.build b/meson.build
|
diff --git a/meson.build b/meson.build
|
||||||
index c70f2a4937..18c3a312eb 100644
|
index 6de51c34cb..3bc039f60f 100644
|
||||||
--- a/meson.build
|
--- a/meson.build
|
||||||
+++ b/meson.build
|
+++ b/meson.build
|
||||||
@@ -4390,7 +4390,7 @@ summary_info += {'bzip2 support': libbzip2}
|
@@ -4477,7 +4477,7 @@ summary_info += {'bzip2 support': libbzip2}
|
||||||
summary_info += {'lzfse support': liblzfse}
|
summary_info += {'lzfse support': liblzfse}
|
||||||
summary_info += {'zstd support': zstd}
|
summary_info += {'zstd support': zstd}
|
||||||
summary_info += {'NUMA host support': numa}
|
summary_info += {'NUMA host support': numa}
|
||||||
@ -362,10 +362,10 @@ index c70f2a4937..18c3a312eb 100644
|
|||||||
summary_info += {'libdaxctl support': libdaxctl}
|
summary_info += {'libdaxctl support': libdaxctl}
|
||||||
summary_info += {'libudev': libudev}
|
summary_info += {'libudev': libudev}
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index c155d74230..a4050268ca 100644
|
index e49c7b5bc9..fc32ff9957 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -3451,6 +3451,7 @@
|
@@ -3457,6 +3457,7 @@
|
||||||
'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum',
|
'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum',
|
||||||
'raw', 'rbd',
|
'raw', 'rbd',
|
||||||
{ 'name': 'replication', 'if': 'CONFIG_REPLICATION' },
|
{ 'name': 'replication', 'if': 'CONFIG_REPLICATION' },
|
||||||
@ -373,7 +373,7 @@ index c155d74230..a4050268ca 100644
|
|||||||
'ssh', 'throttle', 'vdi', 'vhdx',
|
'ssh', 'throttle', 'vdi', 'vhdx',
|
||||||
{ 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' },
|
{ 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' },
|
||||||
{ 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' },
|
{ 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' },
|
||||||
@@ -3537,6 +3538,17 @@
|
@@ -3543,6 +3544,33 @@
|
||||||
{ 'struct': 'BlockdevOptionsNull',
|
{ 'struct': 'BlockdevOptionsNull',
|
||||||
'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } }
|
'data': { '*size': 'int', '*latency-ns': 'uint64', '*read-zeroes': 'bool' } }
|
||||||
|
|
||||||
@ -382,6 +382,22 @@ index c155d74230..a4050268ca 100644
|
|||||||
+#
|
+#
|
||||||
+# Driver specific block device options for the PBS backend.
|
+# Driver specific block device options for the PBS backend.
|
||||||
+#
|
+#
|
||||||
|
+# @repository: Proxmox Backup Server repository.
|
||||||
|
+#
|
||||||
|
+# @snapshot: backup snapshots ID.
|
||||||
|
+#
|
||||||
|
+# @archive: archive name.
|
||||||
|
+#
|
||||||
|
+# @keyfile: keyfile to use for encryption.
|
||||||
|
+#
|
||||||
|
+# @password: password to use for connection.
|
||||||
|
+#
|
||||||
|
+# @fingerprint: backup server fingerprint.
|
||||||
|
+#
|
||||||
|
+# @key_password: password to unlock key.
|
||||||
|
+#
|
||||||
|
+# @namespace: namespace where backup snapshot lives.
|
||||||
|
+#
|
||||||
+##
|
+##
|
||||||
+{ 'struct': 'BlockdevOptionsPbs',
|
+{ 'struct': 'BlockdevOptionsPbs',
|
||||||
+ 'data': { 'repository': 'str', 'snapshot': 'str', 'archive': 'str',
|
+ 'data': { 'repository': 'str', 'snapshot': 'str', 'archive': 'str',
|
||||||
@ -391,7 +407,7 @@ index c155d74230..a4050268ca 100644
|
|||||||
##
|
##
|
||||||
# @BlockdevOptionsNVMe:
|
# @BlockdevOptionsNVMe:
|
||||||
#
|
#
|
||||||
@@ -4945,6 +4957,7 @@
|
@@ -4977,6 +5005,7 @@
|
||||||
'nfs': 'BlockdevOptionsNfs',
|
'nfs': 'BlockdevOptionsNfs',
|
||||||
'null-aio': 'BlockdevOptionsNull',
|
'null-aio': 'BlockdevOptionsNull',
|
||||||
'null-co': 'BlockdevOptionsNull',
|
'null-co': 'BlockdevOptionsNull',
|
||||||
@ -400,10 +416,10 @@ index c155d74230..a4050268ca 100644
|
|||||||
'nvme-io_uring': { 'type': 'BlockdevOptionsNvmeIoUring',
|
'nvme-io_uring': { 'type': 'BlockdevOptionsNvmeIoUring',
|
||||||
'if': 'CONFIG_BLKIO' },
|
'if': 'CONFIG_BLKIO' },
|
||||||
diff --git a/qapi/pragma.json b/qapi/pragma.json
|
diff --git a/qapi/pragma.json b/qapi/pragma.json
|
||||||
index eae9f54700..03467983b3 100644
|
index be8fa304c5..7ff46bd128 100644
|
||||||
--- a/qapi/pragma.json
|
--- a/qapi/pragma.json
|
||||||
+++ b/qapi/pragma.json
|
+++ b/qapi/pragma.json
|
||||||
@@ -45,6 +45,7 @@
|
@@ -100,6 +100,7 @@
|
||||||
'BlockInfo', # query-block
|
'BlockInfo', # query-block
|
||||||
'BlockdevAioOptions', # blockdev-add, -blockdev
|
'BlockdevAioOptions', # blockdev-add, -blockdev
|
||||||
'BlockdevDriver', # blockdev-add, query-blockstats, ...
|
'BlockdevDriver', # blockdev-add, query-blockstats, ...
|
||||||
|
@ -9,15 +9,15 @@ fitting.
|
|||||||
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
|
||||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
meson.build | 2 ++
|
meson.build | 3 ++-
|
||||||
os-posix.c | 7 +++++--
|
os-posix.c | 7 +++++--
|
||||||
2 files changed, 7 insertions(+), 2 deletions(-)
|
2 files changed, 7 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/meson.build b/meson.build
|
diff --git a/meson.build b/meson.build
|
||||||
index 18c3a312eb..b598a0450b 100644
|
index 3bc039f60f..067e8956a7 100644
|
||||||
--- a/meson.build
|
--- a/meson.build
|
||||||
+++ b/meson.build
|
+++ b/meson.build
|
||||||
@@ -1803,6 +1803,7 @@ endif
|
@@ -1923,6 +1923,7 @@ endif
|
||||||
has_gettid = cc.has_function('gettid')
|
has_gettid = cc.has_function('gettid')
|
||||||
|
|
||||||
libuuid = cc.find_library('uuid', required: true)
|
libuuid = cc.find_library('uuid', required: true)
|
||||||
@ -25,12 +25,13 @@ index 18c3a312eb..b598a0450b 100644
|
|||||||
libproxmox_backup_qemu = cc.find_library('proxmox_backup_qemu', required: true)
|
libproxmox_backup_qemu = cc.find_library('proxmox_backup_qemu', required: true)
|
||||||
|
|
||||||
# libselinux
|
# libselinux
|
||||||
@@ -3468,6 +3469,7 @@ if have_block
|
@@ -3530,7 +3531,7 @@ if have_block
|
||||||
# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
|
if host_os == 'windows'
|
||||||
# os-win32.c does not
|
system_ss.add(files('os-win32.c'))
|
||||||
blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
|
else
|
||||||
+ blockdev_ss.add(when: 'CONFIG_POSIX', if_true: libsystemd)
|
- blockdev_ss.add(files('os-posix.c'))
|
||||||
system_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
|
+ blockdev_ss.add(files('os-posix.c'), libsystemd)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
diff --git a/os-posix.c b/os-posix.c
|
diff --git a/os-posix.c b/os-posix.c
|
||||||
|
@ -26,10 +26,10 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
create mode 100644 migration/pbs-state.c
|
create mode 100644 migration/pbs-state.c
|
||||||
|
|
||||||
diff --git a/include/migration/misc.h b/include/migration/misc.h
|
diff --git a/include/migration/misc.h b/include/migration/misc.h
|
||||||
index 1bc8902e6d..43eb0e46d6 100644
|
index c9e200f4eb..12c99ebc69 100644
|
||||||
--- a/include/migration/misc.h
|
--- a/include/migration/misc.h
|
||||||
+++ b/include/migration/misc.h
|
+++ b/include/migration/misc.h
|
||||||
@@ -80,4 +80,7 @@ bool migration_in_bg_snapshot(void);
|
@@ -117,4 +117,7 @@ bool migration_in_bg_snapshot(void);
|
||||||
/* migration/block-dirty-bitmap.c */
|
/* migration/block-dirty-bitmap.c */
|
||||||
void dirty_bitmap_mig_init(void);
|
void dirty_bitmap_mig_init(void);
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ index 1bc8902e6d..43eb0e46d6 100644
|
|||||||
+
|
+
|
||||||
#endif
|
#endif
|
||||||
diff --git a/migration/meson.build b/migration/meson.build
|
diff --git a/migration/meson.build b/migration/meson.build
|
||||||
index 8f9d122187..2b9d2cc881 100644
|
index 800f12a60d..35a4306183 100644
|
||||||
--- a/migration/meson.build
|
--- a/migration/meson.build
|
||||||
+++ b/migration/meson.build
|
+++ b/migration/meson.build
|
||||||
@@ -7,7 +7,9 @@ migration_files = files(
|
@@ -7,7 +7,9 @@ migration_files = files(
|
||||||
@ -52,17 +52,17 @@ index 8f9d122187..2b9d2cc881 100644
|
|||||||
system_ss.add(files(
|
system_ss.add(files(
|
||||||
'block-dirty-bitmap.c',
|
'block-dirty-bitmap.c',
|
||||||
diff --git a/migration/migration.c b/migration/migration.c
|
diff --git a/migration/migration.c b/migration/migration.c
|
||||||
index 982ab85f04..b84924442d 100644
|
index 86bf76e925..b8d7e471a4 100644
|
||||||
--- a/migration/migration.c
|
--- a/migration/migration.c
|
||||||
+++ b/migration/migration.c
|
+++ b/migration/migration.c
|
||||||
@@ -202,6 +202,7 @@ void migration_object_init(void)
|
@@ -239,6 +239,7 @@ void migration_object_init(void)
|
||||||
blk_mig_init();
|
blk_mig_init();
|
||||||
ram_mig_init();
|
ram_mig_init();
|
||||||
dirty_bitmap_mig_init();
|
dirty_bitmap_mig_init();
|
||||||
+ pbs_state_mig_init();
|
+ pbs_state_mig_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void migration_cancel(const Error *error)
|
typedef struct {
|
||||||
diff --git a/migration/pbs-state.c b/migration/pbs-state.c
|
diff --git a/migration/pbs-state.c b/migration/pbs-state.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..887e998b9e
|
index 0000000000..887e998b9e
|
||||||
@ -174,10 +174,10 @@ index 0000000000..887e998b9e
|
|||||||
+ NULL);
|
+ NULL);
|
||||||
+}
|
+}
|
||||||
diff --git a/pve-backup.c b/pve-backup.c
|
diff --git a/pve-backup.c b/pve-backup.c
|
||||||
index 903afcd7e9..777db7938e 100644
|
index 9c13a92623..9d480a8eec 100644
|
||||||
--- a/pve-backup.c
|
--- a/pve-backup.c
|
||||||
+++ b/pve-backup.c
|
+++ b/pve-backup.c
|
||||||
@@ -1096,6 +1096,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
@@ -1091,6 +1091,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
||||||
ret->pbs_library_version = g_strdup(proxmox_backup_qemu_version());
|
ret->pbs_library_version = g_strdup(proxmox_backup_qemu_version());
|
||||||
ret->pbs_dirty_bitmap = true;
|
ret->pbs_dirty_bitmap = true;
|
||||||
ret->pbs_dirty_bitmap_savevm = true;
|
ret->pbs_dirty_bitmap_savevm = true;
|
||||||
@ -186,10 +186,10 @@ index 903afcd7e9..777db7938e 100644
|
|||||||
ret->pbs_masterkey = true;
|
ret->pbs_masterkey = true;
|
||||||
ret->backup_max_workers = true;
|
ret->backup_max_workers = true;
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index a4050268ca..7b977459fa 100644
|
index fc32ff9957..f516d8e95a 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -993,6 +993,11 @@
|
@@ -1004,6 +1004,11 @@
|
||||||
# @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can
|
# @pbs-dirty-bitmap-savevm: True if 'dirty-bitmaps' migration capability can
|
||||||
# safely be set for savevm-async.
|
# safely be set for savevm-async.
|
||||||
#
|
#
|
||||||
@ -201,7 +201,7 @@ index a4050268ca..7b977459fa 100644
|
|||||||
# @pbs-masterkey: True if the QMP backup call supports the 'master_keyfile'
|
# @pbs-masterkey: True if the QMP backup call supports the 'master_keyfile'
|
||||||
# parameter.
|
# parameter.
|
||||||
#
|
#
|
||||||
@@ -1003,6 +1008,7 @@
|
@@ -1017,6 +1022,7 @@
|
||||||
'data': { 'pbs-dirty-bitmap': 'bool',
|
'data': { 'pbs-dirty-bitmap': 'bool',
|
||||||
'query-bitmap-info': 'bool',
|
'query-bitmap-info': 'bool',
|
||||||
'pbs-dirty-bitmap-savevm': 'bool',
|
'pbs-dirty-bitmap-savevm': 'bool',
|
||||||
|
@ -19,7 +19,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
|
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
|
||||||
index 0070b13b6f..954be621ba 100644
|
index 2708abf3d7..fb17c01308 100644
|
||||||
--- a/migration/block-dirty-bitmap.c
|
--- a/migration/block-dirty-bitmap.c
|
||||||
+++ b/migration/block-dirty-bitmap.c
|
+++ b/migration/block-dirty-bitmap.c
|
||||||
@@ -540,7 +540,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
@@ -540,7 +540,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
||||||
|
@ -11,7 +11,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/block/stream.c b/block/stream.c
|
diff --git a/block/stream.c b/block/stream.c
|
||||||
index 01fe7c0f16..87a97cb8a2 100644
|
index 7031eef12b..d2da83ae7c 100644
|
||||||
--- a/block/stream.c
|
--- a/block/stream.c
|
||||||
+++ b/block/stream.c
|
+++ b/block/stream.c
|
||||||
@@ -27,7 +27,7 @@ enum {
|
@@ -27,7 +27,7 @@ enum {
|
||||||
|
@ -42,7 +42,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
|
|
||||||
diff --git a/block/alloc-track.c b/block/alloc-track.c
|
diff --git a/block/alloc-track.c b/block/alloc-track.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..14698c362e
|
index 0000000000..b9f8ea9137
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/block/alloc-track.c
|
+++ b/block/alloc-track.c
|
||||||
@@ -0,0 +1,366 @@
|
@@ -0,0 +1,366 @@
|
||||||
@ -140,9 +140,9 @@ index 0000000000..14698c362e
|
|||||||
+ file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
|
+ file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
|
||||||
+ BDRV_CHILD_DATA | BDRV_CHILD_METADATA, false,
|
+ BDRV_CHILD_DATA | BDRV_CHILD_METADATA, false,
|
||||||
+ &local_err);
|
+ &local_err);
|
||||||
+ bdrv_graph_wrlock(bs);
|
+ bdrv_graph_wrlock();
|
||||||
+ bs->file = file;
|
+ bs->file = file;
|
||||||
+ bdrv_graph_wrunlock(bs);
|
+ bdrv_graph_wrunlock();
|
||||||
+ if (local_err) {
|
+ if (local_err) {
|
||||||
+ ret = -EINVAL;
|
+ ret = -EINVAL;
|
||||||
+ error_propagate(errp, local_err);
|
+ error_propagate(errp, local_err);
|
||||||
@ -186,9 +186,9 @@ index 0000000000..14698c362e
|
|||||||
+
|
+
|
||||||
+fail:
|
+fail:
|
||||||
+ if (ret < 0) {
|
+ if (ret < 0) {
|
||||||
+ bdrv_graph_wrlock(bs);
|
+ bdrv_graph_wrlock();
|
||||||
+ bdrv_unref_child(bs, bs->file);
|
+ bdrv_unref_child(bs, bs->file);
|
||||||
+ bdrv_graph_wrunlock(bs);
|
+ bdrv_graph_wrunlock();
|
||||||
+ if (s->bitmap) {
|
+ if (s->bitmap) {
|
||||||
+ bdrv_release_dirty_bitmap(s->bitmap);
|
+ bdrv_release_dirty_bitmap(s->bitmap);
|
||||||
+ }
|
+ }
|
||||||
@ -413,7 +413,7 @@ index 0000000000..14698c362e
|
|||||||
+
|
+
|
||||||
+block_init(bdrv_alloc_track_init);
|
+block_init(bdrv_alloc_track_init);
|
||||||
diff --git a/block/meson.build b/block/meson.build
|
diff --git a/block/meson.build b/block/meson.build
|
||||||
index 549c0c7103..73777a1620 100644
|
index 1945e04eeb..2873f3a25a 100644
|
||||||
--- a/block/meson.build
|
--- a/block/meson.build
|
||||||
+++ b/block/meson.build
|
+++ b/block/meson.build
|
||||||
@@ -2,6 +2,7 @@ block_ss.add(genh)
|
@@ -2,6 +2,7 @@ block_ss.add(genh)
|
||||||
@ -425,10 +425,10 @@ index 549c0c7103..73777a1620 100644
|
|||||||
'backup.c',
|
'backup.c',
|
||||||
'backup-dump.c',
|
'backup-dump.c',
|
||||||
diff --git a/block/stream.c b/block/stream.c
|
diff --git a/block/stream.c b/block/stream.c
|
||||||
index 87a97cb8a2..3a04e95ee2 100644
|
index d2da83ae7c..f941cba14e 100644
|
||||||
--- a/block/stream.c
|
--- a/block/stream.c
|
||||||
+++ b/block/stream.c
|
+++ b/block/stream.c
|
||||||
@@ -114,6 +114,40 @@ static int stream_prepare(Job *job)
|
@@ -120,6 +120,40 @@ static int stream_prepare(Job *job)
|
||||||
ret = -EPERM;
|
ret = -EPERM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -451,11 +451,11 @@ index 87a97cb8a2..3a04e95ee2 100644
|
|||||||
+
|
+
|
||||||
+ bdrv_ref(unfiltered_bs); // unrefed by bdrv_replace_node()
|
+ bdrv_ref(unfiltered_bs); // unrefed by bdrv_replace_node()
|
||||||
+ bdrv_drained_begin(file_bs);
|
+ bdrv_drained_begin(file_bs);
|
||||||
+ bdrv_graph_wrlock(s->target_bs);
|
+ bdrv_graph_wrlock();
|
||||||
+
|
+
|
||||||
+ bdrv_replace_node(unfiltered_bs, file_bs, &local_err);
|
+ bdrv_replace_node(unfiltered_bs, file_bs, &local_err);
|
||||||
+
|
+
|
||||||
+ bdrv_graph_wrunlock(s->target_bs);
|
+ bdrv_graph_wrunlock();
|
||||||
+ bdrv_drained_end(file_bs);
|
+ bdrv_drained_end(file_bs);
|
||||||
+ bdrv_unref(unfiltered_bs);
|
+ bdrv_unref(unfiltered_bs);
|
||||||
+
|
+
|
@ -1,64 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Stefan Reiter <s.reiter@proxmox.com>
|
|
||||||
Date: Tue, 2 Mar 2021 16:11:54 +0100
|
|
||||||
Subject: [PATCH] block/io: accept NULL qiov in bdrv_pad_request
|
|
||||||
|
|
||||||
Some operations, e.g. block-stream, perform reads while discarding the
|
|
||||||
results (only copy-on-read matters). In this case they will pass NULL as
|
|
||||||
the target QEMUIOVector, which will however trip bdrv_pad_request, since
|
|
||||||
it wants to extend its passed vector.
|
|
||||||
|
|
||||||
If there is no qiov, no operation can be done with it, but the bytes
|
|
||||||
and offset still need to be updated, so the subsequent aligned read
|
|
||||||
will actually be aligned and not run into an assertion failure.
|
|
||||||
|
|
||||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|
||||||
[FE: do update bytes and offset in any case]
|
|
||||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|
||||||
---
|
|
||||||
block/io.c | 29 ++++++++++++++++-------------
|
|
||||||
1 file changed, 16 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/block/io.c b/block/io.c
|
|
||||||
index d202987770..d42c811bd7 100644
|
|
||||||
--- a/block/io.c
|
|
||||||
+++ b/block/io.c
|
|
||||||
@@ -1756,22 +1756,25 @@ static int bdrv_pad_request(BlockDriverState *bs,
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
- sliced_iov = qemu_iovec_slice(*qiov, *qiov_offset, *bytes,
|
|
||||||
- &sliced_head, &sliced_tail,
|
|
||||||
- &sliced_niov);
|
|
||||||
-
|
|
||||||
- /* Guaranteed by bdrv_check_request32() */
|
|
||||||
- assert(*bytes <= SIZE_MAX);
|
|
||||||
- ret = bdrv_create_padded_qiov(bs, pad, sliced_iov, sliced_niov,
|
|
||||||
- sliced_head, *bytes);
|
|
||||||
- if (ret < 0) {
|
|
||||||
- bdrv_padding_finalize(pad);
|
|
||||||
- return ret;
|
|
||||||
+ if (qiov && *qiov) {
|
|
||||||
+ sliced_iov = qemu_iovec_slice(*qiov, *qiov_offset, *bytes,
|
|
||||||
+ &sliced_head, &sliced_tail,
|
|
||||||
+ &sliced_niov);
|
|
||||||
+
|
|
||||||
+ /* Guaranteed by bdrv_check_request32() */
|
|
||||||
+ assert(*bytes <= SIZE_MAX);
|
|
||||||
+ ret = bdrv_create_padded_qiov(bs, pad, sliced_iov, sliced_niov,
|
|
||||||
+ sliced_head, *bytes);
|
|
||||||
+ if (ret < 0) {
|
|
||||||
+ bdrv_padding_finalize(pad);
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+ *qiov = &pad->local_qiov;
|
|
||||||
+ *qiov_offset = 0;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
*bytes += pad->head + pad->tail;
|
|
||||||
*offset -= pad->head;
|
|
||||||
- *qiov = &pad->local_qiov;
|
|
||||||
- *qiov_offset = 0;
|
|
||||||
if (padded) {
|
|
||||||
*padded = true;
|
|
||||||
}
|
|
@ -17,7 +17,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/alloc-track.c b/block/alloc-track.c
|
diff --git a/block/alloc-track.c b/block/alloc-track.c
|
||||||
index 14698c362e..dad8fe6375 100644
|
index b9f8ea9137..f3ed2935c4 100644
|
||||||
--- a/block/alloc-track.c
|
--- a/block/alloc-track.c
|
||||||
+++ b/block/alloc-track.c
|
+++ b/block/alloc-track.c
|
||||||
@@ -34,7 +34,6 @@ typedef struct {
|
@@ -34,7 +34,6 @@ typedef struct {
|
@ -20,7 +20,7 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
1 file changed, 26 deletions(-)
|
1 file changed, 26 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/alloc-track.c b/block/alloc-track.c
|
diff --git a/block/alloc-track.c b/block/alloc-track.c
|
||||||
index dad8fe6375..7aff9763ad 100644
|
index f3ed2935c4..29138dcc49 100644
|
||||||
--- a/block/alloc-track.c
|
--- a/block/alloc-track.c
|
||||||
+++ b/block/alloc-track.c
|
+++ b/block/alloc-track.c
|
||||||
@@ -25,15 +25,9 @@
|
@@ -25,15 +25,9 @@
|
||||||
@ -47,7 +47,7 @@ index dad8fe6375..7aff9763ad 100644
|
|||||||
-
|
-
|
||||||
fail:
|
fail:
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
bdrv_graph_wrlock(bs);
|
bdrv_graph_wrlock();
|
||||||
@@ -289,18 +281,8 @@ track_child_perm(BlockDriverState *bs, BdrvChild *c, BdrvChildRole role,
|
@@ -289,18 +281,8 @@ track_child_perm(BlockDriverState *bs, BdrvChild *c, BdrvChildRole role,
|
||||||
BlockReopenQueue *reopen_queue, uint64_t perm, uint64_t shared,
|
BlockReopenQueue *reopen_queue, uint64_t perm, uint64_t shared,
|
||||||
uint64_t *nperm, uint64_t *nshared)
|
uint64_t *nperm, uint64_t *nshared)
|
@ -33,7 +33,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||||
index 13972879b1..dbdbbca44e 100644
|
index 8aba27a71d..3e3af30c08 100644
|
||||||
--- a/block/copy-before-write.c
|
--- a/block/copy-before-write.c
|
||||||
+++ b/block/copy-before-write.c
|
+++ b/block/copy-before-write.c
|
||||||
@@ -364,9 +364,13 @@ cbw_child_perm(BlockDriverState *bs, BdrvChild *c, BdrvChildRole role,
|
@@ -364,9 +364,13 @@ cbw_child_perm(BlockDriverState *bs, BdrvChild *c, BdrvChildRole role,
|
@ -15,7 +15,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||||
index dbdbbca44e..2cbf6f9346 100644
|
index 3e3af30c08..6d89af0b29 100644
|
||||||
--- a/block/copy-before-write.c
|
--- a/block/copy-before-write.c
|
||||||
+++ b/block/copy-before-write.c
|
+++ b/block/copy-before-write.c
|
||||||
@@ -325,14 +325,24 @@ static int coroutine_fn GRAPH_RDLOCK
|
@@ -325,14 +325,24 @@ static int coroutine_fn GRAPH_RDLOCK
|
@ -49,10 +49,10 @@ index 9ee3dd7ef5..8fca2c3698 100644
|
|||||||
if (!copy_bitmap) {
|
if (!copy_bitmap) {
|
||||||
return NULL;
|
return NULL;
|
||||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||||
index 2cbf6f9346..afa5f473d2 100644
|
index 6d89af0b29..ed2c228da7 100644
|
||||||
--- a/block/copy-before-write.c
|
--- a/block/copy-before-write.c
|
||||||
+++ b/block/copy-before-write.c
|
+++ b/block/copy-before-write.c
|
||||||
@@ -472,7 +472,7 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
@@ -468,7 +468,7 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) &
|
((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) &
|
||||||
bs->file->bs->supported_zero_flags);
|
bs->file->bs->supported_zero_flags);
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ index 2cbf6f9346..afa5f473d2 100644
|
|||||||
+ s->bcs = block_copy_state_new(bs->file, s->target, bs, bitmap, errp);
|
+ s->bcs = block_copy_state_new(bs->file, s->target, bs, bitmap, errp);
|
||||||
if (!s->bcs) {
|
if (!s->bcs) {
|
||||||
error_prepend(errp, "Cannot create block-copy-state: ");
|
error_prepend(errp, "Cannot create block-copy-state: ");
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
|
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
|
||||||
index 0700953ab8..8b41643bfa 100644
|
index 0700953ab8..8b41643bfa 100644
|
||||||
--- a/include/block/block-copy.h
|
--- a/include/block/block-copy.h
|
@ -45,7 +45,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
10 files changed, 37 insertions(+), 8 deletions(-)
|
10 files changed, 37 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/backup.c b/block/backup.c
|
diff --git a/block/backup.c b/block/backup.c
|
||||||
index aec140e0c8..f19b751fe6 100644
|
index 16d611c4ca..1963e47ab9 100644
|
||||||
--- a/block/backup.c
|
--- a/block/backup.c
|
||||||
+++ b/block/backup.c
|
+++ b/block/backup.c
|
||||||
@@ -332,7 +332,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
@@ -332,7 +332,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||||
@ -109,7 +109,7 @@ index 8fca2c3698..7e3b378528 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||||
index afa5f473d2..5506f66857 100644
|
index ed2c228da7..cd65524e26 100644
|
||||||
--- a/block/copy-before-write.c
|
--- a/block/copy-before-write.c
|
||||||
+++ b/block/copy-before-write.c
|
+++ b/block/copy-before-write.c
|
||||||
@@ -44,6 +44,7 @@ typedef struct BDRVCopyBeforeWriteState {
|
@@ -44,6 +44,7 @@ typedef struct BDRVCopyBeforeWriteState {
|
||||||
@ -140,7 +140,7 @@ index afa5f473d2..5506f66857 100644
|
|||||||
*nshared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
|
*nshared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -472,7 +479,9 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
@@ -468,7 +475,9 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) &
|
((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) &
|
||||||
bs->file->bs->supported_zero_flags);
|
bs->file->bs->supported_zero_flags);
|
||||||
|
|
||||||
@ -150,8 +150,8 @@ index afa5f473d2..5506f66857 100644
|
|||||||
+ flags & BDRV_O_CBW_DISCARD_SOURCE, errp);
|
+ flags & BDRV_O_CBW_DISCARD_SOURCE, errp);
|
||||||
if (!s->bcs) {
|
if (!s->bcs) {
|
||||||
error_prepend(errp, "Cannot create block-copy-state: ");
|
error_prepend(errp, "Cannot create block-copy-state: ");
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
@@ -546,12 +555,14 @@ static BlockDriver bdrv_cbw_filter = {
|
@@ -535,12 +544,14 @@ static BlockDriver bdrv_cbw_filter = {
|
||||||
BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
||||||
BlockDriverState *target,
|
BlockDriverState *target,
|
||||||
const char *filter_node_name,
|
const char *filter_node_name,
|
||||||
@ -166,7 +166,7 @@ index afa5f473d2..5506f66857 100644
|
|||||||
|
|
||||||
assert(source->total_sectors == target->total_sectors);
|
assert(source->total_sectors == target->total_sectors);
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
@@ -564,7 +575,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
@@ -553,7 +564,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
||||||
qdict_put_str(opts, "file", bdrv_get_node_name(source));
|
qdict_put_str(opts, "file", bdrv_get_node_name(source));
|
||||||
qdict_put_str(opts, "target", bdrv_get_node_name(target));
|
qdict_put_str(opts, "target", bdrv_get_node_name(target));
|
||||||
|
|
||||||
@ -188,10 +188,10 @@ index 6e72bb25e9..01af0cd3c4 100644
|
|||||||
Error **errp);
|
Error **errp);
|
||||||
void bdrv_cbw_drop(BlockDriverState *bs);
|
void bdrv_cbw_drop(BlockDriverState *bs);
|
||||||
diff --git a/block/replication.c b/block/replication.c
|
diff --git a/block/replication.c b/block/replication.c
|
||||||
index 5ded5f1ca9..bd75a6aee3 100644
|
index ca6bd0a720..0415a5e8b7 100644
|
||||||
--- a/block/replication.c
|
--- a/block/replication.c
|
||||||
+++ b/block/replication.c
|
+++ b/block/replication.c
|
||||||
@@ -604,8 +604,8 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
@@ -582,8 +582,8 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
||||||
|
|
||||||
s->backup_job = backup_job_create(
|
s->backup_job = backup_job_create(
|
||||||
NULL, s->secondary_disk->bs, s->hidden_disk->bs,
|
NULL, s->secondary_disk->bs, s->hidden_disk->bs,
|
||||||
@ -203,10 +203,10 @@ index 5ded5f1ca9..bd75a6aee3 100644
|
|||||||
BLOCKDEV_ON_ERROR_REPORT, JOB_INTERNAL,
|
BLOCKDEV_ON_ERROR_REPORT, JOB_INTERNAL,
|
||||||
backup_job_completed, bs, NULL, &local_err);
|
backup_job_completed, bs, NULL, &local_err);
|
||||||
diff --git a/blockdev.c b/blockdev.c
|
diff --git a/blockdev.c b/blockdev.c
|
||||||
index 3049811be8..e167ad1e54 100644
|
index 5e5dbc1da9..1054a69279 100644
|
||||||
--- a/blockdev.c
|
--- a/blockdev.c
|
||||||
+++ b/blockdev.c
|
+++ b/blockdev.c
|
||||||
@@ -2854,7 +2854,7 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
@@ -2727,7 +2727,7 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
||||||
|
|
||||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||||
backup->sync, bmap, backup->bitmap_mode,
|
backup->sync, bmap, backup->bitmap_mode,
|
||||||
@ -216,10 +216,10 @@ index 3049811be8..e167ad1e54 100644
|
|||||||
&perf,
|
&perf,
|
||||||
backup->on_source_error,
|
backup->on_source_error,
|
||||||
diff --git a/include/block/block-common.h b/include/block/block-common.h
|
diff --git a/include/block/block-common.h b/include/block/block-common.h
|
||||||
index d7599564db..7f56364e73 100644
|
index a846023a09..338fe5ff7a 100644
|
||||||
--- a/include/block/block-common.h
|
--- a/include/block/block-common.h
|
||||||
+++ b/include/block/block-common.h
|
+++ b/include/block/block-common.h
|
||||||
@@ -246,6 +246,8 @@ typedef enum {
|
@@ -243,6 +243,8 @@ typedef enum {
|
||||||
read-write fails */
|
read-write fails */
|
||||||
#define BDRV_O_IO_URING 0x40000 /* use io_uring instead of the thread pool */
|
#define BDRV_O_IO_URING 0x40000 /* use io_uring instead of the thread pool */
|
||||||
|
|
||||||
@ -241,10 +241,10 @@ index 8b41643bfa..bdc703bacd 100644
|
|||||||
|
|
||||||
/* Function should be called prior any actual copy request */
|
/* Function should be called prior any actual copy request */
|
||||||
diff --git a/include/block/block_int-global-state.h b/include/block/block_int-global-state.h
|
diff --git a/include/block/block_int-global-state.h b/include/block/block_int-global-state.h
|
||||||
index 57265a617a..df731688b4 100644
|
index cc1387ae02..f0c642b194 100644
|
||||||
--- a/include/block/block_int-global-state.h
|
--- a/include/block/block_int-global-state.h
|
||||||
+++ b/include/block/block_int-global-state.h
|
+++ b/include/block/block_int-global-state.h
|
||||||
@@ -189,7 +189,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
@@ -195,7 +195,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||||
MirrorSyncMode sync_mode,
|
MirrorSyncMode sync_mode,
|
||||||
BdrvDirtyBitmap *sync_bitmap,
|
BdrvDirtyBitmap *sync_bitmap,
|
||||||
BitmapSyncMode bitmap_mode,
|
BitmapSyncMode bitmap_mode,
|
||||||
@ -254,10 +254,10 @@ index 57265a617a..df731688b4 100644
|
|||||||
BackupPerf *perf,
|
BackupPerf *perf,
|
||||||
BlockdevOnError on_source_error,
|
BlockdevOnError on_source_error,
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index 7b977459fa..82960797dc 100644
|
index f516d8e95a..d796d49abb 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -1834,6 +1834,9 @@
|
@@ -1849,6 +1849,9 @@
|
||||||
# node specified by @drive. If this option is not given, a node
|
# node specified by @drive. If this option is not given, a node
|
||||||
# name is autogenerated. (Since: 4.2)
|
# name is autogenerated. (Since: 4.2)
|
||||||
#
|
#
|
||||||
@ -267,7 +267,7 @@ index 7b977459fa..82960797dc 100644
|
|||||||
# @x-perf: Performance options. (Since 6.0)
|
# @x-perf: Performance options. (Since 6.0)
|
||||||
#
|
#
|
||||||
# Features:
|
# Features:
|
||||||
@@ -1855,6 +1858,7 @@
|
@@ -1870,6 +1873,7 @@
|
||||||
'*on-target-error': 'BlockdevOnError',
|
'*on-target-error': 'BlockdevOnError',
|
||||||
'*auto-finalize': 'bool', '*auto-dismiss': 'bool',
|
'*auto-finalize': 'bool', '*auto-dismiss': 'bool',
|
||||||
'*filter-node-name': 'str',
|
'*filter-node-name': 'str',
|
@ -82,10 +82,10 @@ index 7e3b378528..adb1cbb440 100644
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||||
index 5506f66857..fbc5aeb9eb 100644
|
index cd65524e26..ac05a4993f 100644
|
||||||
--- a/block/copy-before-write.c
|
--- a/block/copy-before-write.c
|
||||||
+++ b/block/copy-before-write.c
|
+++ b/block/copy-before-write.c
|
||||||
@@ -481,7 +481,8 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
@@ -477,7 +477,8 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
|
|
||||||
s->discard_source = flags & BDRV_O_CBW_DISCARD_SOURCE;
|
s->discard_source = flags & BDRV_O_CBW_DISCARD_SOURCE;
|
||||||
s->bcs = block_copy_state_new(bs->file, s->target, bs, bitmap,
|
s->bcs = block_copy_state_new(bs->file, s->target, bs, bitmap,
|
||||||
@ -94,7 +94,7 @@ index 5506f66857..fbc5aeb9eb 100644
|
|||||||
+ opts->min_cluster_size, errp);
|
+ opts->min_cluster_size, errp);
|
||||||
if (!s->bcs) {
|
if (!s->bcs) {
|
||||||
error_prepend(errp, "Cannot create block-copy-state: ");
|
error_prepend(errp, "Cannot create block-copy-state: ");
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
|
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
|
||||||
index bdc703bacd..77857c6c68 100644
|
index bdc703bacd..77857c6c68 100644
|
||||||
--- a/include/block/block-copy.h
|
--- a/include/block/block-copy.h
|
||||||
@ -108,12 +108,12 @@ index bdc703bacd..77857c6c68 100644
|
|||||||
|
|
||||||
/* Function should be called prior any actual copy request */
|
/* Function should be called prior any actual copy request */
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index 82960797dc..f2fec625cc 100644
|
index d796d49abb..edbf6e78b9 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -4880,12 +4880,18 @@
|
@@ -4930,12 +4930,18 @@
|
||||||
# @on-cbw-error parameter will decide how this failure is handled.
|
# @on-cbw-error parameter will decide how this failure is handled.
|
||||||
# Default 0. (Since 7.1)
|
# Default 0. (Since 7.1)
|
||||||
#
|
#
|
||||||
+# @min-cluster-size: Minimum size of blocks used by copy-before-write
|
+# @min-cluster-size: Minimum size of blocks used by copy-before-write
|
||||||
+# operations. Has to be a power of 2. No effect if smaller than
|
+# operations. Has to be a power of 2. No effect if smaller than
|
@ -23,7 +23,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
5 files changed, 14 insertions(+), 3 deletions(-)
|
5 files changed, 14 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/backup.c b/block/backup.c
|
diff --git a/block/backup.c b/block/backup.c
|
||||||
index f19b751fe6..4367278d68 100644
|
index 1963e47ab9..fe69723ada 100644
|
||||||
--- a/block/backup.c
|
--- a/block/backup.c
|
||||||
+++ b/block/backup.c
|
+++ b/block/backup.c
|
||||||
@@ -434,7 +434,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
@@ -434,7 +434,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
|
||||||
@ -36,10 +36,10 @@ index f19b751fe6..4367278d68 100644
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
|
||||||
index fbc5aeb9eb..3d5523992c 100644
|
index ac05a4993f..d1e87f8cf4 100644
|
||||||
--- a/block/copy-before-write.c
|
--- a/block/copy-before-write.c
|
||||||
+++ b/block/copy-before-write.c
|
+++ b/block/copy-before-write.c
|
||||||
@@ -557,6 +557,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
@@ -546,6 +546,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
||||||
BlockDriverState *target,
|
BlockDriverState *target,
|
||||||
const char *filter_node_name,
|
const char *filter_node_name,
|
||||||
bool discard_source,
|
bool discard_source,
|
||||||
@ -47,7 +47,7 @@ index fbc5aeb9eb..3d5523992c 100644
|
|||||||
BlockCopyState **bcs,
|
BlockCopyState **bcs,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
@@ -575,6 +576,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
@@ -564,6 +565,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
|
||||||
}
|
}
|
||||||
qdict_put_str(opts, "file", bdrv_get_node_name(source));
|
qdict_put_str(opts, "file", bdrv_get_node_name(source));
|
||||||
qdict_put_str(opts, "target", bdrv_get_node_name(target));
|
qdict_put_str(opts, "target", bdrv_get_node_name(target));
|
||||||
@ -68,10 +68,10 @@ index 01af0cd3c4..dc6cafe7fa 100644
|
|||||||
Error **errp);
|
Error **errp);
|
||||||
void bdrv_cbw_drop(BlockDriverState *bs);
|
void bdrv_cbw_drop(BlockDriverState *bs);
|
||||||
diff --git a/blockdev.c b/blockdev.c
|
diff --git a/blockdev.c b/blockdev.c
|
||||||
index e167ad1e54..35ec5d8f0b 100644
|
index 1054a69279..cbe224387b 100644
|
||||||
--- a/blockdev.c
|
--- a/blockdev.c
|
||||||
+++ b/blockdev.c
|
+++ b/blockdev.c
|
||||||
@@ -2781,6 +2781,9 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
@@ -2654,6 +2654,9 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
||||||
if (backup->x_perf->has_max_chunk) {
|
if (backup->x_perf->has_max_chunk) {
|
||||||
perf.max_chunk = backup->x_perf->max_chunk;
|
perf.max_chunk = backup->x_perf->max_chunk;
|
||||||
}
|
}
|
||||||
@ -82,10 +82,10 @@ index e167ad1e54..35ec5d8f0b 100644
|
|||||||
|
|
||||||
if ((backup->sync == MIRROR_SYNC_MODE_BITMAP) ||
|
if ((backup->sync == MIRROR_SYNC_MODE_BITMAP) ||
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index f2fec625cc..48eec4ef29 100644
|
index edbf6e78b9..6e7ee87633 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -1775,11 +1775,16 @@
|
@@ -1790,11 +1790,16 @@
|
||||||
# it should not be less than job cluster size which is calculated
|
# it should not be less than job cluster size which is calculated
|
||||||
# as maximum of target image cluster size and 64k. Default 0.
|
# as maximum of target image cluster size and 64k. Default 0.
|
||||||
#
|
#
|
@ -63,15 +63,15 @@ Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
|||||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
block/monitor/block-hmp-cmds.c | 1 +
|
block/monitor/block-hmp-cmds.c | 1 +
|
||||||
pve-backup.c | 145 ++++++++++++++++++++++++++++++++-
|
pve-backup.c | 143 ++++++++++++++++++++++++++++++++-
|
||||||
qapi/block-core.json | 8 +-
|
qapi/block-core.json | 10 ++-
|
||||||
3 files changed, 150 insertions(+), 4 deletions(-)
|
3 files changed, 150 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
|
diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
|
||||||
index 1656859e03..f6cc9e5cf7 100644
|
index 5000c084c5..70b3de4c7e 100644
|
||||||
--- a/block/monitor/block-hmp-cmds.c
|
--- a/block/monitor/block-hmp-cmds.c
|
||||||
+++ b/block/monitor/block-hmp-cmds.c
|
+++ b/block/monitor/block-hmp-cmds.c
|
||||||
@@ -1072,6 +1072,7 @@ void coroutine_fn hmp_backup(Monitor *mon, const QDict *qdict)
|
@@ -1043,6 +1043,7 @@ void coroutine_fn hmp_backup(Monitor *mon, const QDict *qdict)
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
devlist, qdict_haskey(qdict, "speed"), speed,
|
devlist, qdict_haskey(qdict, "speed"), speed,
|
||||||
false, 0, // BackupPerf max-workers
|
false, 0, // BackupPerf max-workers
|
||||||
@ -80,7 +80,7 @@ index 1656859e03..f6cc9e5cf7 100644
|
|||||||
|
|
||||||
hmp_handle_error(mon, error);
|
hmp_handle_error(mon, error);
|
||||||
diff --git a/pve-backup.c b/pve-backup.c
|
diff --git a/pve-backup.c b/pve-backup.c
|
||||||
index 777db7938e..4c728951ac 100644
|
index 9d480a8eec..7cc1dd3724 100644
|
||||||
--- a/pve-backup.c
|
--- a/pve-backup.c
|
||||||
+++ b/pve-backup.c
|
+++ b/pve-backup.c
|
||||||
@@ -7,9 +7,11 @@
|
@@ -7,9 +7,11 @@
|
||||||
@ -137,8 +137,8 @@ index 777db7938e..4c728951ac 100644
|
|||||||
/*
|
/*
|
||||||
* Needs to happen outside of coroutine, because it takes the graph write lock.
|
* Needs to happen outside of coroutine, because it takes the graph write lock.
|
||||||
*/
|
*/
|
||||||
@@ -525,9 +553,84 @@ static void create_backup_jobs_bh(void *opaque) {
|
@@ -522,9 +550,82 @@ static void create_backup_jobs_bh(void *opaque) {
|
||||||
|
}
|
||||||
bdrv_drained_begin(di->bs);
|
bdrv_drained_begin(di->bs);
|
||||||
|
|
||||||
+ BackupPerf perf = (BackupPerf){ .max_workers = backup_state.perf.max_workers };
|
+ BackupPerf perf = (BackupPerf){ .max_workers = backup_state.perf.max_workers };
|
||||||
@ -187,10 +187,8 @@ index 777db7938e..4c728951ac 100644
|
|||||||
+ * will aquire it a second time. But it's allowed to be held exactly once when polling
|
+ * will aquire it a second time. But it's allowed to be held exactly once when polling
|
||||||
+ * and that happens when the bdrv_refresh_total_sectors() call is made there.
|
+ * and that happens when the bdrv_refresh_total_sectors() call is made there.
|
||||||
+ */
|
+ */
|
||||||
+ aio_context_release(aio_context);
|
|
||||||
+ di->fleecing.snapshot_access =
|
+ di->fleecing.snapshot_access =
|
||||||
+ bdrv_open(NULL, NULL, snapshot_access_opts, BDRV_O_RDWR | BDRV_O_UNMAP, &local_err);
|
+ bdrv_open(NULL, NULL, snapshot_access_opts, BDRV_O_RDWR | BDRV_O_UNMAP, &local_err);
|
||||||
+ aio_context_acquire(aio_context);
|
|
||||||
+ if (!di->fleecing.snapshot_access) {
|
+ if (!di->fleecing.snapshot_access) {
|
||||||
+ error_setg(errp, "setting up snapshot access for fleecing failed: %s",
|
+ error_setg(errp, "setting up snapshot access for fleecing failed: %s",
|
||||||
+ local_err ? error_get_pretty(local_err) : "unknown error");
|
+ local_err ? error_get_pretty(local_err) : "unknown error");
|
||||||
@ -224,7 +222,7 @@ index 777db7938e..4c728951ac 100644
|
|||||||
BLOCKDEV_ON_ERROR_REPORT, JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn,
|
BLOCKDEV_ON_ERROR_REPORT, JOB_DEFAULT, pvebackup_complete_cb, di, backup_state.txn,
|
||||||
&local_err);
|
&local_err);
|
||||||
|
|
||||||
@@ -585,6 +688,14 @@ static void create_backup_jobs_bh(void *opaque) {
|
@@ -580,6 +681,14 @@ static void create_backup_jobs_bh(void *opaque) {
|
||||||
aio_co_enter(data->ctx, data->co);
|
aio_co_enter(data->ctx, data->co);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +237,7 @@ index 777db7938e..4c728951ac 100644
|
|||||||
/*
|
/*
|
||||||
* Returns a list of device infos, which needs to be freed by the caller. In
|
* Returns a list of device infos, which needs to be freed by the caller. In
|
||||||
* case of an error, errp will be set, but the returned value might still be a
|
* case of an error, errp will be set, but the returned value might still be a
|
||||||
@@ -592,6 +703,7 @@ static void create_backup_jobs_bh(void *opaque) {
|
@@ -587,6 +696,7 @@ static void create_backup_jobs_bh(void *opaque) {
|
||||||
*/
|
*/
|
||||||
static GList coroutine_fn GRAPH_RDLOCK *get_device_info(
|
static GList coroutine_fn GRAPH_RDLOCK *get_device_info(
|
||||||
const char *devlist,
|
const char *devlist,
|
||||||
@ -247,7 +245,7 @@ index 777db7938e..4c728951ac 100644
|
|||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
gchar **devs = NULL;
|
gchar **devs = NULL;
|
||||||
@@ -615,6 +727,31 @@ static GList coroutine_fn GRAPH_RDLOCK *get_device_info(
|
@@ -610,6 +720,31 @@ static GList coroutine_fn GRAPH_RDLOCK *get_device_info(
|
||||||
}
|
}
|
||||||
PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1);
|
PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1);
|
||||||
di->bs = bs;
|
di->bs = bs;
|
||||||
@ -279,7 +277,7 @@ index 777db7938e..4c728951ac 100644
|
|||||||
di_list = g_list_append(di_list, di);
|
di_list = g_list_append(di_list, di);
|
||||||
d++;
|
d++;
|
||||||
}
|
}
|
||||||
@@ -664,6 +801,7 @@ UuidInfo coroutine_fn *qmp_backup(
|
@@ -659,6 +794,7 @@ UuidInfo coroutine_fn *qmp_backup(
|
||||||
const char *devlist,
|
const char *devlist,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_max_workers, int64_t max_workers,
|
bool has_max_workers, int64_t max_workers,
|
||||||
@ -287,7 +285,7 @@ index 777db7938e..4c728951ac 100644
|
|||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
assert(qemu_in_coroutine());
|
assert(qemu_in_coroutine());
|
||||||
@@ -692,7 +830,7 @@ UuidInfo coroutine_fn *qmp_backup(
|
@@ -687,7 +823,7 @@ UuidInfo coroutine_fn *qmp_backup(
|
||||||
format = has_format ? format : BACKUP_FORMAT_VMA;
|
format = has_format ? format : BACKUP_FORMAT_VMA;
|
||||||
|
|
||||||
bdrv_graph_co_rdlock();
|
bdrv_graph_co_rdlock();
|
||||||
@ -296,7 +294,7 @@ index 777db7938e..4c728951ac 100644
|
|||||||
bdrv_graph_co_rdunlock();
|
bdrv_graph_co_rdunlock();
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
@@ -1100,5 +1238,6 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
@@ -1095,5 +1231,6 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
||||||
ret->query_bitmap_info = true;
|
ret->query_bitmap_info = true;
|
||||||
ret->pbs_masterkey = true;
|
ret->pbs_masterkey = true;
|
||||||
ret->backup_max_workers = true;
|
ret->backup_max_workers = true;
|
||||||
@ -304,10 +302,10 @@ index 777db7938e..4c728951ac 100644
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||||
index 48eec4ef29..1c036e488e 100644
|
index 6e7ee87633..dc5f75cd39 100644
|
||||||
--- a/qapi/block-core.json
|
--- a/qapi/block-core.json
|
||||||
+++ b/qapi/block-core.json
|
+++ b/qapi/block-core.json
|
||||||
@@ -935,6 +935,10 @@
|
@@ -948,6 +948,10 @@
|
||||||
#
|
#
|
||||||
# @max-workers: see @BackupPerf for details. Default 16.
|
# @max-workers: see @BackupPerf for details. Default 16.
|
||||||
#
|
#
|
||||||
@ -318,7 +316,7 @@ index 48eec4ef29..1c036e488e 100644
|
|||||||
# Returns: the uuid of the backup job
|
# Returns: the uuid of the backup job
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
@@ -955,7 +959,8 @@
|
@@ -968,7 +972,8 @@
|
||||||
'*firewall-file': 'str',
|
'*firewall-file': 'str',
|
||||||
'*devlist': 'str',
|
'*devlist': 'str',
|
||||||
'*speed': 'int',
|
'*speed': 'int',
|
||||||
@ -328,7 +326,16 @@ index 48eec4ef29..1c036e488e 100644
|
|||||||
'returns': 'UuidInfo', 'coroutine': true }
|
'returns': 'UuidInfo', 'coroutine': true }
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -1011,6 +1016,7 @@
|
@@ -1014,6 +1019,8 @@
|
||||||
|
#
|
||||||
|
# @pbs-library-version: Running version of libproxmox-backup-qemu0 library.
|
||||||
|
#
|
||||||
|
+# @backup-fleecing: Whether backup fleecing is supported or not.
|
||||||
|
+#
|
||||||
|
# @backup-max-workers: Whether the 'max-workers' @BackupPerf setting is
|
||||||
|
# supported or not.
|
||||||
|
#
|
||||||
|
@@ -1025,6 +1032,7 @@
|
||||||
'pbs-dirty-bitmap-migration': 'bool',
|
'pbs-dirty-bitmap-migration': 'bool',
|
||||||
'pbs-masterkey': 'bool',
|
'pbs-masterkey': 'bool',
|
||||||
'pbs-library-version': 'str',
|
'pbs-library-version': 'str',
|
32
debian/patches/series
vendored
32
debian/patches/series
vendored
@ -1,10 +1,7 @@
|
|||||||
extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
|
extra/0001-monitor-qmp-fix-race-with-clients-disconnecting-earl.patch
|
||||||
extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
|
extra/0002-scsi-megasas-Internal-cdbs-have-16-byte-length.patch
|
||||||
extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
|
extra/0003-ide-avoid-potential-deadlock-when-draining-during-tr.patch
|
||||||
extra/0004-migration-block-dirty-bitmap-fix-loading-bitmap-when.patch
|
extra/0004-Revert-x86-acpi-workaround-Windows-not-handling-name.patch
|
||||||
extra/0005-Revert-x86-acpi-workaround-Windows-not-handling-name.patch
|
|
||||||
extra/0006-qemu_init-increase-NOFILE-soft-limit-on-POSIX.patch
|
|
||||||
extra/0007-mirror-Don-t-call-job_pause_point-under-graph-lock.patch
|
|
||||||
bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
|
bitmap-mirror/0001-drive-mirror-add-support-for-sync-bitmap-mode-never.patch
|
||||||
bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
|
bitmap-mirror/0002-drive-mirror-add-support-for-conditional-and-always-.patch
|
||||||
bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
|
bitmap-mirror/0003-mirror-add-check-for-bitmap-mode-without-bitmap.patch
|
||||||
@ -48,17 +45,16 @@ pve/0034-PVE-Migrate-dirty-bitmap-state-via-savevm.patch
|
|||||||
pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
|
pve/0035-migration-block-dirty-bitmap-migrate-other-bitmaps-e.patch
|
||||||
pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
|
pve/0036-PVE-fall-back-to-open-iscsi-initiatorname.patch
|
||||||
pve/0037-PVE-block-stream-increase-chunk-size.patch
|
pve/0037-PVE-block-stream-increase-chunk-size.patch
|
||||||
pve/0038-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch
|
pve/0038-block-add-alloc-track-driver.patch
|
||||||
pve/0039-block-add-alloc-track-driver.patch
|
pve/0039-Revert-block-rbd-workaround-for-ceph-issue-53784.patch
|
||||||
pve/0040-Revert-block-rbd-workaround-for-ceph-issue-53784.patch
|
pve/0040-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch
|
||||||
pve/0041-Revert-block-rbd-fix-handling-of-holes-in-.bdrv_co_b.patch
|
pve/0041-Revert-block-rbd-implement-bdrv_co_block_status.patch
|
||||||
pve/0042-Revert-block-rbd-implement-bdrv_co_block_status.patch
|
pve/0042-alloc-track-error-out-when-auto-remove-is-not-set.patch
|
||||||
pve/0043-alloc-track-error-out-when-auto-remove-is-not-set.patch
|
pve/0043-alloc-track-avoid-seemingly-superfluous-child-permis.patch
|
||||||
pve/0044-alloc-track-avoid-seemingly-superfluous-child-permis.patch
|
pve/0044-block-copy-before-write-fix-permission.patch
|
||||||
pve/0045-block-copy-before-write-fix-permission.patch
|
pve/0045-block-copy-before-write-support-unligned-snapshot-di.patch
|
||||||
pve/0046-block-copy-before-write-support-unligned-snapshot-di.patch
|
pve/0046-block-copy-before-write-create-block_copy-bitmap-in-.patch
|
||||||
pve/0047-block-copy-before-write-create-block_copy-bitmap-in-.patch
|
pve/0047-qapi-blockdev-backup-add-discard-source-parameter.patch
|
||||||
pve/0048-qapi-blockdev-backup-add-discard-source-parameter.patch
|
pve/0048-copy-before-write-allow-specifying-minimum-cluster-s.patch
|
||||||
pve/0049-copy-before-write-allow-specifying-minimum-cluster-s.patch
|
pve/0049-backup-add-minimum-cluster-size-to-performance-optio.patch
|
||||||
pve/0050-backup-add-minimum-cluster-size-to-performance-optio.patch
|
pve/0050-PVE-backup-add-fleecing-option.patch
|
||||||
pve/0051-PVE-backup-add-fleecing-option.patch
|
|
||||||
|
2
qemu
2
qemu
@ -1 +1 @@
|
|||||||
Subproject commit 11aa0b1ff115b86160c4d37e7c37e6a6b13b77ea
|
Subproject commit c25df57ae8f9fe1c72eee2dab37d76d904ac382e
|
Loading…
Reference in New Issue
Block a user