• Alistair Popple's avatar
    filemap: Fix serialization adding transparent huge pages to page cache · 00fa15e0
    Alistair Popple authored
    Commit 793917d9 ("mm/readahead: Add large folio readahead")
    introduced support for using large folios for filebacked pages if the
    filesystem supports it.
    
    page_cache_ra_order() was introduced to allocate and add these large
    folios to the page cache. However adding pages to the page cache should
    be serialized against truncation and hole punching by taking
    invalidate_lock. Not doing so can lead to data races resulting in stale
    data getting added to the page cache and marked up-to-date. See commit
    730633f0 ("mm: Protect operations adding pages to page cache with
    invalidate_lock") for more details.
    
    This issue was found by inspection but a testcase revealed it was
    possible to observe in practice on XFS. Fix this by taking
    invalidate_lock in page_cache_ra_order(), to mirror what is done for the
    non-thp case in page_cache_ra_unbounded().
    Signed-off-by: default avatarAlistair Popple <apopple@nvidia.com>
    Fixes: 793917d9 ("mm/readahead: Add large folio readahead")
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    00fa15e0
readahead.c 25.3 KB