Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xfs: remove xfs_filemap_map_pages() wrapper

Patch series "Prevent ->map_pages from sleeping", v2.

In preparation for a larger patch series which will handle (some, easy)
page faults protected only by RCU, change the two filesystems which have
sleeping locks to not take them and hold the RCU lock around calls to
->map_page to prevent other filesystems from adding sleeping locks.


This patch (of 3):

XFS doesn't actually need to be holding the XFS_MMAPLOCK_SHARED to do
this. filemap_map_pages() cannot bring new folios into the page cache
and the folio lock is taken during filemap_map_pages() which provides
sufficient protection against a truncation or hole punch.

Link: https://lkml.kernel.org/r/20230327174515.1811532-1-willy@infradead.org
Link: https://lkml.kernel.org/r/20230327174515.1811532-2-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Cc: Darrick J. Wong <djwong@kernel.org>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Matthew Wilcox (Oracle) and committed by
Andrew Morton
945ea457 02cd4eb8

+1 -16
+1 -16
fs/xfs/xfs_file.c
··· 1388 1388 return __xfs_filemap_fault(vmf, PE_SIZE_PTE, true); 1389 1389 } 1390 1390 1391 - static vm_fault_t 1392 - xfs_filemap_map_pages( 1393 - struct vm_fault *vmf, 1394 - pgoff_t start_pgoff, 1395 - pgoff_t end_pgoff) 1396 - { 1397 - struct inode *inode = file_inode(vmf->vma->vm_file); 1398 - vm_fault_t ret; 1399 - 1400 - xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); 1401 - ret = filemap_map_pages(vmf, start_pgoff, end_pgoff); 1402 - xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); 1403 - return ret; 1404 - } 1405 - 1406 1391 static const struct vm_operations_struct xfs_file_vm_ops = { 1407 1392 .fault = xfs_filemap_fault, 1408 1393 .huge_fault = xfs_filemap_huge_fault, 1409 - .map_pages = xfs_filemap_map_pages, 1394 + .map_pages = filemap_map_pages, 1410 1395 .page_mkwrite = xfs_filemap_page_mkwrite, 1411 1396 .pfn_mkwrite = xfs_filemap_pfn_mkwrite, 1412 1397 };