On Tue 08-08-23 21:34:54, Hugh Dickins wrote: > Depending upon your philosophical viewpoint, either tmpfs always does > direct IO, or it cannot ever do direct IO; but whichever, if tmpfs is to > stand in for a more sophisticated filesystem, it can be helpful for tmpfs > to support O_DIRECT. So, give tmpfs a shmem_direct_IO() method, of the > simplest kind: by just returning 0 done, it leaves all the work to the > buffered fallback (and everything else just happens to work out okay - > in particular, its dirty pages don't get lost to invalidation). > > xfstests auto generic which were not run on tmpfs before but now pass: > 036 091 113 125 130 133 135 198 207 208 209 210 211 212 214 226 239 263 > 323 355 391 406 412 422 427 446 451 465 551 586 591 609 615 647 708 729 > with no new failures. > > LTP dio tests which were not run on tmpfs before but now pass: > dio01 through dio30, except for dio04 and dio10, which fail because > tmpfs dio read and write allow odd count: tmpfs could be made stricter, > but would that be an improvement? > > Signed-off-by: Hugh Dickins <hughd@xxxxxxxxxx> Yeah, we are not quite consistent about whether it is better to silently fallback to buffered IO or return error among filesystems. So I guess whatever you like. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > mm/shmem.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/mm/shmem.c b/mm/shmem.c > index 7420b510a9f3..4d5599e566df 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -2720,6 +2720,16 @@ shmem_write_end(struct file *file, struct address_space *mapping, > return copied; > } > > +static ssize_t shmem_direct_IO(struct kiocb *iocb, struct iov_iter *iter) > +{ > + /* > + * Just leave all the work to the buffered fallback. > + * Some LTP tests may expect us to enforce alignment restrictions, > + * but the fallback works just fine with any alignment, so allow it. > + */ > + return 0; > +} > + > static ssize_t shmem_file_read_iter(struct kiocb *iocb, struct iov_iter *to) > { > struct file *file = iocb->ki_filp; > @@ -4421,6 +4431,7 @@ const struct address_space_operations shmem_aops = { > #ifdef CONFIG_TMPFS > .write_begin = shmem_write_begin, > .write_end = shmem_write_end, > + .direct_IO = shmem_direct_IO, > #endif > #ifdef CONFIG_MIGRATION > .migrate_folio = migrate_folio, > -- > 2.35.3 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR