• David Howells's avatar
    netfs: Fix netfs_page_mkwrite() to check folio->mapping is valid · a81c98bf
    David Howells authored
    Fix netfs_page_mkwrite() to check that folio->mapping is valid once it has
    taken the folio lock (as filemap_page_mkwrite() does).  Without this,
    generic/247 occasionally oopses with something like the following:
    
        BUG: kernel NULL pointer dereference, address: 0000000000000000
        #PF: supervisor read access in kernel mode
        #PF: error_code(0x0000) - not-present page
    
        RIP: 0010:trace_event_raw_event_netfs_folio+0x61/0xc0
        ...
        Call Trace:
         <TASK>
         ? __die_body+0x1a/0x60
         ? page_fault_oops+0x6e/0xa0
         ? exc_page_fault+0xc2/0xe0
         ? asm_exc_page_fault+0x22/0x30
         ? trace_event_raw_event_netfs_folio+0x61/0xc0
         trace_netfs_folio+0x39/0x40
         netfs_page_mkwrite+0x14c/0x1d0
         do_page_mkwrite+0x50/0x90
         do_pte_missing+0x184/0x200
         __handle_mm_fault+0x42d/0x500
         handle_mm_fault+0x121/0x1f0
         do_user_addr_fault+0x23e/0x3c0
         exc_page_fault+0xc2/0xe0
         asm_exc_page_fault+0x22/0x30
    
    This is due to the invalidate_inode_pages2_range() issued at the end of the
    DIO write interfering with the mmap'd writes.
    
    Fixes: 102a7e2c
    
     ("netfs: Allow buffered shared-writeable mmap through netfs_page_mkwrite()")
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Link: https://lore.kernel.org/r/780211.1719318546@warthog.procyon.org.uk
    
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    cc: Matthew Wilcox <willy@infradead.org>
    cc: Jeff Layton <jlayton@kernel.org>
    cc: netfs@lists.linux.dev
    cc: v9fs@lists.linux.dev
    cc: linux-afs@lists.infradead.org
    cc: linux-cifs@vger.kernel.org
    cc: linux-mm@kvack.org
    cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    a81c98bf
buffered_write.c 16.5 KB