diff mbox series

[v8,17/19] xfs: add pre-content fsnotify hook for write faults

Message ID 9eccdf59a65b72f0a1a5e2f2b9bff8eda2d4f2d9.1731684329.git.josef@toxicpanda.com (mailing list archive)
State New
Headers show
Series fanotify: add pre-content hooks | expand

Commit Message

Josef Bacik Nov. 15, 2024, 3:30 p.m. UTC
xfs has it's own handling for write faults, so we need to add the
pre-content fsnotify hook for this case.  Reads go through filemap_fault
so they're handled properly there.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 fs/xfs/xfs_file.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Jan Kara Nov. 21, 2024, 10:22 a.m. UTC | #1
On Fri 15-11-24 10:30:30, Josef Bacik wrote:
> xfs has it's own handling for write faults, so we need to add the
> pre-content fsnotify hook for this case.  Reads go through filemap_fault
> so they're handled properly there.
> 
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>

This was missing proper handling for DAX read faults. What I've ended up
with is:

        struct xfs_inode        *ip = XFS_I(file_inode(vmf->vma->vm_file));
        vm_fault_t              ret;
 
+       ret = filemap_fsnotify_fault(vmf);
+       if (unlikely(ret))
+               return ret;
        xfs_ilock(ip, XFS_MMAPLOCK_SHARED);
        ret = xfs_dax_fault_locked(vmf, order, false);
        xfs_iunlock(ip, XFS_MMAPLOCK_SHARED);
@@ -1412,6 +1415,17 @@ xfs_write_fault(
        unsigned int            lock_mode = XFS_MMAPLOCK_SHARED;
        vm_fault_t              ret;
 
+       /*
+        * Usually we get here from ->page_mkwrite callback but in case of DAX
+        * we will get here also for ordinary write fault. Handle HSM
+        * notifications for that case.
+        */
+       if (IS_DAX(inode)) {
+               ret = filemap_fsnotify_fault(vmf);
+               if (unlikely(ret))
+                       return ret;
+       }
+
        sb_start_pagefault(inode->i_sb);
        file_update_time(vmf->vma->vm_file);

								Honza
diff mbox series

Patch

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index ca47cae5a40a..4fe89770ecb5 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1458,6 +1458,10 @@  xfs_write_fault(
 	unsigned int		lock_mode = XFS_MMAPLOCK_SHARED;
 	vm_fault_t		ret;
 
+	ret = filemap_fsnotify_fault(vmf);
+	if (unlikely(ret))
+		return ret;
+
 	sb_start_pagefault(inode->i_sb);
 	file_update_time(vmf->vma->vm_file);