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:
parent
dd8a2b6c29
commit
e676a4c191
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue