On Tue, 25 Jan 2022, Mark Hemment wrote: > 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? Yes, I think it should - particularly as we don't take the mutex in the swap case. Thanks! This change improves the look of the code too :-) Thanks, NeilBrown