1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Dietmar Maurer <dietmar@proxmox.com>
3 Date: Fri, 17 Apr 2020 08:57:48 +0200
4 Subject: [PATCH] PVE Backup: use QemuMutex instead of QemuRecMutex
6 We acquire/release all mutexes outside coroutines now, so we can now
7 correctly use a normal mutex.
9 pve-backup.c | 58 ++++++++++++++++++++++++++--------------------------
10 1 file changed, 29 insertions(+), 29 deletions(-)
12 diff --git a/pve-backup.c b/pve-backup.c
13 index dddf430399..bb917ee972 100644
17 static struct PVEBackupState {
19 // Everithing accessed from qmp_backup_query command is protected using lock
25 @@ -46,14 +46,14 @@ static struct PVEBackupState {
27 ProxmoxBackupHandle *pbs;
29 - QemuRecMutex backup_mutex;
30 + QemuMutex backup_mutex;
31 CoMutex dump_callback_mutex;
34 static void pvebackup_init(void)
36 - qemu_rec_mutex_init(&backup_state.stat.lock);
37 - qemu_rec_mutex_init(&backup_state.backup_mutex);
38 + qemu_mutex_init(&backup_state.stat.lock);
39 + qemu_mutex_init(&backup_state.backup_mutex);
40 qemu_co_mutex_init(&backup_state.dump_callback_mutex);
43 @@ -91,26 +91,26 @@ lookup_active_block_job(PVEBackupDevInfo *di)
45 static void pvebackup_propagate_error(Error *err)
47 - qemu_rec_mutex_lock(&backup_state.stat.lock);
48 + qemu_mutex_lock(&backup_state.stat.lock);
49 error_propagate(&backup_state.stat.error, err);
50 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
51 + qemu_mutex_unlock(&backup_state.stat.lock);
54 static bool pvebackup_error_or_canceled(void)
56 - qemu_rec_mutex_lock(&backup_state.stat.lock);
57 + qemu_mutex_lock(&backup_state.stat.lock);
58 bool error_or_canceled = !!backup_state.stat.error;
59 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
60 + qemu_mutex_unlock(&backup_state.stat.lock);
62 return error_or_canceled;
65 static void pvebackup_add_transfered_bytes(size_t transferred, size_t zero_bytes)
67 - qemu_rec_mutex_lock(&backup_state.stat.lock);
68 + qemu_mutex_lock(&backup_state.stat.lock);
69 backup_state.stat.zero_bytes += zero_bytes;
70 backup_state.stat.transferred += transferred;
71 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
72 + qemu_mutex_unlock(&backup_state.stat.lock);
75 // This may get called from multiple coroutines in multiple io-threads
76 @@ -226,9 +226,9 @@ static void coroutine_fn pvebackup_co_cleanup(void *unused)
78 assert(qemu_in_coroutine());
80 - qemu_rec_mutex_lock(&backup_state.stat.lock);
81 + qemu_mutex_lock(&backup_state.stat.lock);
82 backup_state.stat.end_time = time(NULL);
83 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
84 + qemu_mutex_unlock(&backup_state.stat.lock);
86 if (backup_state.vmaw) {
87 Error *local_err = NULL;
88 @@ -284,7 +284,7 @@ static void pvebackup_complete_cb(void *opaque, int ret)
90 PVEBackupDevInfo *di = opaque;
92 - qemu_rec_mutex_lock(&backup_state.backup_mutex);
93 + qemu_mutex_lock(&backup_state.backup_mutex);
97 @@ -305,7 +305,7 @@ static void pvebackup_complete_cb(void *opaque, int ret)
101 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
102 + qemu_mutex_unlock(&backup_state.backup_mutex);
104 pvebackup_run_next_job();
106 @@ -318,7 +318,7 @@ static void pvebackup_cancel(void)
107 error_setg(&cancel_err, "backup canceled");
108 pvebackup_propagate_error(cancel_err);
110 - qemu_rec_mutex_lock(&backup_state.backup_mutex);
111 + qemu_mutex_lock(&backup_state.backup_mutex);
113 if (backup_state.vmaw) {
114 /* make sure vma writer does not block anymore */
115 @@ -329,13 +329,13 @@ static void pvebackup_cancel(void)
116 proxmox_backup_abort(backup_state.pbs, "backup canceled");
119 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
120 + qemu_mutex_unlock(&backup_state.backup_mutex);
124 BlockJob *next_job = NULL;
126 - qemu_rec_mutex_lock(&backup_state.backup_mutex);
127 + qemu_mutex_lock(&backup_state.backup_mutex);
129 GList *l = backup_state.di_list;
131 @@ -349,7 +349,7 @@ static void pvebackup_cancel(void)
135 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
136 + qemu_mutex_unlock(&backup_state.backup_mutex);
139 AioContext *aio_context = next_job->job.aio_context;
140 @@ -423,7 +423,7 @@ static void pvebackup_run_next_job(void)
142 assert(!qemu_in_coroutine());
144 - qemu_rec_mutex_lock(&backup_state.backup_mutex);
145 + qemu_mutex_lock(&backup_state.backup_mutex);
147 GList *l = backup_state.di_list;
149 @@ -433,7 +433,7 @@ static void pvebackup_run_next_job(void)
150 BlockJob *job = lookup_active_block_job(di);
153 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
154 + qemu_mutex_unlock(&backup_state.backup_mutex);
156 AioContext *aio_context = job->job.aio_context;
157 aio_context_acquire(aio_context);
158 @@ -453,7 +453,7 @@ static void pvebackup_run_next_job(void)
160 block_on_coroutine_fn(pvebackup_co_cleanup, NULL); // no more jobs, run cleanup
162 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
163 + qemu_mutex_unlock(&backup_state.backup_mutex);
166 static bool create_backup_jobs(void) {
167 @@ -778,7 +778,7 @@ static void coroutine_fn pvebackup_co_prepare(void *opaque)
169 /* initialize global backup_state now */
171 - qemu_rec_mutex_lock(&backup_state.stat.lock);
172 + qemu_mutex_lock(&backup_state.stat.lock);
174 if (backup_state.stat.error) {
175 error_free(backup_state.stat.error);
176 @@ -801,7 +801,7 @@ static void coroutine_fn pvebackup_co_prepare(void *opaque)
177 backup_state.stat.transferred = 0;
178 backup_state.stat.zero_bytes = 0;
180 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
181 + qemu_mutex_unlock(&backup_state.stat.lock);
183 backup_state.speed = (task->has_speed && task->speed > 0) ? task->speed : 0;
185 @@ -895,16 +895,16 @@ UuidInfo *qmp_backup(
189 - qemu_rec_mutex_lock(&backup_state.backup_mutex);
190 + qemu_mutex_lock(&backup_state.backup_mutex);
192 block_on_coroutine_fn(pvebackup_co_prepare, &task);
195 create_backup_jobs();
196 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
197 + qemu_mutex_unlock(&backup_state.backup_mutex);
198 pvebackup_run_next_job();
200 - qemu_rec_mutex_unlock(&backup_state.backup_mutex);
201 + qemu_mutex_unlock(&backup_state.backup_mutex);
205 @@ -914,11 +914,11 @@ BackupStatus *qmp_query_backup(Error **errp)
207 BackupStatus *info = g_malloc0(sizeof(*info));
209 - qemu_rec_mutex_lock(&backup_state.stat.lock);
210 + qemu_mutex_lock(&backup_state.stat.lock);
212 if (!backup_state.stat.start_time) {
213 /* not started, return {} */
214 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
215 + qemu_mutex_unlock(&backup_state.stat.lock);
219 @@ -955,7 +955,7 @@ BackupStatus *qmp_query_backup(Error **errp)
220 info->has_transferred = true;
221 info->transferred = backup_state.stat.transferred;
223 - qemu_rec_mutex_unlock(&backup_state.stat.lock);
224 + qemu_mutex_unlock(&backup_state.stat.lock);