summaryrefslogtreecommitdiff
path: root/fs/ext4/file.c
diff options
context:
space:
mode:
authorDave Chinner <david@fromorbit.com>2015-06-04 13:01:49 +1000
committerDave Chinner <david@fromorbit.com>2015-06-04 13:01:49 +1000
commit66e8ac7bfa0a591b8cfaa447db2daa5b6e9221d0 (patch)
treee21331c5c8ad224d1b8d7f8762f78f4377c881ab /fs/ext4/file.c
parentb9a350a1183efd7b63e59b6eaa39abfea908d0be (diff)
parentcbe4dab119f211ff6642d617f541087894e99e4f (diff)
Merge branch 'xfs-dax-support' into for-next
Diffstat (limited to 'fs/ext4/file.c')
-rw-r--r--fs/ext4/file.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 0613c256c344..f713cfcc43a2 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -192,15 +192,27 @@ out:
}
#ifdef CONFIG_FS_DAX
+static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate)
+{
+ struct inode *inode = bh->b_assoc_map->host;
+ /* XXX: breaks on 32-bit > 16GB. Is that even supported? */
+ loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits;
+ int err;
+ if (!uptodate)
+ return;
+ WARN_ON(!buffer_unwritten(bh));
+ err = ext4_convert_unwritten_extents(NULL, inode, offset, bh->b_size);
+}
+
static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
- return dax_fault(vma, vmf, ext4_get_block);
+ return dax_fault(vma, vmf, ext4_get_block, ext4_end_io_unwritten);
/* Is this the right get_block? */
}
static int ext4_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
{
- return dax_mkwrite(vma, vmf, ext4_get_block);
+ return dax_mkwrite(vma, vmf, ext4_get_block, ext4_end_io_unwritten);
}
static const struct vm_operations_struct ext4_dax_vm_ops = {