On Fri, Jun 03, 2022 at 08:49:39PM +0900, Damien Le Moal wrote: > If a read operation (e.g. a readahead) is issued to a sequential zone > file with an offset exactly equal to the current file size, the iomap > type will be set to IOMAP_UNWRITTEN, which will prevent an IO, but the > iomap length is always calculated as 0. This causes a WARN_ON() in > iomap_iter(): Is there a testsuite somewhere with a reproducer? > diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c > index 123464d2145a..64f4ceb6f579 100644 > --- a/fs/zonefs/super.c > +++ b/fs/zonefs/super.c > @@ -144,7 +144,7 @@ static int zonefs_iomap_begin(struct inode *inode, loff_t offset, loff_t length, > iomap->type = IOMAP_MAPPED; > if (flags & IOMAP_WRITE) > length = zi->i_max_size - offset; > - else > + else if (offset < isize) > length = min(length, isize - offset); So you still report an IOMAP_UNWRITTEN extent for the whole size of the requst past EOF? Looking at XFS we do return the whole requested length, but do return it as HOLE. Maybe we need to clarify the behavior here and document it.