Re: [PATCH V12 06/12] famfs: Introduce mmap and VM fault handling

John Groves <[email protected]>
Newsgroups org.kernel.vger.linux-cxl,dev.linux.lists.fuse-devel,dev.linux.lists.nvdimm,org.kernel.vger.linux-doc,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 26/08/05 10:16PM, Darrick J. Wong wrote:
> On Mon, Aug 03, 2026 at 02:29:16AM +0000, John Groves wrote:
> > From: John Groves <[email protected]>
> > 
> > This commit adds vm_operations, plus famfs_mmap() and fault handlers.
> > It is still missing iomap_ops, iomap mapping resolution, and
> > famfs_ioctl() for setting up file-to-memory mappings.
> > 
> > Signed-off-by: John Groves <[email protected]>
> > ---
> >  fs/famfs/famfs_file.c | 101 +++++++++++++++++++++++++++++++++++++++++-
> >  1 file changed, 100 insertions(+), 1 deletion(-)
> > 
> > diff --git a/fs/famfs/famfs_file.c b/fs/famfs/famfs_file.c
> > index e192b573c51f..678f2035fd5f 100644
> > --- a/fs/famfs/famfs_file.c
> > +++ b/fs/famfs/famfs_file.c
> > @@ -16,6 +16,75 @@
> >  
> >  #include "famfs_internal.h"
> >  
> > +/*********************************************************************
> > + * vm_operations
> > + */
> > +static vm_fault_t
> > +__famfs_filemap_fault(struct vm_fault *vmf, unsigned int order,
> > +		      bool write_fault)
> > +{
> > +	struct inode *inode = file_inode(vmf->vma->vm_file);
> > +	struct super_block *sb = inode->i_sb;
> > +	struct famfs_fs_info *fsi = sb->s_fs_info;
> > +	vm_fault_t ret;
> > +	unsigned long pfn;
> > +
> > +	if (fsi->deverror)
> > +		return VM_FAULT_SIGBUS;
> > +
> > +	if (!IS_DAX(file_inode(vmf->vma->vm_file))) {
> > +		pr_err("%s: file not marked IS_DAX!!\n", __func__);
> > +		return VM_FAULT_SIGBUS;
> > +	}
> > +
> > +	if (write_fault) {
> > +		sb_start_pagefault(inode->i_sb);
> > +		file_update_time(vmf->vma->vm_file);
> > +	}
> > +
> > +	ret = dax_iomap_fault(vmf, order, &pfn, NULL, NULL /*&famfs_iomap_ops */);
> > +	if (ret & VM_FAULT_NEEDDSYNC)
> > +		ret = dax_finish_sync_fault(vmf, order, pfn);
> > +
> > +	if (write_fault)
> > +		sb_end_pagefault(inode->i_sb);
> > +
> > +	return ret;
> > +}
> > +
> > +static inline bool
> > +famfs_is_write_fault(struct vm_fault *vmf)
> > +{
> > +	return (vmf->flags & FAULT_FLAG_WRITE) &&
> > +	       (vmf->vma->vm_flags & VM_SHARED);
> > +}
> > +
> > +static vm_fault_t
> > +famfs_filemap_fault(struct vm_fault *vmf)
> > +{
> > +	return __famfs_filemap_fault(vmf, 0, famfs_is_write_fault(vmf));
> > +}
> > +
> > +static vm_fault_t
> > +famfs_filemap_huge_fault(struct vm_fault *vmf, unsigned int order)
> > +{
> > +	return __famfs_filemap_fault(vmf, order, famfs_is_write_fault(vmf));
> > +}
> > +
> > +static vm_fault_t
> > +famfs_filemap_mkwrite(struct vm_fault *vmf)
> > +{
> > +	return __famfs_filemap_fault(vmf, 0, true);
> 
> Do neither of the conditions in famfs_is_write_fault apply here?

I'm confident this is correct. This is directly copied from xfs on the 
dax path:

	if (IS_DAX(inode))
		ret = xfs_dax_fault_locked(vmf, order, true);

Famfs never has to do COW or allocate a page or any of that sort of
sfuff; It ends up just looking at the fmap to resolve to a page,
which always exists unless out or range or bugs.

> 
> The rest of the patch looks ok to me.
> 
> --D

Thank you!

John

<snip>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.