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: Matthew Wilcox <willy@linux.intel.com>
Reported-by: Andy Rudoff <andy.rudoff@intel.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Matthew Wilcox 2015-09-08 14:59:11 -07:00 committed by Linus Torvalds
parent dd8a2b6c29
commit e676a4c191
1 changed files with 4 additions and 4 deletions

View File

@ -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) static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate)
{ {
struct inode *inode = bh->b_assoc_map->host; 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; loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits;
int err; int err;
if (!uptodate) 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) 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); return dax_fault(vma, vmf, ext4_get_block_write, ext4_end_io_unwritten);
/* Is this the right get_block? */
} }
static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, 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) 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 = { static const struct vm_operations_struct ext4_dax_vm_ops = {