gfs2: Don't get stuck writing page onto itself under direct I/O
authorAndreas Gruenbacher <agruenba@redhat.com>
Wed, 31 May 2023 19:08:26 +0000 (21:08 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Thu, 1 Jun 2023 12:55:43 +0000 (14:55 +0200)
commitfa58cc888d67e640e354d8b3ceef877ea167b0cf
tree01be5d4e36e63ce30618859c9d3cda8113abf63a
parent48b1320a674e1ff5de2fad8606bee38f724594dc
gfs2: Don't get stuck writing page onto itself under direct I/O

When a direct I/O write is performed, iomap_dio_rw() invalidates the
part of the page cache which the write is going to before carrying out
the write.  In the odd case, the direct I/O write will be reading from
the same page it is writing to.  gfs2 carries out writes with page
faults disabled, so it should have been obvious that this page
invalidation can cause iomap_dio_rw() to never make any progress.
Currently, gfs2 will end up in an endless retry loop in
gfs2_file_direct_write() instead, though.

Break this endless loop by limiting the number of retries and falling
back to buffered I/O after that.

Also simplify should_fault_in_pages() sightly and add a comment to make
the above case easier to understand.

Reported-by: Jan Kara <jack@suse.cz>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/file.c