From: David Howells <dhowells@redhat.com>
To: Matthew Wilcox <willy@infradead.org>,
Christoph Hellwig <hch@infradead.org>,
Jens Axboe <axboe@kernel.dk>, Leon Romanovsky <leon@kernel.org>
Cc: David Howells <dhowells@redhat.com>,
Christian Brauner <christian@brauner.io>,
Paulo Alcantara <pc@manguebit.com>,
netfs@lists.linux.dev, linux-afs@lists.infradead.org,
linux-cifs@vger.kernel.org, linux-nfs@vger.kernel.org,
ceph-devel@vger.kernel.org, v9fs@lists.linux.dev,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
Paulo Alcantara <pc@manguebit.org>,
Steve French <sfrench@samba.org>,
Namjae Jeon <linkinjeon@kernel.org>, Tom Talpey <tom@talpey.com>,
Chuck Lever <chuck.lever@oracle.com>
Subject: [RFC PATCH 02/17] vfs: Implement a FIEMAP callback
Date: Wed, 4 Mar 2026 14:03:09 +0000 [thread overview]
Message-ID: <20260304140328.112636-3-dhowells@redhat.com> (raw)
In-Reply-To: <20260304140328.112636-1-dhowells@redhat.com>
Implement a callback in the internal kernel FIEMAP API so that kernel users
can make use of it as the filler function expects to write to userspace.
This allows the FIEMAP data to be captured and parsed. This is useful for
cachefiles and also potentially for knfsd and ksmbd to implement their
equivalents of FIEMAP remotely rather than using SEEK_DATA/SEEK_HOLE.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Paulo Alcantara <pc@manguebit.org>
cc: Matthew Wilcox <willy@infradead.org>
cc: Christoph Hellwig <hch@infradead.org>
cc: Steve French <sfrench@samba.org>
cc: Namjae Jeon <linkinjeon@kernel.org>
cc: Tom Talpey <tom@talpey.com>
cc: Chuck Lever <chuck.lever@oracle.com>
cc: linux-cifs@vger.kernel.org
cc: linux-nfs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
---
fs/ioctl.c | 29 ++++++++++++++++++++---------
include/linux/fiemap.h | 3 +++
2 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/fs/ioctl.c b/fs/ioctl.c
index 1c152c2b1b67..f0513e282eb7 100644
--- a/fs/ioctl.c
+++ b/fs/ioctl.c
@@ -93,6 +93,21 @@ static int ioctl_fibmap(struct file *filp, int __user *p)
return error;
}
+static int fiemap_fill(struct fiemap_extent_info *fieinfo,
+ const struct fiemap_extent *extent)
+{
+ struct fiemap_extent __user *dest = fieinfo->fi_extents_start;
+
+ dest += fieinfo->fi_extents_mapped;
+ if (copy_to_user(dest, extent, sizeof(*extent)))
+ return -EFAULT;
+
+ fieinfo->fi_extents_mapped++;
+ if (fieinfo->fi_extents_mapped >= fieinfo->fi_extents_max)
+ return 1;
+ return 0;
+}
+
/**
* fiemap_fill_next_extent - Fiemap helper function
* @fieinfo: Fiemap context passed into ->fiemap
@@ -112,7 +127,7 @@ int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical,
u64 phys, u64 len, u32 flags)
{
struct fiemap_extent extent;
- struct fiemap_extent __user *dest = fieinfo->fi_extents_start;
+ int ret;
/* only count the extents */
if (fieinfo->fi_extents_max == 0) {
@@ -140,13 +155,9 @@ int fiemap_fill_next_extent(struct fiemap_extent_info *fieinfo, u64 logical,
extent.fe_length = len;
extent.fe_flags = flags;
- dest += fieinfo->fi_extents_mapped;
- if (copy_to_user(dest, &extent, sizeof(extent)))
- return -EFAULT;
-
- fieinfo->fi_extents_mapped++;
- if (fieinfo->fi_extents_mapped == fieinfo->fi_extents_max)
- return 1;
+ ret = fieinfo->fi_fill(fieinfo, &extent);
+ if (ret != 0)
+ return ret; /* 1 to stop. */
return (flags & FIEMAP_EXTENT_LAST) ? 1 : 0;
}
EXPORT_SYMBOL(fiemap_fill_next_extent);
@@ -199,7 +210,7 @@ EXPORT_SYMBOL(fiemap_prep);
static int ioctl_fiemap(struct file *filp, struct fiemap __user *ufiemap)
{
struct fiemap fiemap;
- struct fiemap_extent_info fieinfo = { 0, };
+ struct fiemap_extent_info fieinfo = { .fi_fill = fiemap_fill, };
struct inode *inode = file_inode(filp);
int error;
diff --git a/include/linux/fiemap.h b/include/linux/fiemap.h
index 966092ffa89a..01929ca4b834 100644
--- a/include/linux/fiemap.h
+++ b/include/linux/fiemap.h
@@ -11,12 +11,15 @@
* @fi_extents_mapped: Number of mapped extents
* @fi_extents_max: Size of fiemap_extent array
* @fi_extents_start: Start of fiemap_extent array
+ * @fi_fill: Function to fill the extents array
*/
struct fiemap_extent_info {
unsigned int fi_flags;
unsigned int fi_extents_mapped;
unsigned int fi_extents_max;
struct fiemap_extent __user *fi_extents_start;
+ int (*fi_fill)(struct fiemap_extent_info *fiefinfo,
+ const struct fiemap_extent *extent);
};
int fiemap_prep(struct inode *inode, struct fiemap_extent_info *fieinfo,
next prev parent reply other threads:[~2026-03-04 14:04 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-04 14:03 [RFC PATCH 00/17] netfs: [WIP] Keep track of folios in a segmented bio_vec[] chain David Howells
2026-03-04 14:03 ` [RFC PATCH 01/17] netfs: Fix unbuffered/DIO writes to dispatch subrequests in strict sequence David Howells
2026-03-04 14:03 ` David Howells [this message]
2026-03-04 14:06 ` [RFC PATCH 02/17] vfs: Implement a FIEMAP callback Christoph Hellwig
2026-03-04 14:21 ` David Howells
2026-03-04 14:25 ` Christoph Hellwig
2026-03-04 14:34 ` David Howells
2026-03-04 14:03 ` [RFC PATCH 03/17] iov_iter: Add a segmented queue of bio_vec[] David Howells
2026-03-04 14:03 ` [RFC PATCH 04/17] Add a function to kmap one page of a multipage bio_vec David Howells
2026-03-04 14:03 ` [RFC PATCH 05/17] netfs: Add some tools for managing bvecq chains David Howells
2026-03-04 14:03 ` [RFC PATCH 06/17] afs: Use a bvecq to hold dir content rather than folioq David Howells
2026-03-04 14:03 ` [RFC PATCH 07/17] netfs: Add a function to extract from an iter into a bvecq David Howells
2026-03-04 14:03 ` [RFC PATCH 08/17] cifs: Use a bvecq for buffering instead of a folioq David Howells
2026-03-04 14:03 ` [RFC PATCH 09/17] cifs: Support ITER_BVECQ in smb_extract_iter_to_rdma() David Howells
2026-03-04 14:03 ` [RFC PATCH 10/17] netfs: Switch to using bvecq rather than folio_queue and rolling_buffer David Howells
2026-03-04 14:03 ` [RFC PATCH 11/17] cifs: Remove support for ITER_KVEC/BVEC/FOLIOQ from smb_extract_iter_to_rdma() David Howells
2026-03-04 14:03 ` [RFC PATCH 12/17] netfs: Remove netfs_alloc/free_folioq_buffer() David Howells
2026-03-04 14:03 ` [RFC PATCH 13/17] netfs: Remove netfs_extract_user_iter() David Howells
2026-03-04 14:03 ` [RFC PATCH 14/17] iov_iter: Remove ITER_FOLIOQ David Howells
2026-03-04 14:03 ` [RFC PATCH 15/17] netfs: Remove folio_queue and rolling_buffer David Howells
2026-03-04 14:03 ` [RFC PATCH 16/17] netfs: Check for too much data being read David Howells
2026-03-04 14:03 ` [RFC PATCH 17/17] netfs: Combine prepare and issue ops and grab the buffers on request David Howells
2026-03-04 14:39 ` Christoph Hellwig
2026-03-04 14:51 ` David Howells
2026-03-04 15:01 ` Christoph Hellwig
2026-03-23 18:37 ` ChenXiaoSong
2026-03-23 20:14 ` David Howells
2026-03-23 22:44 ` Paulo Alcantara
2026-03-24 1:03 ` ChenXiaoSong
2026-03-24 7:16 ` David Howells
2026-03-24 7:38 ` ChenXiaoSong
2026-03-24 7:53 ` David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260304140328.112636-3-dhowells@redhat.com \
--to=dhowells@redhat.com \
--cc=axboe@kernel.dk \
--cc=ceph-devel@vger.kernel.org \
--cc=christian@brauner.io \
--cc=chuck.lever@oracle.com \
--cc=hch@infradead.org \
--cc=leon@kernel.org \
--cc=linkinjeon@kernel.org \
--cc=linux-afs@lists.infradead.org \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=netfs@lists.linux.dev \
--cc=pc@manguebit.com \
--cc=pc@manguebit.org \
--cc=sfrench@samba.org \
--cc=tom@talpey.com \
--cc=v9fs@lists.linux.dev \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox