> @@ -528,12 +528,17 @@ xfs_file_dio_aio_write( > ((iocb->ki_pos + count) & mp->m_blockmask)) { > unaligned_io = 1; > iolock = XFS_IOLOCK_EXCL; > + if (iocb->ki_flags & IOCB_NOWAIT) > + return -EAGAIN; So all unaligned I/O will return -EAGAIN? Why? Also please explain that reason in a comment right here. > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 1aa3abd..84f981a 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -1020,6 +1020,11 @@ xfs_file_iomap_begin( > if ((flags & IOMAP_REPORT) || > (xfs_is_reflink_inode(ip) && > (flags & IOMAP_WRITE) && (flags & IOMAP_DIRECT))) { > + /* Allocations due to reflinks */ > + if ((flags & IOMAP_NOWAIT) && !(flags & IOMAP_REPORT)) { > + error = -EAGAIN; > + goto out_unlock; > + } FYI, this code looks very different in current Linus' tree - I think you're on some old kernel base.