Commit 7c69eb84 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Damien Le Moal
Browse files

zonefs: fix IOCB_NOWAIT handling



IOCB_NOWAIT can't just be ignored as it breaks applications expecting
it not to block.  Just refuse the operation as applications must handle
that (e.g. by falling back to a thread pool).

Fixes: 8dcc1a9d ("fs: New zonefs file system")
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
parent 4c5fd3b7
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -601,13 +601,13 @@ static ssize_t zonefs_file_dio_write(struct kiocb *iocb, struct iov_iter *from)
	ssize_t ret;

	/*
	 * For async direct IOs to sequential zone files, ignore IOCB_NOWAIT
	 * For async direct IOs to sequential zone files, refuse IOCB_NOWAIT
	 * as this can cause write reordering (e.g. the first aio gets EAGAIN
	 * on the inode lock but the second goes through but is now unaligned).
	 */
	if (zi->i_ztype == ZONEFS_ZTYPE_SEQ && !is_sync_kiocb(iocb)
	    && (iocb->ki_flags & IOCB_NOWAIT))
		iocb->ki_flags &= ~IOCB_NOWAIT;
	if (zi->i_ztype == ZONEFS_ZTYPE_SEQ && !is_sync_kiocb(iocb) &&
	    (iocb->ki_flags & IOCB_NOWAIT))
		return -EOPNOTSUPP;

	if (iocb->ki_flags & IOCB_NOWAIT) {
		if (!inode_trylock(inode))