On Tue, Jun 23, 2026 at 01:14:48PM +0200, Pavel Tikhomirov wrote: > The cachestat() syscall reads page cache statistics straight from the > file's f_mapping. Stackable filesystems such as overlayfs keep the data > pages in an underlying inode's mapping rather than in the overlay > inode's, so cachestat() reports all zeroes for them. > > Add a ->cachestat() file operation and route the syscall through a new > vfs_cachestat() helper that calls it when present, falling back to > file's f_mapping otherwise. This lets stackable filesystems forward the > query to the file that actually owns the page cache. No behaviour change > for regular files. > > Signed-off-by: Pavel Tikhomirov <[email protected]> > --- > Note: Memset change might be a bit tricky, I moved it to no > ->cachestat() path to avoid multiple memset on nested overlayfs, that > means that ->cachestat() is expected to be able to handle unitialized > cs. > --- > include/linux/fs.h | 10 ++++++++++ > mm/filemap.c | 43 +++++++++++++++++++++++++++++++++++-------- > 2 files changed, 45 insertions(+), 8 deletions(-) > > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 6da44573ce450..966b6564707e4 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -53,6 +53,8 @@ > > struct bdi_writeback; > struct bio; > +struct cachestat_range; > +struct cachestat; > struct io_comp_batch; > struct fiemap_extent_info; > struct kiocb; > @@ -1963,6 +1965,8 @@ struct file_operations { > struct file *file_out, loff_t pos_out, > loff_t len, unsigned int remap_flags); > int (*fadvise)(struct file *, loff_t, loff_t, int); > + int (*cachestat)(struct file *file, struct cachestat_range *csr, > + struct cachestat *cs);
I suppose you can't just have it return the real file because of the with_ovl_creds() scope you need during access? That would make things a bit easier. But short of that, this looks good to me. Acked-by: Johannes Weiner <[email protected]>

