• David Howells's avatar
    mm: Provide a means of invalidation without using launder_folio · 74e797d7
    David Howells authored
    Implement a replacement for launder_folio.  The key feature of
    invalidate_inode_pages2() is that it locks each folio individually, unmaps
    it to prevent mmap'd accesses interfering and calls the ->launder_folio()
    address_space op to flush it.  This has problems: firstly, each folio is
    written individually as one or more small writes; secondly, adjacent folios
    cannot be added so easily into the laundry; thirdly, it's yet another op to
    implement.
    
    Instead, use the invalidate lock to cause anyone wanting to add a folio to
    the inode to wait, then unmap all the folios if we have mmaps, then,
    conditionally, use ->writepages() to flush any dirty data back and then
    discard all pages.
    
    The invalidate lock prevents ->read_iter(), ->write_iter() and faulting
    through mmap all from adding pages for the duration.
    
    This is then used from netfslib to handle the flusing in unbuffered and
    direct writes.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Matthew Wilcox <willy@infradead.org>
    cc: Miklos Szeredi <miklos@szeredi.hu>
    cc: Trond Myklebust <trond.myklebust@hammerspace.com>
    cc: Christoph Hellwig <hch@lst.de>
    cc: Andrew Morton <akpm@linux-foundation.org>
    cc: Alexander Viro <viro@zeniv.linux.org.uk>
    cc: Christian Brauner <brauner@kernel.org>
    cc: Jeff Layton <jlayton@kernel.org>
    cc: linux-mm@kvack.org
    cc: linux-fsdevel@vger.kernel.org
    cc: netfs@lists.linux.dev
    cc: v9fs@lists.linux.dev
    cc: linux-afs@lists.infradead.org
    cc: ceph-devel@vger.kernel.org
    cc: linux-cifs@vger.kernel.org
    cc: linux-nfs@vger.kernel.org
    cc: devel@lists.orangefs.org
    74e797d7
filemap.c 123 KB