]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-loop-block: let's explicitly flush buffer cache on whole block device
authorLennart Poettering <lennart@poettering.net>
Thu, 1 Dec 2022 16:17:46 +0000 (17:17 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 1 Dec 2022 21:07:36 +0000 (22:07 +0100)
Let's explicitly flush the kernel's buffer cache on the whole block
device once we ran "mkfs". This is necessary, because partition and
whole block devices maintain separate buffer caches, and thus writing
to one will not be visible on the other if cached there already, until
the latter's cache is explicitly flushed.

This is preparation for later adding support for probing file sytems
also if we have no open partition block devices, and hence want to use
the whole block device instead.

src/test/test-loop-block.c

index 01db8b092ec0b85fd7ba657609a3b1dcd0c5b4ca..b06ab0d172614b7616d60d6078a10d48468eb462 100644 (file)
@@ -4,6 +4,8 @@
 #include <linux/loop.h>
 #include <pthread.h>
 #include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
 
 #include "alloc-util.h"
 #include "capability-util.h"
@@ -256,6 +258,13 @@ static int run(int argc, char *argv[]) {
 
         dissected = dissected_image_unref(dissected);
 
+        /* We created the file systems now via the per-partition block devices. But the dissection code might
+         * probe them via the whole block device. These block devices have separate buffer caches though,
+         * hence what was written via the partition device might not appear on the whole block device
+         * yet. Let's hence explicitly flush the whole block device, so that the read-back definitely
+         * works. */
+        assert_se(ioctl(loop->fd, BLKFLSBUF, 0) >= 0);
+
         /* Try to read once, without pinning or adding partitions, i.e. by only accessing the whole block
          * device. */
         assert_se(dissect_loop_device(loop, NULL, NULL, 0, &dissected) >= 0);