[RFC PATCH 0/3] migrates ocfs2 DIO from buffer_head to iomap
Heming Zhao <[email protected]> Fri, 24 Jul 2026 13:25:54 +0800
| Newsgroups | dev.linux.lists.ocfs2-devel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
This patch set migrates ocfs2 Direct I/O (DIO) from buffer_head mode to iomap mode. For patch [2/3], this patch leverages the top 2 bits of `iocb->ki_flags` (`IOCB_OCFS2_RW_LOCK` and `IOCB_OCFS2_RW_LOCK_LEVEL`) to safely carry the lock state into the `end_io` callback. If this patch set is accepted, I plan to submit a follow-up patch to the iomap module to introduce two dedicated flags for `iocb->ki_flags`, avoiding the need to use the top two bits internally in iomap. i.e.: ``` diff --git a/include/linux/fs.h b/include/linux/fs.h index 50ce731a2b78..ad9fd768746e 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -357,6 +357,8 @@ struct readahead_control; /* kiocb is a read or write operation submitted by fs/aio.c. */ #define IOCB_AIO_RW (1 << 22) #define IOCB_HAS_METADATA (1 << 23) +#define IOCB_FS_PRIVATE1 (1 << 30) +#define IOCB_FS_PRIVATE2 (1 << 31) /* for use in trace events */ #define TRACE_IOCB_STRINGS \ ``` ---------------- This patch set has been tested on 7.2.0 kernel with the following test cases. ## ltp runltp -f dio -d /mnt/ocfs2/ The test results: passed ## xfstests ./check -g quick -T -b -s ocfs2 -e generic/081 \ -e generic/266 -e generic/272 -e generic/281 \ -e generic/338 -e generic/347 -e generic/361 \ -e generic/628 -e generic/629 -e generic/648 -e generic/650 The test results are the same before and after the patch set. Failures: generic/003 generic/322 generic/329 generic/331 generic/370 generic/376 generic/420 generic/424 generic/448 generic/449 generic/467 generic/477 generic/510 generic/513 generic/537 generic/552 generic/563 generic/578 generic/607 generic/620 generic/630 generic/755 generic/777 generic/784 Failed 24 of 632 tests ## fio on single node fio --direct=1 --iodepth=32 --rw=write --ioengine=libaio --bs=128k --size=1g \ --numjobs=4 --runtime=100 --group_reporting --filename=/mnt/ocfs2/write.1g --name=tst - before patch : write: IOPS=18.8k, BW=4708MiB/s (4937MB/s)(4096MiB/870msec) - applied patch: write: IOPS=39.6k, BW=4953MiB/s (5193MB/s)(4096MiB/827msec) - overwrite (don't remove write.1g, run above fio command) speed seems same. fio --direct=1 --iodepth=32 --rw=read --ioengine=libaio --bs=128k --size=1g \ --numjobs=4 --runtime=100 --group_reporting --filename=/mnt/ocfs2/write.1g --name=tst - before patch : read: IOPS=52.4k, BW=6554MiB/s (6872MB/s)(4096MiB/625msec) - applied patch: read: IOPS=52.2k, BW=6522MiB/s (6839MB/s)(4096MiB/628msec) fio --direct=1 --iodepth=32 --rw=randwrite --ioengine=libaio --bs=4k --size=1g \ --numjobs=4 --runtime=100 --group_reporting --filename=/mnt/ocfs2/write.1g --name=tst - before patch - creating write: IOPS=20.9k, BW=81.7MiB/s (85.6MB/s)(4096MiB/50159msec) - overwriting write.1g: write: IOPS=281k, BW=1097MiB/s (1151MB/s)(4096MiB/3733msec) - applied patch - creating write: IOPS=21.0k, BW=82.0MiB/s (86.0MB/s)(4096MiB/49938msec) - overwriting write.1g: write: IOPS=329k, BW=1286MiB/s (1348MB/s)(4096MiB/3185msec) fio --direct=1 --iodepth=32 --rw=randread --ioengine=libaio --bs=4k --size=1g \ --numjobs=4 --runtime=100 --group_reporting --filename=/mnt/ocfs2/write.1g --name=tst - before patch : read: IOPS=372k, BW=1452MiB/s (1522MB/s)(4096MiB/2821msec) - applied patch: read: IOPS=369k, BW=1441MiB/s (1511MB/s)(4096MiB/2842msec) ## fio on two nodes ### write in different folder node1 /root/fio/diff/ocfs2-w.sh: > fio --direct=1 --iodepth=32 --rw=write --ioengine=libaio --bs=128k --size=2g \ --numjobs=2 --runtime=100 --group_reporting --filename=/mnt/ocfs2/node1/write.2g --name=tst node2 /root/fio/diff/ocfs2-w.sh: > fio --direct=1 --iodepth=32 --rw=write --ioengine=libaio --bs=128k --size=2g \ --numjobs=2 --runtime=100 --group_reporting --filename=/mnt/ocfs2/node2/write.2g --name=tst node1 /root/fio/diff/ocfs2-randw.sh: > fio --direct=1 --iodepth=32 --rw=randwrite --ioengine=libaio --bs=4k --size=2g \ --numjobs=2 --runtime=100 --group_reporting --filename=/mnt/ocfs2/node1/write.2g --name=tst node2 /root/fio/diff/ocfs2-randw.sh: > fio --direct=1 --iodepth=32 --rw=randwrite --ioengine=libaio --bs=4k --size=2g \ --numjobs=2 --runtime=100 --group_reporting --filename=/mnt/ocfs2/node2/write.2g --name=tst run on both node, pdsh -w ssh:tw2510-[1-2] /root/fio/diff/ocfs2-w.sh - before patch : write: IOPS=19.3k, BW=2417MiB/s (2534MB/s)(4096MiB/1695msec) - applied patch: write: IOPS=20.8k, BW=2599MiB/s (2725MB/s)(4096MiB/1576msec) pdsh -w ssh:tw2510-[1-2] /root/fio/diff/ocfs2-randw.sh - before patch : write: IOPS=3742, BW=14.6MiB/s (15.3MB/s)(1462MiB/100007msec) - applied patch: write: IOPS=3765, BW=14.7MiB/s (15.4MB/s)(1471MiB/100010msec) ### write in same file node1 & node2: (/root/fio/share/ocfs2-w.sh) fio --direct=1 --iodepth=32 --rw=write --ioengine=libaio --bs=128k --size=2g \ --numjobs=2 --runtime=100 --group_reporting --filename=/mnt/ocfs2/share/write.2g --name=tst node1 & node2: (/root/fio/share/ocfs2-randw.sh) fio --direct=1 --iodepth=32 --rw=randwrite --ioengine=libaio --bs=4k --size=2g \ --numjobs=2 --runtime=100 --group_reporting --filename=/mnt/ocfs2/share/write.2g --name=tst run on both node pdsh -w ssh:tw2510-[1-2] /root/fio/share/ocfs2-w.sh - before patch : write: IOPS=2052, BW=257MiB/s (269MB/s)(4096MiB/15967msec) - applied patch: write: IOPS=2558, BW=320MiB/s (335MB/s)(4096MiB/12808msec) pdsh -w ssh:tw2510-[1-2] /root/fio/share/ocfs2-randw.sh - before patch : write: IOPS=3588, BW=14.0MiB/s (14.7MB/s)(1402MiB/100001msec) - applied patch: write: IOPS=3590, BW=14.0MiB/s (14.7MB/s)(1403MiB/100001msec) Heming Zhao (3): ocfs2: Add new ocfs2_map_blocks() to introduce iomap feature ocfs2: switch dio read path from buffer_head to iomap ocfs2: switch dio write path from buffer_head to iomap fs/ocfs2/Kconfig | 1 + fs/ocfs2/aops.c | 580 +++++++++++++++++++++++++++++++++++++- fs/ocfs2/aops.h | 26 ++ fs/ocfs2/buffer_head_io.c | 19 +- fs/ocfs2/file.c | 108 ++++++- fs/ocfs2/ocfs2.h | 49 +++- fs/ocfs2/ocfs2_fs.h | 3 + 7 files changed, 753 insertions(+), 33 deletions(-) -- 2.54.0