On Tue, Jun 23, 2026 at 4:15 AM Pavel Tikhomirov <[email protected]> wrote: > > Overlayfs forwards data I/O to the real (upper/lower) file, so the page > cache lives in the real inode's mapping and cachestat() on an overlay > fd returned all zeroes. > > Implement the ->cachestat() file operation by forwarding to the real > file via vfs_cachestat(), the same way ovl_fadvise() forwards > for fadvise. > > Signed-off-by: Pavel Tikhomirov <[email protected]> > --- > fs/overlayfs/file.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c > index 27cc07738f33b..a7e252a91ea43 100644 > --- a/fs/overlayfs/file.c > +++ b/fs/overlayfs/file.c > @@ -518,6 +518,21 @@ static int ovl_fadvise(struct file *file, loff_t offset, > loff_t len, int advice) > return vfs_fadvise(realfile, offset, len, advice); > } > > +#ifdef CONFIG_CACHESTAT_SYSCALL > +static int ovl_cachestat(struct file *file, struct cachestat_range *csr, > + struct cachestat *cs) > +{ > + struct file *realfile; > + > + realfile = ovl_real_file(file); > + if (IS_ERR(realfile)) > + return PTR_ERR(realfile);
We're propagating the error of ovl_real_file() all the way to userspace right? I think we need to handle this. For example, we might get -EIO here, which is unexpected and undocumented from cachestat's POV. Maybe handle it and just return -EBADF or sth like that (with some updated documentations, etc.) The rest LGTM, but I'll let overlayfs maintainers check the overlayfs-specific bits :) > + > + with_ovl_creds(file_inode(file)->i_sb) > + return vfs_cachestat(realfile, csr, cs); > +}

