xfs: enable discarding of folios backing an xfile
authorDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:54:42 +0000 (14:54 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:58:53 +0000 (14:58 -0700)
Create a new xfile function to discard the page cache that's backing
part of an xfile.  The next patch wil use this to drop parts of an xfile
that aren't needed anymore.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/trace.h
fs/xfs/scrub/xfile.c
fs/xfs/scrub/xfile.h

index 8d05f2adae3dd915cd554af30a57451565490cbe..7d07912d8f758983cfa5851dca37ea5f614806e4 100644 (file)
@@ -948,6 +948,7 @@ DEFINE_XFILE_EVENT(xfile_store);
 DEFINE_XFILE_EVENT(xfile_seek_data);
 DEFINE_XFILE_EVENT(xfile_get_folio);
 DEFINE_XFILE_EVENT(xfile_put_folio);
+DEFINE_XFILE_EVENT(xfile_discard);
 
 TRACE_EVENT(xfarray_create,
        TP_PROTO(struct xfarray *xfa, unsigned long long required_capacity),
index 8cdd863db5850a616b65a1463edb444b108acb4c..4e254a0ba0036c10a7d4ce6bebddbb129d47e39a 100644 (file)
@@ -310,3 +310,15 @@ xfile_put_folio(
        folio_unlock(folio);
        folio_put(folio);
 }
+
+/* Discard the page cache that's backing a range of the xfile. */
+void
+xfile_discard(
+       struct xfile            *xf,
+       loff_t                  pos,
+       u64                     count)
+{
+       trace_xfile_discard(xf, pos, count);
+
+       shmem_truncate_range(file_inode(xf->file), pos, pos + count - 1);
+}
index 76d78dba7e3478a06ac794c27088b588509db44e..8dfbae1fe33a503579dd9010c83af5fb8f3eacf6 100644 (file)
@@ -17,6 +17,7 @@ int xfile_load(struct xfile *xf, void *buf, size_t count, loff_t pos);
 int xfile_store(struct xfile *xf, const void *buf, size_t count,
                loff_t pos);
 
+void xfile_discard(struct xfile *xf, loff_t pos, u64 count);
 loff_t xfile_seek_data(struct xfile *xf, loff_t pos);
 
 #define XFILE_MAX_FOLIO_SIZE   (PAGE_SIZE << MAX_PAGECACHE_ORDER)