Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e676a4c1 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Linus Torvalds
Browse files

ext4: use ext4_get_block_write() for DAX



DAX relies on the get_block function either zeroing newly allocated
blocks before they're findable by subsequent calls to get_block, or
marking newly allocated blocks as unwritten.  ext4_get_block() cannot
create unwritten extents, but ext4_get_block_write() can.

Signed-off-by: default avatarMatthew Wilcox <willy@linux.intel.com>
Reported-by: default avatarAndy Rudoff <andy.rudoff@intel.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dd8a2b6c
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
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? */
	/* XXX: breaks on 32-bit > 16TB. Is that even supported? */
	loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits;
	int err;
	if (!uptodate)
@@ -207,8 +207,7 @@ static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate)

static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
	return dax_fault(vma, vmf, ext4_get_block, ext4_end_io_unwritten);
					/* Is this the right get_block? */
	return dax_fault(vma, vmf, ext4_get_block_write, ext4_end_io_unwritten);
}

static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
@@ -220,7 +219,8 @@ static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,

static int ext4_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
{
	return dax_mkwrite(vma, vmf, ext4_get_block, ext4_end_io_unwritten);
	return dax_mkwrite(vma, vmf, ext4_get_block_write,
				ext4_end_io_unwritten);
}

static const struct vm_operations_struct ext4_dax_vm_ops = {