Message ID | 20200903200414.673105-3-krisman@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Unaligned DIO read error path fix and clean ups | expand |
On Thu 03-09-20 16:04:13, Gabriel Krisman Bertazi wrote: > If a DIO read starts past EOF, the kernel won't attempt it, so we don't > need to flush dirty pages before failing the syscall. > > Suggested-by: Jan Kara <jack@suse.cz> > Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> This patch looks good to me. You can add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/direct-io.c | 24 +++++++++++------------- > 1 file changed, 11 insertions(+), 13 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index 04aae41323d7..43460c8e0f90 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -1188,19 +1188,9 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, > memset(dio, 0, offsetof(struct dio, pages)); > > dio->flags = flags; > - if (dio->flags & DIO_LOCKING) { > - if (iov_iter_rw(iter) == READ) { > - struct address_space *mapping = > - iocb->ki_filp->f_mapping; > - > - /* will be released by direct_io_worker */ > - inode_lock(inode); > - > - retval = filemap_write_and_wait_range(mapping, offset, > - end - 1); > - if (retval) > - goto fail_dio; > - } > + if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ) { > + /* will be released by direct_io_worker */ > + inode_lock(inode); > } > > /* Once we sampled i_size check for reads beyond EOF */ > @@ -1210,6 +1200,14 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, > goto fail_dio; > } > > + if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ) { > + struct address_space *mapping = iocb->ki_filp->f_mapping; > + > + retval = filemap_write_and_wait_range(mapping, offset, end - 1); > + if (retval) > + goto fail_dio; > + } > + > /* > * For file extending writes updating i_size before data writeouts > * complete can expose uninitialized blocks in dumb filesystems. > -- > 2.28.0 >
diff --git a/fs/direct-io.c b/fs/direct-io.c index 04aae41323d7..43460c8e0f90 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -1188,19 +1188,9 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, memset(dio, 0, offsetof(struct dio, pages)); dio->flags = flags; - if (dio->flags & DIO_LOCKING) { - if (iov_iter_rw(iter) == READ) { - struct address_space *mapping = - iocb->ki_filp->f_mapping; - - /* will be released by direct_io_worker */ - inode_lock(inode); - - retval = filemap_write_and_wait_range(mapping, offset, - end - 1); - if (retval) - goto fail_dio; - } + if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ) { + /* will be released by direct_io_worker */ + inode_lock(inode); } /* Once we sampled i_size check for reads beyond EOF */ @@ -1210,6 +1200,14 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, goto fail_dio; } + if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ) { + struct address_space *mapping = iocb->ki_filp->f_mapping; + + retval = filemap_write_and_wait_range(mapping, offset, end - 1); + if (retval) + goto fail_dio; + } + /* * For file extending writes updating i_size before data writeouts * complete can expose uninitialized blocks in dumb filesystems.
If a DIO read starts past EOF, the kernel won't attempt it, so we don't need to flush dirty pages before failing the syscall. Suggested-by: Jan Kara <jack@suse.cz> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> --- fs/direct-io.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-)