On Mon, 24 Jan 2022 at 03:53, NeilBrown <neilb@xxxxxxx> wrote: > > 1/ Taking the i_rwsem for swap IO triggers lockdep warnings regarding > possible deadlocks with "fs_reclaim". These deadlocks could, I believe, > eventuate if a buffered read on the swapfile was attempted. > > We don't need coherence with the page cache for a swap file, and > buffered writes are forbidden anyway. There is no other need for > i_rwsem during direct IO. So never take it for swap_rw() > > 2/ generic_write_checks() explicitly forbids writes to swap, and > performs checks that are not needed for swap. So bypass it > for swap_rw(). > > Signed-off-by: NeilBrown <neilb@xxxxxxx> > --- > fs/nfs/direct.c | 30 +++++++++++++++++++++--------- > fs/nfs/file.c | 4 ++-- > include/linux/nfs_fs.h | 4 ++-- > 3 files changed, 25 insertions(+), 13 deletions(-) > ... > @@ -943,7 +954,8 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, struct iov_iter *iter) > pos >> PAGE_SHIFT, end); > } > > - nfs_end_io_direct(inode); > + if (!swap) > + nfs_end_io_direct(inode); Just above this code diff, there is; if (mapping->nrpages) { invalidate_inode_pages2_range(mapping, pos >> PAGE_SHIFT, end); } This invalidation looks strange/wrong for a NFS swap write. Should it be disabled for the swap case? Cheers, Mark