[XFS] coordinate mmap calls with xfs_dm_punch_hole
authorDean Roehrich <roehrich@sgi.com>
Tue, 21 Jun 2005 04:07:45 +0000 (14:07 +1000)
committerNathan Scott <nathans@sgi.com>
Tue, 21 Jun 2005 04:07:45 +0000 (14:07 +1000)
SGI-PV: 933551
SGI-Modid: xfs-linux:xfs-kern:190622a

Signed-off-by: Dean Roehrich <roehrich@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
fs/xfs/linux-2.6/xfs_file.c
fs/xfs/xfs_dmapi.h

index 24fa3b101b93c89ea70cb068f3f256be1fd5e3e5..f1ce4323f56e905c499e3889734d878d82c7b566 100644 (file)
@@ -57,7 +57,9 @@
 #include <linux/smp_lock.h>
 
 static struct vm_operations_struct linvfs_file_vm_ops;
-
+#ifdef CONFIG_XFS_DMAPI
+static struct vm_operations_struct linvfs_dmapi_file_vm_ops;
+#endif
 
 STATIC inline ssize_t
 __linvfs_read(
@@ -388,6 +390,14 @@ done:
        return -error;
 }
 
+#ifdef CONFIG_XFS_DMAPI
+STATIC void
+linvfs_mmap_close(
+       struct vm_area_struct   *vma)
+{
+       xfs_dm_mm_put(vma);
+}
+#endif /* CONFIG_XFS_DMAPI */
 
 STATIC int
 linvfs_file_mmap(
@@ -399,16 +409,19 @@ linvfs_file_mmap(
        vattr_t         va = { .va_mask = XFS_AT_UPDATIME };
        int             error;
 
+       vma->vm_ops = &linvfs_file_vm_ops;
+
        if (vp->v_vfsp->vfs_flag & VFS_DMI) {
                xfs_mount_t     *mp = XFS_VFSTOM(vp->v_vfsp);
 
                error = -XFS_SEND_MMAP(mp, vma, 0);
                if (error)
                        return error;
+#ifdef CONFIG_XFS_DMAPI
+               vma->vm_ops = &linvfs_dmapi_file_vm_ops;
+#endif
        }
 
-       vma->vm_ops = &linvfs_file_vm_ops;
-
        VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error);
        if (!error)
                vn_revalidate(vp);      /* update Linux inode flags */
@@ -609,7 +622,15 @@ struct file_operations linvfs_dir_operations = {
 static struct vm_operations_struct linvfs_file_vm_ops = {
        .nopage         = filemap_nopage,
        .populate       = filemap_populate,
+};
+
+#ifdef CONFIG_XFS_DMAPI
+static struct vm_operations_struct linvfs_dmapi_file_vm_ops = {
+       .close          = linvfs_mmap_close,
+       .nopage         = filemap_nopage,
+       .populate       = filemap_populate,
 #ifdef HAVE_VMOP_MPROTECT
        .mprotect       = linvfs_mprotect,
 #endif
 };
+#endif /* CONFIG_XFS_DMAPI */
index 55ae3e67d2450b3dd4188f968e56ec24046bd928..16cf9f7a478594612c881c562c38958ea0ddebea 100644 (file)
@@ -209,4 +209,8 @@ void xfs_dm_exit(struct file_system_type *);
 #define XFS_DM_EXIT(fstype)
 #endif
 
+#define HAVE_XFS_DM_MM
+int xfs_dm_mm_get(struct vm_area_struct *vma);
+void xfs_dm_mm_put(struct vm_area_struct *vma);
+
 #endif  /* __XFS_DMAPI_H__ */