Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fac0cb4 authored by Dean Roehrich's avatar Dean Roehrich Committed by Nathan Scott
Browse files

[XFS] coordinate mmap calls with xfs_dm_punch_hole



SGI-PV: 933551
SGI-Modid: xfs-linux:xfs-kern:190622a

Signed-off-by: default avatarDean Roehrich <roehrich@sgi.com>
Signed-off-by: default avatarNathan Scott <nathans@sgi.com>
parent b74e2159
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -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 */
+4 −0
Original line number Diff line number Diff line
@@ -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__ */