From: "Andreas Hindborg (Samsung)" <nmi@xxxxxxxxxxxx> Zonefs will try to use `zonefs_file_dio_append()` for direct sync writes even if device `max_zone_append_sectors` is zero. This will cause the IO to fail as the io vector is truncated to zero. It also causes a call to `invalidate_inode_pages2_range()` with end set to UINT_MAX, which is probably not intentional. Thus, do not use append when device does not support it. Signed-off-by: Andreas Hindborg (Samsung) <nmi@xxxxxxxxxxxx> --- fs/zonefs/file.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/zonefs/file.c b/fs/zonefs/file.c index 132f01d3461f..c97fe2aa20b0 100644 --- a/fs/zonefs/file.c +++ b/fs/zonefs/file.c @@ -536,9 +536,11 @@ static ssize_t zonefs_write_checks(struct kiocb *iocb, struct iov_iter *from) static ssize_t zonefs_file_dio_write(struct kiocb *iocb, struct iov_iter *from) { struct inode *inode = file_inode(iocb->ki_filp); + struct block_device *bdev = inode->i_sb->s_bdev; struct zonefs_inode_info *zi = ZONEFS_I(inode); struct zonefs_zone *z = zonefs_inode_zone(inode); struct super_block *sb = inode->i_sb; + unsigned int max_append = bdev_max_zone_append_sectors(bdev); bool sync = is_sync_kiocb(iocb); bool append = false; ssize_t ret, count; @@ -581,7 +583,7 @@ static ssize_t zonefs_file_dio_write(struct kiocb *iocb, struct iov_iter *from) append = sync; } - if (append) { + if (append && max_append) { ret = zonefs_file_dio_append(iocb, from); } else { /* base-commit: 45a3e24f65e90a047bef86f927ebdc4c710edaa1 -- 2.41.0