On 27 June 2018 at 02:39, Andreas Gruenbacher <agruenba@xxxxxxxxxx> wrote: > Here's a patch that implements direct I/O for inline data. Direct I/O > to inline data is a bit weird because it's not direct in the usual > sense, but since Christoph's been asking for it ... > > The usual alignment restrictions to the logical block size of the > underlying block device still apply. I don't see a reason for changing > that; the resulting behavior would only become very weird for no > benefit. > > I've tested this against a hacked-up version of gfs2. However, the > "real" gfs2 will keep falling back to buffered I/O for writes to inline > data: gfs2 takes a shared lock during direct I/O, and writing to the > inode under that shared lock is not allowed. Ext4 may become the first > actual user of this part of the patch. One further issue is the alignment check in iomap_dio_actor: > if ((pos | length | align) & ((1 << blkbits) - 1)) > return -EINVAL; For inline data, iomap->length is set to the file size. iomap_apply truncates the requested length down to that, so iomap_dio_actor sees the truncated length instead of the requested length and fails with -EINVAL. This causes tests like the following to fail (also see xfstest generic/120): xfs_io -fd -c 'truncate 300' -c 'pread -v 0 4096' /mnt/test/foo A possible fix is to change the alignment check in iomap_dio_actor as follows: - if ((pos | length | align) & ((1 << blkbits) - 1)) + if ((pos | align) & ((1 << blkbits) - 1)) + return -EINVAL; + if (length & ((1 << blkbits) - 1) && + pos + length != iomap->offset + iomap->length) return -EINVAL; Moving the alignment check from iomap_dio_actor to iomap_dio_rw isn't that easy because iomap->bdev isn't known there. Any thoughts? Thanks, Andreas