Commit Graph

13 Commits

Author SHA1 Message Date
Jeffrey Layton 33382c22fa netfs: Fix gcc-12 warning by embedding vfs inode in netfs_i_context
Bugzilla: http://bugzilla.redhat.com/1229736

commit 874c8ca1e60b2c564a48f7e7acc40d328d5c8733
Author: David Howells <dhowells@redhat.com>
Date:   Thu Jun 9 21:46:04 2022 +0100

    netfs: Fix gcc-12 warning by embedding vfs inode in netfs_i_context

    While randstruct was satisfied with using an open-coded "void *" offset
    cast for the netfs_i_context <-> inode casting, __builtin_object_size() as
    used by FORTIFY_SOURCE was not as easily fooled.  This was causing the
    following complaint[1] from gcc v12:

      In file included from include/linux/string.h:253,
                       from include/linux/ceph/ceph_debug.h:7,
                       from fs/ceph/inode.c:2:
      In function 'fortify_memset_chk',
          inlined from 'netfs_i_context_init' at include/linux/netfs.h:326:2,
          inlined from 'ceph_alloc_inode' at fs/ceph/inode.c:463:2:
      include/linux/fortify-string.h:242:25: warning: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Wattribute-warning]
        242 |                         __write_overflow_field(p_size_field, size);
            |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Fix this by embedding a struct inode into struct netfs_i_context (which
    should perhaps be renamed to struct netfs_inode).  The struct inode
    vfs_inode fields are then removed from the 9p, afs, ceph and cifs inode
    structs and vfs_inode is then simply changed to "netfs.inode" in those
    filesystems.

    Further, rename netfs_i_context to netfs_inode, get rid of the
    netfs_inode() function that converted a netfs_i_context pointer to an
    inode pointer (that can now be done with &ctx->inode) and rename the
    netfs_i_context() function to netfs_inode() (which is now a wrapper
    around container_of()).

    Most of the changes were done with:

      perl -p -i -e 's/vfs_inode/netfs.inode/'g \
            `git grep -l 'vfs_inode' -- fs/{9p,afs,ceph,cifs}/*.[ch]`

    Kees suggested doing it with a pair structure[2] and a special
    declarator to insert that into the network filesystem's inode
    wrapper[3], but I think it's cleaner to embed it - and then it doesn't
    matter if struct randomisation reorders things.

    Dave Chinner suggested using a filesystem-specific VFS_I() function in
    each filesystem to convert that filesystem's own inode wrapper struct
    into the VFS inode struct[4].

    Version #2:
     - Fix a couple of missed name changes due to a disabled cifs option.
     - Rename nfs_i_context to nfs_inode
     - Use "netfs" instead of "nic" as the member name in per-fs inode wrapper
       structs.

    [ This also undoes commit 507160f46c55 ("netfs: gcc-12: temporarily
      disable '-Wattribute-warning' for now") that is no longer needed ]

    Fixes: bc899ee1c898 ("netfs: Add a netfs inode context")
    Reported-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: Xiubo Li <xiubli@redhat.com>
    cc: Jonathan Corbet <corbet@lwn.net>
    cc: Eric Van Hensbergen <ericvh@gmail.com>
    cc: Latchesar Ionkov <lucho@ionkov.net>
    cc: Dominique Martinet <asmadeus@codewreck.org>
    cc: Christian Schoenebeck <linux_oss@crudebyte.com>
    cc: Marc Dionne <marc.dionne@auristor.com>
    cc: Ilya Dryomov <idryomov@gmail.com>
    cc: Steve French <smfrench@gmail.com>
    cc: William Kucharski <william.kucharski@oracle.com>
    cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    cc: Dave Chinner <david@fromorbit.com>
    cc: linux-doc@vger.kernel.org
    cc: v9fs-developer@lists.sourceforge.net
    cc: linux-afs@lists.infradead.org
    cc: ceph-devel@vger.kernel.org
    cc: linux-cifs@vger.kernel.org
    cc: samba-technical@lists.samba.org
    cc: linux-fsdevel@vger.kernel.org
    cc: linux-hardening@vger.kernel.org
    Link: https://lore.kernel.org/r/d2ad3a3d7bdd794c6efb562d2f2b655fb67756b9.camel@kernel.org/ [1]
    Link: https://lore.kernel.org/r/20220517210230.864239-1-keescook@chromium.org/ [2]
    Link: https://lore.kernel.org/r/20220518202212.2322058-1-keescook@chromium.org/ [3]
    Link: https://lore.kernel.org/r/20220524101205.GI2306852@dread.disaster.area/ [4]
    Link: https://lore.kernel.org/r/165296786831.3591209.12111293034669289733.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/165305805651.4094995.7763502506786714216.stgit@warthog.procyon.org.uk # v2
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:29 -04:00
Jeffrey Layton 77a2dfa442 netfs: Split some core bits out into their own file
Bugzilla: http://bugzilla.redhat.com/1229736

commit b900f4b89b4d44aa1a79111763b6dfab51e5e3af
Author: David Howells <dhowells@redhat.com>
Date:   Tue Mar 1 15:25:00 2022 +0000

    netfs: Split some core bits out into their own file

    Split some core bits out into their own file.  More bits will be added to
    this file later.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164623006934.3564931.17932680017894039748.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678218407.1200972.1731208226140990280.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692920944.2099075.11990502173226013856.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:26 -04:00
Jeffrey Layton 2ba6eae6b0 netfs: Rename read_helper.c to io.c
Bugzilla: http://bugzilla.redhat.com/1229736

commit 3be01750d7ac5803ad6fa76801d4d80b3814229f
Author: David Howells <dhowells@redhat.com>
Date:   Mon Mar 7 21:57:24 2022 +0000

    netfs: Rename read_helper.c to io.c

    Rename the read_helper.c file to io.c before splitting out the buffered
    read functions and some other bits.

    Changes
    =======
    ver #2)
     - Rename read_helper.c before splitting.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164678216109.1200972.16567696909952495832.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692918076.2099075.8120961172717347610.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:26 -04:00
Jeffrey Layton 824c836790 netfs: Prepare to split read_helper.c
Bugzilla: http://bugzilla.redhat.com/1229736

commit 93345c3ba55f62f6b7189cdab354c7293fd45d75
Author: David Howells <dhowells@redhat.com>
Date:   Tue Mar 1 15:55:15 2022 +0000

    netfs: Prepare to split read_helper.c

    Rename netfs_rreq_unlock() to netfs_rreq_unlock_folios() to make it sound
    less like it's dropping a lock on an netfs_io_request struct.

    Remove the 'static' marker on netfs_rreq_unlock_folios() and declaring it
    in internal.h preparatory to splitting the file.

    Changes
    =======
    ver #2)
     - Slide this patch to after the one adding netfs_begin_read().
     - As a consequence, don't need to unstatic so many functions.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164623002861.3564931.17340149482236413375.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678215208.1200972.9761906209395002182.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692912709.2099075.4349905992838317797.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:25 -04:00
Jeffrey Layton b6b3220e66 netfs: Add a function to consolidate beginning a read
Bugzilla: http://bugzilla.redhat.com/1229736

commit 4090b31422a6f24dfe701e31ffec7ba5804a7e2f
Author: David Howells <dhowells@redhat.com>
Date:   Wed Mar 2 10:50:22 2022 +0000

    netfs: Add a function to consolidate beginning a read

    Add a function to do the steps needed to begin a read request, allowing
    this code to be removed from several other functions and consolidated.

    Changes
    =======
    ver #2)
     - Move before the unstaticking patch so that some functions can be left
       static.
     - Set uninitialised return code in netfs_begin_read()[1][2].
     - Fixed a refleak caused by non-removal of a get from netfs_write_begin()
       when the request submission code got moved to netfs_begin_read().
     - Use INIT_WORK() to (re-)init the request work_struct[3].

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/20220303163826.1120936-1-nathan@kernel.org/ [1]
    Link: https://lore.kernel.org/r/20220303235647.1297171-1-colin.i.king@gmail.com/ [2]
    Link: https://lore.kernel.org/r/9d69be49081bccff44260e4c6e0049c63d6d04a1.camel@redhat.com/ [3]
    Link: https://lore.kernel.org/r/164623004355.3564931.7275693529042495641.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678214287.1200972.16734134007649832160.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692911113.2099075.1060868473229451371.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:25 -04:00
Jeffrey Layton 1413fa5e52 netfs: Add a netfs inode context
Bugzilla: http://bugzilla.redhat.com/1229736

commit bc899ee1c898e520574ff4d99356eb2e724a9265
Author: David Howells <dhowells@redhat.com>
Date:   Tue Jun 29 22:37:05 2021 +0100

    netfs: Add a netfs inode context

    Add a netfs_i_context struct that should be included in the network
    filesystem's own inode struct wrapper, directly after the VFS's inode
    struct, e.g.:

            struct my_inode {
                    struct {
                            /* These must be contiguous */
                            struct inode            vfs_inode;
                            struct netfs_i_context  netfs_ctx;
                    };
            };

    The netfs_i_context struct so far contains a single field for the network
    filesystem to use - the cache cookie:

            struct netfs_i_context {
                    ...
                    struct fscache_cookie   *cache;
            };

    Three functions are provided to help with this:

     (1) void netfs_i_context_init(struct inode *inode,
                                   const struct netfs_request_ops *ops);

         Initialise the netfs context and set the operations.

     (2) struct netfs_i_context *netfs_i_context(struct inode *inode);

         Find the netfs context from the VFS inode.

     (3) struct inode *netfs_inode(struct netfs_i_context *ctx);

         Find the VFS inode from the netfs context.

    Changes
    =======
    ver #4)
     - Fix netfs_is_cache_enabled() to check cookie->cache_priv to see if a
       cache is present[3].
     - Fix netfs_skip_folio_read() to zero out all of the page, not just some
       of it[3].

    ver #3)
     - Split out the bit to move ceph cap-getting on readahead into
       ceph_init_request()[1].
     - Stick in a comment to the netfs inode structs indicating the contiguity
       requirements[2].

    ver #2)
     - Adjust documentation to match.
     - Use "#if IS_ENABLED()" in netfs_i_cookie(), not "#ifdef".
     - Move the cap check from ceph_readahead() to ceph_init_request() to be
       called from netfslib.
     - Remove ceph_readahead() and use  netfs_readahead() directly instead.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Acked-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/8af0d47f17d89c06bbf602496dd845f2b0bf25b3.camel@kernel.org/ [1]
    Link: https://lore.kernel.org/r/beaf4f6a6c2575ed489adb14b257253c868f9a5c.camel@kernel.org/ [2]
    Link: https://lore.kernel.org/r/3536452.1647421585@warthog.procyon.org.uk/ [3]
    Link: https://lore.kernel.org/r/164622984545.3564931.15691742939278418580.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678213320.1200972.16807551936267647470.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692909854.2099075.9535537286264248057.stgit@warthog.procyon.org.uk/ # v3
    Link: https://lore.kernel.org/r/306388.1647595110@warthog.procyon.org.uk/ # v4

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:25 -04:00
Jeffrey Layton 17bf97448f netfs: Refactor arguments for netfs_alloc_read_request
Bugzilla: http://bugzilla.redhat.com/1229736

commit 663dfb65c3b3ea4b8e1944680352992d58f3aa22
Author: David Howells <dhowells@redhat.com>
Date:   Thu Aug 26 09:24:42 2021 -0400

    netfs: Refactor arguments for netfs_alloc_read_request

    Pass start and len to the rreq allocator. This should ensure that the
    fields are set so that ->init_request() can use them.

    Also add a parameter to indicates the origin of the request.  Ceph can use
    this to tell whether to get caps.

    Changes
    =======
    ver #3)
     - Change the author to me as Jeff feels that most of the patch is my
       changes now.

    ver #2)
     - Show the request origin in the netfs_rreq tracepoint.

    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Co-developed-by: David Howells <dhowells@redhat.com>
    Signed-off-by: David Howells <dhowells@redhat.com>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164622989020.3564931.17517006047854958747.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678208569.1200972.12153682697842916557.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692904155.2099075.14717645623034355995.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:25 -04:00
Jeffrey Layton 0d15d0004d netfs: Trace refcounting on the netfs_io_subrequest struct
Bugzilla: http://bugzilla.redhat.com/1229736

commit 6cd3d6fd1fe2feae5ff9f6a821081569bb140bf4
Author: David Howells <dhowells@redhat.com>
Date:   Thu Feb 17 15:01:24 2022 +0000

    netfs: Trace refcounting on the netfs_io_subrequest struct

    Add refcount tracing for the netfs_io_subrequest structure.

    Changes
    =======
    ver #3)
     - Switch 'W=' to 'R=' in the traceline to match other request debug IDs.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164622998584.3564931.5052255990645723639.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678202603.1200972.14726007419792315578.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692901860.2099075.4845820886851239935.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:25 -04:00
Jeffrey Layton b95c7c15a3 netfs: Trace refcounting on the netfs_io_request struct
Bugzilla: http://bugzilla.redhat.com/1229736

commit de74023befa1876f64bc5871a2a4a51850517118
Author: David Howells <dhowells@redhat.com>
Date:   Thu Feb 17 21:13:05 2022 +0000

    netfs: Trace refcounting on the netfs_io_request struct

    Add refcount tracing for the netfs_io_request structure.

    Changes
    =======
    ver #3)
     - Switch 'W=' to 'R=' in the traceline to match other request debug IDs.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164622997668.3564931.14456171619219324968.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678200943.1200972.7241495532327787765.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692900920.2099075.11847712419940675791.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:25 -04:00
Jeffrey Layton 606386beb7 netfs: Split netfs_io_* object handling out
Bugzilla: http://bugzilla.redhat.com/1229736

commit 3a4a38e66d2443ab3c27a689c62a6937b854010e
Author: David Howells <dhowells@redhat.com>
Date:   Thu Feb 17 13:30:38 2022 +0000

    netfs: Split netfs_io_* object handling out

    Split netfs_io_* object handling out into a file that's going to contain
    object allocation, get and put routines.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@redhat.com>
    cc: linux-cachefs@redhat.com

    Link: https://lore.kernel.org/r/164622995118.3564931.6089530629052064470.stgit@warthog.procyon.org.uk/ # v1
    Link: https://lore.kernel.org/r/164678197044.1200972.11511937252083343775.stgit@warthog.procyon.org.uk/ # v2
    Link: https://lore.kernel.org/r/164692894693.2099075.7831091294248735173.stgit@warthog.procyon.org.uk/ # v3

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2022-08-22 12:32:24 -04:00
David Howells e1b1240c1f netfs: Add write_begin helper
Add a helper to do the pre-reading work for the netfs write_begin address
space op.

Changes
v6:
- Fixed a missing rreq put in netfs_write_begin()[3].
- Use DEFINE_READAHEAD()[4].

v5:
- Made the wait for PG_fscache in netfs_write_begin() killable[2].

v4:
- Added flag to netfs_subreq_terminated() to indicate that the caller may
  have been running async and stuff that might sleep needs punting to a
  workqueue (can't use in_softirq()[1]).

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-and-tested-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Dave Wysochanski <dwysocha@redhat.com>
Tested-By: Marc Dionne <marc.dionne@auristor.com>
cc: Matthew Wilcox <willy@infradead.org>
cc: linux-mm@kvack.org
cc: linux-cachefs@redhat.com
cc: linux-afs@lists.infradead.org
cc: linux-nfs@vger.kernel.org
cc: linux-cifs@vger.kernel.org
cc: ceph-devel@vger.kernel.org
cc: v9fs-developer@lists.sourceforge.net
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20210216084230.GA23669@lst.de/ [1]
Link: https://lore.kernel.org/r/2499407.1616505440@warthog.procyon.org.uk/ [2]
Link: https://lore.kernel.org/r/161781042127.463527.9154479794406046987.stgit@warthog.procyon.org.uk/ [3]
Link: https://lore.kernel.org/r/1234933.1617886271@warthog.procyon.org.uk/ [4]
Link: https://lore.kernel.org/r/160588543960.3465195.2792938973035886168.stgit@warthog.procyon.org.uk/ # rfc
Link: https://lore.kernel.org/r/161118140165.1232039.16418853874312234477.stgit@warthog.procyon.org.uk/ # rfc
Link: https://lore.kernel.org/r/161161035539.2537118.15674887534950908530.stgit@warthog.procyon.org.uk/ # v2
Link: https://lore.kernel.org/r/161340398368.1303470.11242918276563276090.stgit@warthog.procyon.org.uk/ # v3
Link: https://lore.kernel.org/r/161539541541.286939.1889738674057013729.stgit@warthog.procyon.org.uk/ # v4
Link: https://lore.kernel.org/r/161653798616.2770958.17213315845968485563.stgit@warthog.procyon.org.uk/ # v5
Link: https://lore.kernel.org/r/161789080530.6155.1011847312392330491.stgit@warthog.procyon.org.uk/ # v6
2021-04-23 10:14:32 +01:00
David Howells 289af54cc6 netfs: Gather stats
Gather statistics from the netfs interface that can be exported through a
seqfile.  This is intended to be called by a later patch when viewing
/proc/fs/fscache/stats.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-and-tested-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Dave Wysochanski <dwysocha@redhat.com>
Tested-By: Marc Dionne <marc.dionne@auristor.com>
cc: Matthew Wilcox <willy@infradead.org>
cc: linux-mm@kvack.org
cc: linux-cachefs@redhat.com
cc: linux-afs@lists.infradead.org
cc: linux-nfs@vger.kernel.org
cc: linux-cifs@vger.kernel.org
cc: ceph-devel@vger.kernel.org
cc: v9fs-developer@lists.sourceforge.net
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/161118139247.1232039.10556850937548511068.stgit@warthog.procyon.org.uk/ # rfc
Link: https://lore.kernel.org/r/161161034669.2537118.2761232524997091480.stgit@warthog.procyon.org.uk/ # v2
Link: https://lore.kernel.org/r/161340397101.1303470.17581910581108378458.stgit@warthog.procyon.org.uk/ # v3
Link: https://lore.kernel.org/r/161539539959.286939.6794352576462965914.stgit@warthog.procyon.org.uk/ # v4
Link: https://lore.kernel.org/r/161653797700.2770958.5801990354413178228.stgit@warthog.procyon.org.uk/ # v5
Link: https://lore.kernel.org/r/161789079281.6155.17141344853277186500.stgit@warthog.procyon.org.uk/ # v6
2021-04-23 10:14:32 +01:00
David Howells 3d3c950467 netfs: Provide readahead and readpage netfs helpers
Add a pair of helper functions:

 (*) netfs_readahead()
 (*) netfs_readpage()

to do the work of handling a readahead or a readpage, where the page(s)
that form part of the request may be split between the local cache, the
server or just require clearing, and may be single pages and transparent
huge pages.  This is all handled within the helper.

Note that while both will read from the cache if there is data present,
only netfs_readahead() will expand the request beyond what it was asked to
do, and only netfs_readahead() will write back to the cache.

netfs_readpage(), on the other hand, is synchronous and only fetches the
page (which might be a THP) it is asked for.

The netfs gives the helper parameters from the VM, the cache cookie it
wants to use (or NULL) and a table of operations (only one of which is
mandatory):

 (*) expand_readahead() [optional]

     Called to allow the netfs to request an expansion of a readahead
     request to meet its own alignment requirements.  This is done by
     changing rreq->start and rreq->len.

 (*) clamp_length() [optional]

     Called to allow the netfs to cut down a subrequest to meet its own
     boundary requirements.  If it does this, the helper will generate
     additional subrequests until the full request is satisfied.

 (*) is_still_valid() [optional]

     Called to find out if the data just read from the cache has been
     invalidated and must be reread from the server.

 (*) issue_op() [required]

     Called to ask the netfs to issue a read to the server.  The subrequest
     describes the read.  The read request holds information about the file
     being accessed.

     The netfs can cache information in rreq->netfs_priv.

     Upon completion, the netfs should set the error, transferred and can
     also set FSCACHE_SREQ_CLEAR_TAIL and then call
     fscache_subreq_terminated().

 (*) done() [optional]

     Called after the pages have been unlocked.  The read request is still
     pinning the file and mapping and may still be pinning pages with
     PG_fscache.  rreq->error indicates any error that has been
     accumulated.

 (*) cleanup() [optional]

     Called when the helper is disposing of a finished read request.  This
     allows the netfs to clear rreq->netfs_priv.

Netfs support is enabled with CONFIG_NETFS_SUPPORT=y.  It will be built
even if CONFIG_FSCACHE=n and in this case much of it should be optimised
away, allowing the filesystem to use it even when caching is disabled.

Changes:
v5:
 - Comment why netfs_readahead() is putting pages[2].
 - Use page_file_mapping() rather than page->mapping[2].
 - Use page_index() rather than page->index[2].
 - Use set_page_fscache()[3] rather then SetPageFsCache() as this takes an
   appropriate ref too[4].

v4:
 - Folded in a kerneldoc comment fix.
 - Folded in a fix for the error handling in the case that ENOMEM occurs.
 - Added flag to netfs_subreq_terminated() to indicate that the caller may
   have been running async and stuff that might sleep needs punting to a
   workqueue (can't use in_softirq()[1]).

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-and-tested-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Dave Wysochanski <dwysocha@redhat.com>
Tested-By: Marc Dionne <marc.dionne@auristor.com>
cc: Matthew Wilcox <willy@infradead.org>
cc: linux-mm@kvack.org
cc: linux-cachefs@redhat.com
cc: linux-afs@lists.infradead.org
cc: linux-nfs@vger.kernel.org
cc: linux-cifs@vger.kernel.org
cc: ceph-devel@vger.kernel.org
cc: v9fs-developer@lists.sourceforge.net
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20210216084230.GA23669@lst.de/ [1]
Link: https://lore.kernel.org/r/20210321014202.GF3420@casper.infradead.org/ [2]
Link: https://lore.kernel.org/r/2499407.1616505440@warthog.procyon.org.uk/ [3]
Link: https://lore.kernel.org/r/CAHk-=wh+2gbF7XEjYc=HV9w_2uVzVf7vs60BPz0gFA=+pUm3ww@mail.gmail.com/ [4]
Link: https://lore.kernel.org/r/160588497406.3465195.18003475695899726222.stgit@warthog.procyon.org.uk/ # rfc
Link: https://lore.kernel.org/r/161118136849.1232039.8923686136144228724.stgit@warthog.procyon.org.uk/ # rfc
Link: https://lore.kernel.org/r/161161032290.2537118.13400578415247339173.stgit@warthog.procyon.org.uk/ # v2
Link: https://lore.kernel.org/r/161340394873.1303470.6237319335883242536.stgit@warthog.procyon.org.uk/ # v3
Link: https://lore.kernel.org/r/161539537375.286939.16642940088716990995.stgit@warthog.procyon.org.uk/ # v4
Link: https://lore.kernel.org/r/161653795430.2770958.4947584573720000554.stgit@warthog.procyon.org.uk/ # v5
Link: https://lore.kernel.org/r/161789076581.6155.6745849361504760209.stgit@warthog.procyon.org.uk/ # v6
2021-04-23 10:14:32 +01:00