mirror of https://gitee.com/openkylin/linux.git
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: 8dcc1a9d90
("fs: New zonefs file system")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
This commit is contained in:
parent
4c5fd3b791
commit
7c69eb84d9
|
@ -601,13 +601,13 @@ static ssize_t zonefs_file_dio_write(struct kiocb *iocb, struct iov_iter *from)
|
||||||
ssize_t ret;
|
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
|
* 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).
|
* on the inode lock but the second goes through but is now unaligned).
|
||||||
*/
|
*/
|
||||||
if (zi->i_ztype == ZONEFS_ZTYPE_SEQ && !is_sync_kiocb(iocb)
|
if (zi->i_ztype == ZONEFS_ZTYPE_SEQ && !is_sync_kiocb(iocb) &&
|
||||||
&& (iocb->ki_flags & IOCB_NOWAIT))
|
(iocb->ki_flags & IOCB_NOWAIT))
|
||||||
iocb->ki_flags &= ~IOCB_NOWAIT;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (iocb->ki_flags & IOCB_NOWAIT) {
|
if (iocb->ki_flags & IOCB_NOWAIT) {
|
||||||
if (!inode_trylock(inode))
|
if (!inode_trylock(inode))
|
||||||
|
|
Loading…
Reference in New Issue