linux/fs/9p
David Howells 100ccd18bb netfs: Optimise away reads above the point at which there can be no data
Track the file position above which the server is not expected to have any
data (the "zero point") and preemptively assume that we can satisfy
requests by filling them with zeroes locally rather than attempting to
download them if they're over that line - even if we've written data back
to the server.  Assume that any data that was written back above that
position is held in the local cache.  Note that we have to split requests
that straddle the line.

Make use of this to optimise away some reads from the server.  We need to
set the zero point in the following circumstances:

 (1) When we see an extant remote inode and have no cache for it, we set
     the zero_point to i_size.

 (2) On local inode creation, we set zero_point to 0.

 (3) On local truncation down, we reduce zero_point to the new i_size if
     the new i_size is lower.

 (4) On local truncation up, we don't change zero_point.

 (5) On local modification, we don't change zero_point.

 (6) On remote invalidation, we set zero_point to the new i_size.

 (7) If stored data is discarded from the pagecache or culled from fscache,
     we must set zero_point above that if the data also got written to the
     server.

 (8) If dirty data is written back to the server, but not fscache, we must
     set zero_point above that.

 (9) If a direct I/O write is made, set zero_point above that.

Assuming the above, any read from the server at or above the zero_point
position will return all zeroes.

The zero_point value can be stored in the cache, provided the above rules
are applied to it by any code that culls part of the local cache.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: linux-cachefs@redhat.com
cc: linux-fsdevel@vger.kernel.org
cc: linux-mm@kvack.org
2023-12-28 09:45:27 +00:00
..
acl.c fs: port inode_owner_or_capable() to mnt_idmap 2023-01-19 09:24:29 +01:00
acl.h fs: port ->set_acl() to pass mnt_idmap 2023-01-19 09:24:27 +01:00
cache.c mm, netfs, fscache: stop read optimisation when folio removed from pagecache 2023-08-18 10:12:13 -07:00
cache.h fs/9p: Rework cache modes and add new options to Documentation 2023-04-09 21:41:21 +00:00
fid.c fs/9p: remove writeback fid and fix per-file modes 2023-03-27 02:33:48 +00:00
fid.h fs/9p: fix type mismatch in file cache mode helper 2023-07-20 16:15:15 +00:00
Kconfig 9p: Remove INET dependency 2023-05-04 21:46:57 +01:00
Makefile
v9fs_vfs.h fs/9p: Remove unused function declaration v9fs_inode2stat() 2023-10-24 13:52:56 +09:00
v9fs.c 9p/fs: add MODULE_DESCIPTION 2023-10-27 12:44:13 +09:00
v9fs.h fs/9p: Fix a datatype used with V9FS_DIRECT_IO 2023-07-10 13:04:37 +00:00
vfs_addr.c netfs: Provide invalidate_folio and release_folio calls 2023-12-24 15:08:51 +00:00
vfs_dentry.c 9p: Remove INET dependency 2023-05-04 21:46:57 +01:00
vfs_dir.c 9p: fix ignored return value in v9fs_dir_release 2023-07-20 19:05:52 +00:00
vfs_file.c fs/9p: remove unnecessary invalidate_inode_pages2 2023-07-20 16:15:15 +00:00
vfs_inode_dotl.c 9p: convert to new timestamp accessors 2023-10-18 13:26:17 +02:00
vfs_inode.c netfs: Optimise away reads above the point at which there can be no data 2023-12-28 09:45:27 +00:00
vfs_super.c netfs: Move pinning-for-writeback from fscache to netfs 2023-12-24 15:08:49 +00:00
xattr.c Bunch of small fixes: 2023-11-04 09:20:04 -10:00
xattr.h 9p: move xattr-related structs to .rodata 2023-10-09 16:24:16 +02:00