[RFC PATCH 0/8] fscache: Replace and remove old I/O API

From: David Howells
Date: Tue Sep 14 2021 - 09:55:01 EST



Here's a set of patches that removes the old fscache I/O API by the following
means:

(1) A simple fallback API is added that can read or write a single page
synchronously. The functions for this have "deprecated" in their names
as they have to be removed at some point.

(2) An implementation of this is provided in cachefiles. It creates a kiocb
to use DIO to the backing file rather than calling readpage on the
backing filesystem page and then snooping the page wait queue.

(3) NFS is switched to use the fallback API.

(4) CIFS is switched to use the fallback API also for the moment.

(5) 9P is switched to using netfslib.

(6) The old I/O API is removed from fscache and the page snooping
implementation is removed from cachefiles.

The reasons for doing this are:

(A) Using a kiocb to do asynchronous DIO from/to the pages of the backing
file is now a possibility that didn't exist when cachefiles was created.
This is much simpler than the snooping mechanism with a proper callback
path and it also requires fewer copies and less memory.

(B) We have to stop using bmap() or SEEK_DATA/SEEK_HOLE to work out what
blocks are present in the backing file is dangerous and can lead to data
corruption if the backing filesystem can insert or remove blocks of zeros
arbitrarily in order to optimise its extent list[1].

Whilst this patchset doesn't fix that yet, it does simplify the code and
the fix for that can be made in a subsequent patchset.

(C) In order to fix (B), the cache will need to keep track itself of what
data is present. To make this easier to manage, the intention is to
increase the cache block granularity to, say, 256KiB - importantly, a
size that will span multiple pages - which means the single-page
interface will have to go away. netfslib is designed to deal with
that on behalf of a filesystem, though a filesystem could use raw
cache calls instead and manage things itself.

These patches can be found also on:

https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/log/?h=fscache-iter-3

David

Link: https://lore.kernel.org/r/YO17ZNOcq+9PajfQ@xxxxxxx [1]
---
David Howells (8):
fscache: Generalise the ->begin_read_operation method
fscache: Implement an alternate I/O interface to replace the old API
nfs: Move to using the alternate (deprecated) fscache I/O API
9p: (untested) Convert to using the netfs helper lib to do reads and caching
cifs: (untested) Move to using the alternate (deprecated) fscache I/O API
fscache: Remove the old I/O API
fscache: Remove stats that are no longer used
fscache: Update the documentation to reflect I/O API changes


.../filesystems/caching/backend-api.rst | 138 +--
.../filesystems/caching/netfs-api.rst | 386 +-----
fs/9p/Kconfig | 1 +
fs/9p/cache.c | 137 ---
fs/9p/cache.h | 98 +-
fs/9p/v9fs.h | 9 +
fs/9p/vfs_addr.c | 174 ++-
fs/9p/vfs_file.c | 21 +-
fs/cachefiles/Makefile | 1 -
fs/cachefiles/interface.c | 15 -
fs/cachefiles/internal.h | 38 -
fs/cachefiles/io.c | 28 +-
fs/cachefiles/main.c | 1 -
fs/cachefiles/rdwr.c | 972 ---------------
fs/cifs/file.c | 64 +-
fs/cifs/fscache.c | 105 +-
fs/cifs/fscache.h | 74 +-
fs/fscache/cache.c | 6 -
fs/fscache/cookie.c | 10 -
fs/fscache/internal.h | 58 +-
fs/fscache/io.c | 140 ++-
fs/fscache/object.c | 2 -
fs/fscache/page.c | 1066 -----------------
fs/fscache/stats.c | 73 +-
fs/nfs/file.c | 14 +-
fs/nfs/fscache-index.c | 26 -
fs/nfs/fscache.c | 161 +--
fs/nfs/fscache.h | 84 +-
fs/nfs/read.c | 25 +-
fs/nfs/write.c | 7 +-
include/linux/fscache-cache.h | 131 --
include/linux/fscache.h | 418 ++-----
include/linux/netfs.h | 17 +-
33 files changed, 508 insertions(+), 3992 deletions(-)
delete mode 100644 fs/cachefiles/rdwr.c