|
@@ -1379,6 +1379,32 @@ xfs_file_llseek(
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Locking for serialisation of IO during page faults. This results in a lock
|
|
|
|
+ * ordering of:
|
|
|
|
+ *
|
|
|
|
+ * mmap_sem (MM)
|
|
|
|
+ * i_mmap_lock (XFS - truncate serialisation)
|
|
|
|
+ * page_lock (MM)
|
|
|
|
+ * i_lock (XFS - extent map serialisation)
|
|
|
|
+ */
|
|
|
|
+STATIC int
|
|
|
|
+xfs_filemap_fault(
|
|
|
|
+ struct vm_area_struct *vma,
|
|
|
|
+ struct vm_fault *vmf)
|
|
|
|
+{
|
|
|
|
+ struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host);
|
|
|
|
+ int error;
|
|
|
|
+
|
|
|
|
+ trace_xfs_filemap_fault(ip);
|
|
|
|
+
|
|
|
|
+ xfs_ilock(ip, XFS_MMAPLOCK_SHARED);
|
|
|
|
+ error = filemap_fault(vma, vmf);
|
|
|
|
+ xfs_iunlock(ip, XFS_MMAPLOCK_SHARED);
|
|
|
|
+
|
|
|
|
+ return error;
|
|
|
|
+}
|
|
|
|
+
|
|
const struct file_operations xfs_file_operations = {
|
|
const struct file_operations xfs_file_operations = {
|
|
.llseek = xfs_file_llseek,
|
|
.llseek = xfs_file_llseek,
|
|
.read = new_sync_read,
|
|
.read = new_sync_read,
|
|
@@ -1411,7 +1437,7 @@ const struct file_operations xfs_dir_file_operations = {
|
|
};
|
|
};
|
|
|
|
|
|
static const struct vm_operations_struct xfs_file_vm_ops = {
|
|
static const struct vm_operations_struct xfs_file_vm_ops = {
|
|
- .fault = filemap_fault,
|
|
|
|
|
|
+ .fault = xfs_filemap_fault,
|
|
.map_pages = filemap_map_pages,
|
|
.map_pages = filemap_map_pages,
|
|
.page_mkwrite = xfs_vm_page_mkwrite,
|
|
.page_mkwrite = xfs_vm_page_mkwrite,
|
|
};
|
|
};
|