--- y/mm/filemap.c +++ x/mm/filemap.c @@ -1953,6 +1953,8 @@ repeat: goto no_page; if (fgp_flags & FGP_LOCK) { + long pages = folio_nr_pages(folio); + if (fgp_flags & FGP_NOWAIT) { if (!folio_trylock(folio)) { folio_put(folio); @@ -1963,7 +1965,8 @@ repeat: } /* Has the page been truncated? */ - if (unlikely(folio->mapping != mapping)) { + /* A huge page split while locking folio? */ + if (unlikely(folio->mapping != mapping || pages != folio_nr_pages(folio))) { folio_unlock(folio); folio_put(folio); goto repeat;