Compare commits
5 Commits
0d4462207b
...
47bdd04244
Author | SHA1 | Date |
---|---|---|
Thomas Lamprecht | 47bdd04244 | |
Thomas Lamprecht | 8dd76cc52d | |
Fiona Ebner | cd7676f3e6 | |
Fiona Ebner | 862b46e3e0 | |
Fiona Ebner | 061e9ceb36 |
|
@ -1,3 +1,15 @@
|
|||
pve-qemu-kvm (8.1.5-4) bookworm; urgency=medium
|
||||
|
||||
* fix live-import for certain kinds of VMDK images that rely on padding
|
||||
|
||||
* backup: avoid bubbling up first error if it's an ECANCELED one, as those
|
||||
are often a result of cancling the job due to running into an actual
|
||||
issue.
|
||||
|
||||
* backup: factor out & clean up gathering device info into helper
|
||||
|
||||
-- Proxmox Support Team <support@proxmox.com> Tue, 12 Mar 2024 14:08:40 +0100
|
||||
|
||||
pve-qemu-kvm (8.1.5-3) bookworm; urgency=medium
|
||||
|
||||
* backport fix for potential deadlock during QMP stop command if the VM has
|
||||
|
|
|
@ -14,6 +14,7 @@ Additionally, allows tracking the current position from the outside
|
|||
(intended to be used for progress tracking).
|
||||
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
migration/channel-savevm-async.c | 183 +++++++++++++++++++++++++++++++
|
||||
migration/channel-savevm-async.h | 51 +++++++++
|
||||
|
|
|
@ -12,20 +12,20 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||
[FE: adapt to coroutine changes]
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
---
|
||||
block/backup-dump.c | 168 +++++++++++++++++++++++++++++++
|
||||
block/backup-dump.c | 172 +++++++++++++++++++++++++++++++
|
||||
block/backup.c | 30 ++----
|
||||
block/meson.build | 1 +
|
||||
include/block/block_int-common.h | 35 +++++++
|
||||
job.c | 3 +-
|
||||
5 files changed, 214 insertions(+), 23 deletions(-)
|
||||
5 files changed, 218 insertions(+), 23 deletions(-)
|
||||
create mode 100644 block/backup-dump.c
|
||||
|
||||
diff --git a/block/backup-dump.c b/block/backup-dump.c
|
||||
new file mode 100644
|
||||
index 0000000000..232a094426
|
||||
index 0000000000..e46abf1070
|
||||
--- /dev/null
|
||||
+++ b/block/backup-dump.c
|
||||
@@ -0,0 +1,168 @@
|
||||
@@ -0,0 +1,172 @@
|
||||
+/*
|
||||
+ * BlockDriver to send backup data stream to a callback function
|
||||
+ *
|
||||
|
@ -37,6 +37,8 @@ index 0000000000..232a094426
|
|||
+ */
|
||||
+
|
||||
+#include "qemu/osdep.h"
|
||||
+
|
||||
+#include "qapi/qmp/qdict.h"
|
||||
+#include "qom/object_interfaces.h"
|
||||
+#include "block/block_int.h"
|
||||
+
|
||||
|
@ -169,7 +171,7 @@ index 0000000000..232a094426
|
|||
+block_init(bdrv_backup_dump_init);
|
||||
+
|
||||
+
|
||||
+BlockDriverState *bdrv_backup_dump_create(
|
||||
+BlockDriverState *coroutine_fn bdrv_co_backup_dump_create(
|
||||
+ int dump_cb_block_size,
|
||||
+ uint64_t byte_size,
|
||||
+ BackupDumpFunc *dump_cb,
|
||||
|
@ -177,9 +179,11 @@ index 0000000000..232a094426
|
|||
+ Error **errp)
|
||||
+{
|
||||
+ BDRVBackupDumpState *state;
|
||||
+ BlockDriverState *bs = bdrv_new_open_driver(
|
||||
+ &bdrv_backup_dump_drive, NULL, BDRV_O_RDWR, errp);
|
||||
+
|
||||
+ QDict *options = qdict_new();
|
||||
+ qdict_put_str(options, "driver", "backup-dump-drive");
|
||||
+
|
||||
+ BlockDriverState *bs = bdrv_co_open(NULL, NULL, options, BDRV_O_RDWR, errp);
|
||||
+ if (!bs) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
@ -255,7 +259,7 @@ index 59b71ba9f3..6fde9f7dcd 100644
|
|||
'blkdebug.c',
|
||||
'blklogwrites.c',
|
||||
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
|
||||
index 74195c3004..0f2e1817ad 100644
|
||||
index 74195c3004..0a0339eee4 100644
|
||||
--- a/include/block/block_int-common.h
|
||||
+++ b/include/block/block_int-common.h
|
||||
@@ -26,6 +26,7 @@
|
||||
|
@ -272,7 +276,7 @@ index 74195c3004..0f2e1817ad 100644
|
|||
|
||||
+typedef int BackupDumpFunc(void *opaque, uint64_t offset, uint64_t bytes, const void *buf);
|
||||
+
|
||||
+BlockDriverState *bdrv_backup_dump_create(
|
||||
+BlockDriverState *coroutine_fn bdrv_co_backup_dump_create(
|
||||
+ int dump_cb_block_size,
|
||||
+ uint64_t byte_size,
|
||||
+ BackupDumpFunc *dump_cb,
|
||||
|
|
|
@ -84,63 +84,25 @@ Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|||
create jobs in a drained section]
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
---
|
||||
block/backup-dump.c | 10 +-
|
||||
block/meson.build | 5 +
|
||||
block/monitor/block-hmp-cmds.c | 39 ++
|
||||
blockdev.c | 1 +
|
||||
hmp-commands-info.hx | 14 +
|
||||
hmp-commands.hx | 29 +
|
||||
include/block/block_int-common.h | 2 +-
|
||||
include/monitor/hmp.h | 3 +
|
||||
meson.build | 1 +
|
||||
monitor/hmp-cmds.c | 72 ++
|
||||
proxmox-backup-client.c | 146 ++++
|
||||
proxmox-backup-client.h | 60 ++
|
||||
pve-backup.c | 1067 ++++++++++++++++++++++++++++++
|
||||
qapi/block-core.json | 229 +++++++
|
||||
qapi/common.json | 14 +
|
||||
qapi/machine.json | 16 +-
|
||||
16 files changed, 1690 insertions(+), 18 deletions(-)
|
||||
block/meson.build | 5 +
|
||||
block/monitor/block-hmp-cmds.c | 39 ++
|
||||
blockdev.c | 1 +
|
||||
hmp-commands-info.hx | 14 +
|
||||
hmp-commands.hx | 29 +
|
||||
include/monitor/hmp.h | 3 +
|
||||
meson.build | 1 +
|
||||
monitor/hmp-cmds.c | 72 +++
|
||||
proxmox-backup-client.c | 146 +++++
|
||||
proxmox-backup-client.h | 60 ++
|
||||
pve-backup.c | 1089 ++++++++++++++++++++++++++++++++
|
||||
qapi/block-core.json | 229 +++++++
|
||||
qapi/common.json | 14 +
|
||||
qapi/machine.json | 16 +-
|
||||
14 files changed, 1704 insertions(+), 14 deletions(-)
|
||||
create mode 100644 proxmox-backup-client.c
|
||||
create mode 100644 proxmox-backup-client.h
|
||||
create mode 100644 pve-backup.c
|
||||
|
||||
diff --git a/block/backup-dump.c b/block/backup-dump.c
|
||||
index 232a094426..e46abf1070 100644
|
||||
--- a/block/backup-dump.c
|
||||
+++ b/block/backup-dump.c
|
||||
@@ -9,6 +9,8 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
+
|
||||
+#include "qapi/qmp/qdict.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "block/block_int.h"
|
||||
|
||||
@@ -141,7 +143,7 @@ static void bdrv_backup_dump_init(void)
|
||||
block_init(bdrv_backup_dump_init);
|
||||
|
||||
|
||||
-BlockDriverState *bdrv_backup_dump_create(
|
||||
+BlockDriverState *coroutine_fn bdrv_co_backup_dump_create(
|
||||
int dump_cb_block_size,
|
||||
uint64_t byte_size,
|
||||
BackupDumpFunc *dump_cb,
|
||||
@@ -149,9 +151,11 @@ BlockDriverState *bdrv_backup_dump_create(
|
||||
Error **errp)
|
||||
{
|
||||
BDRVBackupDumpState *state;
|
||||
- BlockDriverState *bs = bdrv_new_open_driver(
|
||||
- &bdrv_backup_dump_drive, NULL, BDRV_O_RDWR, errp);
|
||||
|
||||
+ QDict *options = qdict_new();
|
||||
+ qdict_put_str(options, "driver", "backup-dump-drive");
|
||||
+
|
||||
+ BlockDriverState *bs = bdrv_co_open(NULL, NULL, options, BDRV_O_RDWR, errp);
|
||||
if (!bs) {
|
||||
return NULL;
|
||||
}
|
||||
diff --git a/block/meson.build b/block/meson.build
|
||||
index 6fde9f7dcd..6d468f89e5 100644
|
||||
--- a/block/meson.build
|
||||
|
@ -281,19 +243,6 @@ index e352f86872..0c8b6725fb 100644
|
|||
ERST
|
||||
|
||||
{
|
||||
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
|
||||
index 0f2e1817ad..0a0339eee4 100644
|
||||
--- a/include/block/block_int-common.h
|
||||
+++ b/include/block/block_int-common.h
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
typedef int BackupDumpFunc(void *opaque, uint64_t offset, uint64_t bytes, const void *buf);
|
||||
|
||||
-BlockDriverState *bdrv_backup_dump_create(
|
||||
+BlockDriverState *coroutine_fn bdrv_co_backup_dump_create(
|
||||
int dump_cb_block_size,
|
||||
uint64_t byte_size,
|
||||
BackupDumpFunc *dump_cb,
|
||||
diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h
|
||||
index 7a7def7530..cba7afe70c 100644
|
||||
--- a/include/monitor/hmp.h
|
||||
|
@ -637,10 +586,10 @@ index 0000000000..8cbf645b2c
|
|||
+#endif /* PROXMOX_BACKUP_CLIENT_H */
|
||||
diff --git a/pve-backup.c b/pve-backup.c
|
||||
new file mode 100644
|
||||
index 0000000000..d84d807654
|
||||
index 0000000000..ae3d137e12
|
||||
--- /dev/null
|
||||
+++ b/pve-backup.c
|
||||
@@ -0,0 +1,1067 @@
|
||||
@@ -0,0 +1,1089 @@
|
||||
+#include "proxmox-backup-client.h"
|
||||
+#include "vma.h"
|
||||
+
|
||||
|
@ -950,7 +899,12 @@ index 0000000000..d84d807654
|
|||
+
|
||||
+ qemu_co_mutex_lock(&backup_state.backup_mutex);
|
||||
+
|
||||
+ if (ret < 0) {
|
||||
+ /*
|
||||
+ * All jobs in the transaction will be canceled when one receives an error.
|
||||
+ * The first error wins, so only set it for ECANCELED if it was the last
|
||||
+ * job. This allows more interesting errors from other jobs to win.
|
||||
+ */
|
||||
+ if (ret < 0 && (ret != -ECANCELED || !g_list_nth(backup_state.di_list, 1))) {
|
||||
+ Error *local_err = NULL;
|
||||
+ error_setg(&local_err, "job failed with err %d - %s", ret, strerror(-ret));
|
||||
+ pvebackup_propagate_error(local_err);
|
||||
|
@ -1219,6 +1173,66 @@ index 0000000000..d84d807654
|
|||
+ aio_co_enter(data->ctx, data->co);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * 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
|
||||
+ * list.
|
||||
+ */
|
||||
+static GList coroutine_fn *get_device_info(
|
||||
+ const char *devlist,
|
||||
+ Error **errp)
|
||||
+{
|
||||
+ gchar **devs = NULL;
|
||||
+ GList *di_list = NULL;
|
||||
+
|
||||
+ if (devlist) {
|
||||
+ devs = g_strsplit_set(devlist, ",;:", -1);
|
||||
+
|
||||
+ gchar **d = devs;
|
||||
+ while (d && *d) {
|
||||
+ BlockBackend *blk = blk_by_name(*d);
|
||||
+ if (!blk) {
|
||||
+ error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
||||
+ "Device '%s' not found", *d);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ BlockDriverState *bs = blk_bs(blk);
|
||||
+ if (!bdrv_co_is_inserted(bs)) {
|
||||
+ error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, *d);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1);
|
||||
+ di->bs = bs;
|
||||
+ di_list = g_list_append(di_list, di);
|
||||
+ d++;
|
||||
+ }
|
||||
+ } else {
|
||||
+ BdrvNextIterator it;
|
||||
+
|
||||
+ for (BlockDriverState *bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
|
||||
+ if (!bdrv_co_is_inserted(bs) || bdrv_is_read_only(bs)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1);
|
||||
+ di->bs = bs;
|
||||
+ di_list = g_list_append(di_list, di);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!di_list) {
|
||||
+ error_set(errp, ERROR_CLASS_GENERIC_ERROR, "empty device list");
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+err:
|
||||
+ if (devs) {
|
||||
+ g_strfreev(devs);
|
||||
+ }
|
||||
+
|
||||
+ return di_list;
|
||||
+}
|
||||
+
|
||||
+UuidInfo coroutine_fn *qmp_backup(
|
||||
+ const char *backup_file,
|
||||
+ const char *password,
|
||||
|
@ -1244,13 +1258,10 @@ index 0000000000..d84d807654
|
|||
+
|
||||
+ qemu_co_mutex_lock(&backup_state.backup_mutex);
|
||||
+
|
||||
+ BlockBackend *blk;
|
||||
+ BlockDriverState *bs = NULL;
|
||||
+ Error *local_err = NULL;
|
||||
+ uuid_t uuid;
|
||||
+ VmaWriter *vmaw = NULL;
|
||||
+ ProxmoxBackupHandle *pbs = NULL;
|
||||
+ gchar **devs = NULL;
|
||||
+ GList *di_list = NULL;
|
||||
+ GList *l;
|
||||
+ UuidInfo *uuid_info;
|
||||
|
@ -1268,48 +1279,12 @@ index 0000000000..d84d807654
|
|||
+ /* Todo: try to auto-detect format based on file name */
|
||||
+ format = has_format ? format : BACKUP_FORMAT_VMA;
|
||||
+
|
||||
+ if (devlist) {
|
||||
+ devs = g_strsplit_set(devlist, ",;:", -1);
|
||||
+
|
||||
+ gchar **d = devs;
|
||||
+ while (d && *d) {
|
||||
+ blk = blk_by_name(*d);
|
||||
+ if (blk) {
|
||||
+ bs = blk_bs(blk);
|
||||
+ if (!bdrv_co_is_inserted(bs)) {
|
||||
+ error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, *d);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1);
|
||||
+ di->bs = bs;
|
||||
+ di_list = g_list_append(di_list, di);
|
||||
+ } else {
|
||||
+ error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
|
||||
+ "Device '%s' not found", *d);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ d++;
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ BdrvNextIterator it;
|
||||
+
|
||||
+ bs = NULL;
|
||||
+ for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
|
||||
+ if (!bdrv_co_is_inserted(bs) || bdrv_is_read_only(bs)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ PVEBackupDevInfo *di = g_new0(PVEBackupDevInfo, 1);
|
||||
+ di->bs = bs;
|
||||
+ di_list = g_list_append(di_list, di);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!di_list) {
|
||||
+ error_set(errp, ERROR_CLASS_GENERIC_ERROR, "empty device list");
|
||||
+ di_list = get_device_info(devlist, &local_err);
|
||||
+ if (local_err) {
|
||||
+ error_propagate(errp, local_err);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ assert(di_list);
|
||||
+
|
||||
+ size_t total = 0;
|
||||
+
|
||||
|
@ -1597,10 +1572,6 @@ index 0000000000..d84d807654
|
|||
+ g_list_free(di_list);
|
||||
+ backup_state.di_list = NULL;
|
||||
+
|
||||
+ if (devs) {
|
||||
+ g_strfreev(devs);
|
||||
+ }
|
||||
+
|
||||
+ if (vmaw) {
|
||||
+ Error *err = NULL;
|
||||
+ vma_writer_close(vmaw, &err);
|
||||
|
|
|
@ -174,10 +174,10 @@ index 0000000000..887e998b9e
|
|||
+ NULL);
|
||||
+}
|
||||
diff --git a/pve-backup.c b/pve-backup.c
|
||||
index d84d807654..9c8b88d075 100644
|
||||
index ae3d137e12..e6b17b797e 100644
|
||||
--- a/pve-backup.c
|
||||
+++ b/pve-backup.c
|
||||
@@ -1060,6 +1060,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
||||
@@ -1082,6 +1082,7 @@ ProxmoxSupportStatus *qmp_query_proxmox_support(Error **errp)
|
||||
ret->pbs_library_version = g_strdup(proxmox_backup_qemu_version());
|
||||
ret->pbs_dirty_bitmap = true;
|
||||
ret->pbs_dirty_bitmap_savevm = true;
|
||||
|
|
|
@ -8,26 +8,57 @@ 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.
|
||||
|
||||
Simply check for NULL and do nothing, there's no reason to pad the
|
||||
target if it will be discarded anyway.
|
||||
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 | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
block/io.c | 29 ++++++++++++++++-------------
|
||||
1 file changed, 16 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 83d1b1dfdc..24a3c84c93 100644
|
||||
index 83d1b1dfdc..e927881e40 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -1710,6 +1710,10 @@ static int bdrv_pad_request(BlockDriverState *bs,
|
||||
int sliced_niov;
|
||||
size_t sliced_head, sliced_tail;
|
||||
@@ -1723,22 +1723,25 @@ static int bdrv_pad_request(BlockDriverState *bs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ if (!qiov) {
|
||||
+ 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);
|
||||
+
|
||||
/* Should have been checked by the caller already */
|
||||
ret = bdrv_check_request32(*offset, *bytes, *qiov, *qiov_offset);
|
||||
if (ret < 0) {
|
||||
+ /* 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;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ This reverts commit fc176116cdea816ceb8dd969080b2b95f58edbc0 in
|
|||
preparation to revert 0347a8fd4c3faaedf119be04c197804be40a384b.
|
||||
|
||||
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
block/rbd.c | 42 ++----------------------------------------
|
||||
1 file changed, 2 insertions(+), 40 deletions(-)
|
||||
|
|
|
@ -8,6 +8,7 @@ This reverts commit 9e302f64bb407a9bb097b626da97228c2654cfee in
|
|||
preparation to revert 0347a8fd4c3faaedf119be04c197804be40a384b.
|
||||
|
||||
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
block/rbd.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
|
|
@ -18,6 +18,7 @@ Upstream bug report:
|
|||
https://gitlab.com/qemu-project/qemu/-/issues/1026
|
||||
|
||||
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
block/rbd.c | 112 ----------------------------------------------------
|
||||
1 file changed, 112 deletions(-)
|
||||
|
|
|
@ -67,6 +67,7 @@ general to not leave unnecessary block nodes lying around.
|
|||
|
||||
Suggested-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
block/alloc-track.c | 54 ++++++++++++++-------------------------------
|
||||
1 file changed, 16 insertions(+), 38 deletions(-)
|
||||
|
|
|
@ -43,6 +43,7 @@ callbacks that need the BQL and only take the lock if it's not already
|
|||
held.
|
||||
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
include/migration/register.h | 2 +-
|
||||
migration/block-dirty-bitmap.c | 15 ++++++++++++---
|
||||
|
|
|
@ -8,6 +8,7 @@ callbacks" for why. This is separate, because a version of that one
|
|||
will hopefully land upstream.
|
||||
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
migration/savevm-async.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
|
Loading…
Reference in New Issue