diff --git a/0003-tests-make-filemonitor-test-more-robust-to-event-ord.patch b/0003-tests-make-filemonitor-test-more-robust-to-event-ord.patch new file mode 100644 index 0000000..bce580d --- /dev/null +++ b/0003-tests-make-filemonitor-test-more-robust-to-event-ord.patch @@ -0,0 +1,134 @@ +From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= +Date: Wed, 21 Aug 2019 16:14:27 +0100 +Subject: [PATCH] tests: make filemonitor test more robust to event ordering +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The ordering of events that are emitted during the rmdir +test have changed with kernel >= 5.3. Semantically both +new & old orderings are correct, so we must be able to +cope with either. + +To cope with this, when we see an unexpected event, we +push it back onto the queue and look and the subsequent +event to see if that matches instead. + +Tested-by: Peter Xu +Tested-by: Wei Yang +Tested-by: Cornelia Huck +Reviewed-by: Thomas Huth +Signed-off-by: Daniel P. Berrangé +(cherry picked from commit bf9e0313c27d8e6ecd7f7de3d63e1cb25d8f6311) +--- + tests/test-util-filemonitor.c | 43 +++++++++++++++++++++++++++-------- + 1 file changed, 34 insertions(+), 9 deletions(-) + +diff --git a/tests/test-util-filemonitor.c b/tests/test-util-filemonitor.c +index 46e781c022..301cd2db61 100644 +--- a/tests/test-util-filemonitor.c ++++ b/tests/test-util-filemonitor.c +@@ -45,6 +45,11 @@ typedef struct { + const char *filedst; + int64_t *watchid; + int eventid; ++ /* ++ * Only valid with OP_EVENT - this event might be ++ * swapped with the next OP_EVENT ++ */ ++ bool swapnext; + } QFileMonitorTestOp; + + typedef struct { +@@ -98,6 +103,10 @@ qemu_file_monitor_test_handler(int64_t id, + QFileMonitorTestData *data = opaque; + QFileMonitorTestRecord *rec = g_new0(QFileMonitorTestRecord, 1); + ++ if (debug) { ++ g_printerr("Queue event id %" PRIx64 " event %d file %s\n", ++ id, event, filename); ++ } + rec->id = id; + rec->event = event; + rec->filename = g_strdup(filename); +@@ -125,7 +134,8 @@ qemu_file_monitor_test_record_free(QFileMonitorTestRecord *rec) + * to wait for the event to be queued for us. + */ + static QFileMonitorTestRecord * +-qemu_file_monitor_test_next_record(QFileMonitorTestData *data) ++qemu_file_monitor_test_next_record(QFileMonitorTestData *data, ++ QFileMonitorTestRecord *pushback) + { + GTimer *timer = g_timer_new(); + QFileMonitorTestRecord *record = NULL; +@@ -139,9 +149,15 @@ qemu_file_monitor_test_next_record(QFileMonitorTestData *data) + } + if (data->records) { + record = data->records->data; +- tmp = data->records; +- data->records = g_list_remove_link(data->records, tmp); +- g_list_free(tmp); ++ if (pushback) { ++ data->records->data = pushback; ++ } else { ++ tmp = data->records; ++ data->records = g_list_remove_link(data->records, tmp); ++ g_list_free(tmp); ++ } ++ } else if (pushback) { ++ qemu_file_monitor_test_record_free(pushback); + } + qemu_mutex_unlock(&data->lock); + +@@ -158,13 +174,15 @@ static bool + qemu_file_monitor_test_expect(QFileMonitorTestData *data, + int64_t id, + QFileMonitorEvent event, +- const char *filename) ++ const char *filename, ++ bool swapnext) + { + QFileMonitorTestRecord *rec; + bool ret = false; + +- rec = qemu_file_monitor_test_next_record(data); ++ rec = qemu_file_monitor_test_next_record(data, NULL); + ++ retry: + if (!rec) { + g_printerr("Missing event watch id %" PRIx64 " event %d file %s\n", + id, event, filename); +@@ -172,6 +190,11 @@ qemu_file_monitor_test_expect(QFileMonitorTestData *data, + } + + if (id != rec->id) { ++ if (swapnext) { ++ rec = qemu_file_monitor_test_next_record(data, rec); ++ swapnext = false; ++ goto retry; ++ } + g_printerr("Expected watch id %" PRIx64 " but got %" PRIx64 "\n", + id, rec->id); + goto cleanup; +@@ -347,7 +370,8 @@ test_file_monitor_events(void) + .filesrc = "fish", }, + { .type = QFILE_MONITOR_TEST_OP_EVENT, + .filesrc = "", .watchid = &watch4, +- .eventid = QFILE_MONITOR_EVENT_IGNORED }, ++ .eventid = QFILE_MONITOR_EVENT_IGNORED, ++ .swapnext = true }, + { .type = QFILE_MONITOR_TEST_OP_EVENT, + .filesrc = "fish", .watchid = &watch0, + .eventid = QFILE_MONITOR_EVENT_DELETED }, +@@ -493,8 +517,9 @@ test_file_monitor_events(void) + g_printerr("Event id=%" PRIx64 " event=%d file=%s\n", + *op->watchid, op->eventid, op->filesrc); + } +- if (!qemu_file_monitor_test_expect( +- &data, *op->watchid, op->eventid, op->filesrc)) ++ if (!qemu_file_monitor_test_expect(&data, *op->watchid, ++ op->eventid, op->filesrc, ++ op->swapnext)) + goto cleanup; + break; + case QFILE_MONITOR_TEST_OP_CREATE: diff --git a/qemu.spec b/qemu.spec index ea32d01..e7eae22 100644 --- a/qemu.spec +++ b/qemu.spec @@ -175,6 +175,8 @@ Source21: 95-kvm-ppc64-memlock.conf # gluster 4K block size fixes (bz #1737256) Patch0001: 0001-file-posix-Handle-undetectable-alignment.patch Patch0002: 0002-block-posix-Always-allocate-the-first-block.patch +# Fix tests on kernel 5.3+ +Patch0003: 0003-tests-make-filemonitor-test-more-robust-to-event-ord.patch # documentation deps