• David Howells's avatar
    vfs, fscache: Implement pinning of cache usage for writeback · 08276bda
    David Howells authored
    Cachefiles has a problem in that it needs to keep the backing file for a
    cookie open whilst there are local modifications pending that need to be
    written to it.  However, we don't want to keep the file open indefinitely,
    as that causes EMFILE/ENFILE/ENOMEM problems.
    
    Reopening the cache file, however, is a problem if this is being done due
    to writeback triggered by exit().  Some filesystems will oops if we try to
    open a file in that context because they want to access current->fs or
    other resources that have already been dismantled.
    
    To get around this, I added the following:
    
     (1) An inode flag, I_PINNING_FSCACHE_WB, to be set on a network filesystem
         inode to indicate that we have a usage count on the cookie caching
         that inode.
    
     (2) A flag in struct writeback_control, unpinned_fscache_wb, that is set
         when __writeback_single_inode() clears the last dirty page from
         i_pages - at which point it clears I_PINNING_FSCACHE_WB and sets this
         flag.
    
         This has to be done here so that clearing I_PINNING_FSCACHE_WB can be
         done atomically with the check of PAGECACHE_TAG_DIRTY that clears
         I_DIRTY_PAGES.
    
     (3) A function, fscache_set_page_dirty(), which if it is not set, sets
         I_PINNING_FSCACHE_WB and calls fscache_use_cookie() to pin the cache
         resources.
    
     (4) A function, fscache_unpin_writeback(), to be called by ->write_inode()
         to unuse the cookie.
    
     (5) A function, fscache_clear_inode_writeback(), to be called when the
         inode is evicted, before clear_inode() is called.  This cleans up any
         lingering I_PINNING_FSCACHE_WB.
    
    The network filesystem can then use these tools to make sure that
    fscache_write_to_cache() can write locally modified data to the cache as
    well as to the server.
    
    For the future, I'm working on write helpers for netfs lib that should
    allow this facility to be removed by keeping track of the dirty regions
    separately - but that's incomplete at the moment and is also going to be
    affected by folios, one way or another, since it deals with pages
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com
    Link: https://lore.kernel.org/r/163819615157.215744.17623791756928043114.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/163906917856.143852.8224898306177154573.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/163967124567.1823006.14188359004568060298.stgit@warthog.procyon.org.uk/ # v3
    Link: https://lore.kernel.org/r/164021524705.640689.17824932021727663017.stgit@warthog.procyon.org.uk/ # v4
    08276bda
io.c 7.85 KB