aboutsummaryrefslogtreecommitdiff
path: root/fs/ext4/file.c
diff options
context:
space:
mode:
authorAlex Shi <alex.shi@linaro.org>2016-04-21 14:43:36 +0800
committerAlex Shi <alex.shi@linaro.org>2016-04-21 14:43:36 +0800
commit9beee7af111a7afa5f7b787daaf8a6891c05f216 (patch)
tree92fdbea807b9ef2917d1f087355f08617230dd75 /fs/ext4/file.c
parente8490c42825967752fef08dddf37eb3f5f34d753 (diff)
parentfd9302c16fc244139c1ddfdffc145d5b772ed9ce (diff)
Merge branch 'linux-linaro-lsk-v4.1' into linux-linaro-lsk-v4.1-androidlsk-v4.1-16.04-android
Conflicts: keep -fno-pic flag in arch/arm64/Makefile
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 dd65fac5ff2f..0d062ffacb24 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 = {