提交 6fac0cb4 编写于 作者: D Dean Roehrich 提交者: Nathan Scott

[XFS] coordinate mmap calls with xfs_dm_punch_hole

SGI-PV: 933551
SGI-Modid: xfs-linux:xfs-kern:190622a
Signed-off-by: NDean Roehrich <roehrich@sgi.com>
Signed-off-by: NNathan Scott <nathans@sgi.com>
上级 b74e2159
...@@ -57,7 +57,9 @@ ...@@ -57,7 +57,9 @@
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
static struct vm_operations_struct linvfs_file_vm_ops; 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 STATIC inline ssize_t
__linvfs_read( __linvfs_read(
...@@ -388,6 +390,14 @@ linvfs_readdir( ...@@ -388,6 +390,14 @@ linvfs_readdir(
return -error; 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 STATIC int
linvfs_file_mmap( linvfs_file_mmap(
...@@ -399,16 +409,19 @@ linvfs_file_mmap( ...@@ -399,16 +409,19 @@ linvfs_file_mmap(
vattr_t va = { .va_mask = XFS_AT_UPDATIME }; vattr_t va = { .va_mask = XFS_AT_UPDATIME };
int error; int error;
vma->vm_ops = &linvfs_file_vm_ops;
if (vp->v_vfsp->vfs_flag & VFS_DMI) { if (vp->v_vfsp->vfs_flag & VFS_DMI) {
xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp); xfs_mount_t *mp = XFS_VFSTOM(vp->v_vfsp);
error = -XFS_SEND_MMAP(mp, vma, 0); error = -XFS_SEND_MMAP(mp, vma, 0);
if (error) if (error)
return 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); VOP_SETATTR(vp, &va, XFS_AT_UPDATIME, NULL, error);
if (!error) if (!error)
vn_revalidate(vp); /* update Linux inode flags */ vn_revalidate(vp); /* update Linux inode flags */
...@@ -609,7 +622,15 @@ struct file_operations linvfs_dir_operations = { ...@@ -609,7 +622,15 @@ struct file_operations linvfs_dir_operations = {
static struct vm_operations_struct linvfs_file_vm_ops = { static struct vm_operations_struct linvfs_file_vm_ops = {
.nopage = filemap_nopage, .nopage = filemap_nopage,
.populate = filemap_populate, .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 #ifdef HAVE_VMOP_MPROTECT
.mprotect = linvfs_mprotect, .mprotect = linvfs_mprotect,
#endif #endif
}; };
#endif /* CONFIG_XFS_DMAPI */
...@@ -209,4 +209,8 @@ void xfs_dm_exit(struct file_system_type *); ...@@ -209,4 +209,8 @@ void xfs_dm_exit(struct file_system_type *);
#define XFS_DM_EXIT(fstype) #define XFS_DM_EXIT(fstype)
#endif #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__ */ #endif /* __XFS_DMAPI_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册