> if (unaligned_io) { > + /* unaligned dio always waits, bail */ > + if (iocb->ki_flags & IOCB_NOWAIT) > + return -EAGAIN; > + else > inode_dio_wait(inode); No need for the else here. > } else if (iolock == XFS_IOLOCK_EXCL) { > xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); > iolock = XFS_IOLOCK_SHARED; > @@ -548,6 +549,8 @@ xfs_file_dio_aio_write( > > trace_xfs_file_direct_write(ip, count, iocb->ki_pos); > ret = iomap_dio_rw(iocb, from, &xfs_iomap_ops, xfs_dio_write_end_io); > + if (unaligned_io && !is_sync_kiocb(iocb)) > + inode_dio_wait(inode); Instead of explicittly waiting here I'd much rather just mark the I/O as sync before submitting it. The only thing needed for that is to clear iocb->ki_complete. To avoid too much low-level hacking that is probably best done with a: static inline void mark_kiocb_sync(struct kiocb *kiocb) { kiocb->ki_complete = NULL; } helper in fs.h.