summaryrefslogtreecommitdiff
path: root/fs/ext4/extents.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r--fs/ext4/extents.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 92ad64b89d9b..8c99e591f797 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -29,6 +29,7 @@
#include <linux/fiemap.h>
#include <linux/backing-dev.h>
#include <linux/iomap.h>
+#include <linux/dax.h>
#include "ext4_jbd2.h"
#include "ext4_extents.h"
#include "xattr.h"
@@ -4678,6 +4679,26 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
}
if (mode & FALLOC_FL_ZERO_RANGE) {
+ /*
+ * If the file is in DAX mode, try to use a DAX-specific
+ * function to zero the region.
+ */
+ if (IS_DAX(inode)) {
+ bool did_zeroout = false;
+
+ inode_lock(inode);
+
+ ret = dax_zeroinit_range(inode, offset, len,
+ &did_zeroout, &ext4_iomap_report_ops);
+ if (ret == -EINVAL)
+ ret = 0;
+ if (ret || did_zeroout) {
+ max_blocks = 0;
+ goto out;
+ }
+
+ inode_unlock(inode);
+ }
ret = ext4_zero_range(file, offset, len, mode);
goto exit;
}