On Thu, 10 Aug 2023, Darrick J. Wong wrote: > On Wed, Aug 09, 2023 at 06:41:17AM -0700, Christoph Hellwig wrote: > > Please do not add a new ->direct_IO method. I'm currently working hard > > on removing it, just set FMODE_CAN_ODIRECT and handle the fallback in > > your read_iter/write_iter methods. > > > > But if we just start claiming direct I/O support for file systems that > > don't actually support it, I'm starting to seriously wonder why we > > bother with the flag at all and don't just allow O_DIRECT opens > > to always succeed.. > > I see it differently -- you can do byte-aligned directio to S_DAX files > on persistent memory, so I don't see why you can't do that for tmpfs > files too. Helpful support, thanks. But I didn't read Christoph as unhappy with the granularity issue: just giving me directIOn to FMODE_CAN_ODIRECT, and rightly wondering why we ever fail O_DIRECTs. Hugh > > (I'm not advocating for letting *disk* based filesystems allow O_DIRECT > even if read and writes are always going to go through the page cache > and get flushed to disk. If programs wanted that, they'd use O_SYNC.) > > /mnt is a pmem filesystem, /mnt/on/file has S_DAX set, and /mnt/off/file > does not: > > # xfs_io -c statx /mnt/{on,off}/file > fd.path = "/mnt/on/file" > fd.flags = non-sync,non-direct,read-write > stat.ino = 132 > stat.type = regular file > stat.size = 1048576 > stat.blocks = 2048 > fsxattr.xflags = 0x8002 [-p------------x--] > fsxattr.projid = 0 > fsxattr.extsize = 0 > fsxattr.cowextsize = 0 > fsxattr.nextents = 1 > fsxattr.naextents = 0 > dioattr.mem = 0x200 > dioattr.miniosz = 512 > dioattr.maxiosz = 2147483136 > fd.path = "/mnt/off/file" > fd.flags = non-sync,non-direct,read-write > stat.ino = 8388737 > stat.type = regular file > stat.size = 1048576 > stat.blocks = 2048 > fsxattr.xflags = 0x2 [-p---------------] > fsxattr.projid = 0 > fsxattr.extsize = 0 > fsxattr.cowextsize = 0 > fsxattr.nextents = 1 > fsxattr.naextents = 0 > dioattr.mem = 0x200 > dioattr.miniosz = 512 > dioattr.maxiosz = 2147483136 > > And now we try a byte-aligned direct write: > > # xfs_io -d -c 'pwrite -S 0x58 47 1' /mnt/off/file > pwrite: Invalid argument > # xfs_io -d -c 'pwrite -S 0x58 47 1' /mnt/on/file > wrote 1/1 bytes at offset 47 > 1.000000 bytes, 1 ops; 0.0001 sec (5.194 KiB/sec and 5319.1489 ops/sec) > > --D