• Linus Torvalds's avatar
    Merge tag 'netfs-prep-20220318' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs · f008b1d6
    Linus Torvalds authored
    Pull netfs updates from David Howells:
     "Netfs prep for write helpers.
    
      Having had a go at implementing write helpers and content encryption
      support in netfslib, it seems that the netfs_read_{,sub}request
      structs and the equivalent write request structs were almost the same
      and so should be merged, thereby requiring only one set of
      alloc/get/put functions and a common set of tracepoints.
    
      Merging the structs also has the advantage that if a bounce buffer is
      added to the request struct, a read operation can be performed to fill
      the bounce buffer, the contents of the buffer can be modified and then
      a write operation can be performed on it to send the data wherever it
      needs to go using the same request structure all the way through. The
      I/O handlers would then transparently perform any required crypto.
      This should make it easier to perform RMW cycles if needed.
    
      The potentially common functions and structs, however, by their names
      all proclaim themselves to be associated with the read side of things.
    
      The bulk of these changes alter this in the following ways:
    
       - Rename struct netfs_read_{,sub}request to netfs_io_{,sub}request.
    
       - Rename some enums, members and flags to make them more appropriate.
    
       - Adjust some comments to match.
    
       - Drop "read"/"rreq" from the names of common functions. For
         instance, netfs_get_read_request() becomes netfs_get_request().
    
       - The ->init_rreq() and ->issue_op() methods become ->init_request()
         and ->issue_read(). I've kept the latter as a read-specific
         function and in another branch added an ->issue_write() method.
    
      The driver source is then reorganised into a number of files:
    
            fs/netfs/buffered_read.c        Create read reqs to the pagecache
            fs/netfs/io.c                   Dispatchers for read and write reqs
            fs/netfs/main.c                 Some general miscellaneous bits
            fs/netfs/objects.c              Alloc, get and put functions
            fs/netfs/stats.c                Optional procfs statistics.
    
      and future development can be fitted into this scheme, e.g.:
    
            fs/netfs/buffered_write.c       Modify the pagecache
            fs/netfs/buffered_flush.c       Writeback from the pagecache
            fs/netfs/direct_read.c          DIO read support
            fs/netfs/direct_write.c         DIO write support
            fs/netfs/unbuffered_write.c     Write modifications directly back
    
      Beyond the above changes, there are also some changes that affect how
      things work:
    
       - Make fscache_end_operation() generally available.
    
       - In the netfs tracing header, generate enums from the symbol ->
         string mapping tables rather than manually coding them.
    
       - Add a struct for filesystems that uses netfslib to put into their
         inode wrapper structs to hold extra state that netfslib is
         interested in, such as the fscache cookie. This allows netfslib
         functions to be set in filesystem operation tables and jumped to
         directly without having to have a filesystem wrapper.
    
       - Add a member to the struct added above to track the remote inode
         length as that may differ if local modifications are buffered. We
         may need to supply an appropriate EOF pointer when storing data (in
         AFS for example).
    
       - Pass extra information to netfs_alloc_request() so that the
         ->init_request() hook can access it and retain information to
         indicate the origin of the operation.
    
       - Make the ->init_request() hook return an error, thereby allowing a
         filesystem that isn't allowed to cache an inode (ceph or cifs, for
         example) to skip readahead.
    
       - Switch to using refcount_t for subrequests and add tracepoints to
         log refcount changes for the request and subrequest structs.
    
       - Add a function to consolidate dispatching a read request. Similar
         code is used in three places and another couple are likely to be
         added in the future"
    
    Link: https://lore.kernel.org/all/2639515.1648483225@warthog.procyon.org.uk/
    
    * tag 'netfs-prep-20220318' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
      afs: Maintain netfs_i_context::remote_i_size
      netfs: Keep track of the actual remote file size
      netfs: Split some core bits out into their own file
      netfs: Split fs/netfs/read_helper.c
      netfs: Rename read_helper.c to io.c
      netfs: Prepare to split read_helper.c
      netfs: Add a function to consolidate beginning a read
      netfs: Add a netfs inode context
      ceph: Make ceph_init_request() check caps on readahead
      netfs: Change ->init_request() to return an error code
      netfs: Refactor arguments for netfs_alloc_read_request
      netfs: Adjust the netfs_failure tracepoint to indicate non-subreq lines
      netfs: Trace refcounting on the netfs_io_subrequest struct
      netfs: Trace refcounting on the netfs_io_request struct
      netfs: Adjust the netfs_rreq tracepoint slightly
      netfs: Split netfs_io_* object handling out
      netfs: Finish off rename of netfs_read_request to netfs_io_request
      netfs: Rename netfs_read_*request to netfs_io_*request
      netfs: Generate enums from trace symbol mapping lists
      fscache: export fscache_end_operation()
    f008b1d6
cache.h 3.63 KB