|
@@ -612,19 +612,13 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh,
|
|
* @vma: The virtual memory area where the fault occurred
|
|
* @vma: The virtual memory area where the fault occurred
|
|
* @vmf: The description of the fault
|
|
* @vmf: The description of the fault
|
|
* @get_block: The filesystem method used to translate file offsets to blocks
|
|
* @get_block: The filesystem method used to translate file offsets to blocks
|
|
- * @complete_unwritten: The filesystem method used to convert unwritten blocks
|
|
|
|
- * to written so the data written to them is exposed. This is required for
|
|
|
|
- * required by write faults for filesystems that will return unwritten
|
|
|
|
- * extent mappings from @get_block, but it is optional for reads as
|
|
|
|
- * dax_insert_mapping() will always zero unwritten blocks. If the fs does
|
|
|
|
- * not support unwritten extents, the it should pass NULL.
|
|
|
|
*
|
|
*
|
|
* When a page fault occurs, filesystems may call this helper in their
|
|
* When a page fault occurs, filesystems may call this helper in their
|
|
* fault handler for DAX files. __dax_fault() assumes the caller has done all
|
|
* fault handler for DAX files. __dax_fault() assumes the caller has done all
|
|
* the necessary locking for the page fault to proceed successfully.
|
|
* the necessary locking for the page fault to proceed successfully.
|
|
*/
|
|
*/
|
|
int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
- get_block_t get_block, dax_iodone_t complete_unwritten)
|
|
|
|
|
|
+ get_block_t get_block)
|
|
{
|
|
{
|
|
struct file *file = vma->vm_file;
|
|
struct file *file = vma->vm_file;
|
|
struct address_space *mapping = file->f_mapping;
|
|
struct address_space *mapping = file->f_mapping;
|
|
@@ -727,23 +721,9 @@ int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
page = NULL;
|
|
page = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
- /*
|
|
|
|
- * If we successfully insert the new mapping over an unwritten extent,
|
|
|
|
- * we need to ensure we convert the unwritten extent. If there is an
|
|
|
|
- * error inserting the mapping, the filesystem needs to leave it as
|
|
|
|
- * unwritten to prevent exposure of the stale underlying data to
|
|
|
|
- * userspace, but we still need to call the completion function so
|
|
|
|
- * the private resources on the mapping buffer can be released. We
|
|
|
|
- * indicate what the callback should do via the uptodate variable, same
|
|
|
|
- * as for normal BH based IO completions.
|
|
|
|
- */
|
|
|
|
|
|
+ /* Filesystem should not return unwritten buffers to us! */
|
|
|
|
+ WARN_ON_ONCE(buffer_unwritten(&bh));
|
|
error = dax_insert_mapping(inode, &bh, vma, vmf);
|
|
error = dax_insert_mapping(inode, &bh, vma, vmf);
|
|
- if (buffer_unwritten(&bh)) {
|
|
|
|
- if (complete_unwritten)
|
|
|
|
- complete_unwritten(&bh, !error);
|
|
|
|
- else
|
|
|
|
- WARN_ON_ONCE(!(vmf->flags & FAULT_FLAG_WRITE));
|
|
|
|
- }
|
|
|
|
|
|
|
|
out:
|
|
out:
|
|
if (error == -ENOMEM)
|
|
if (error == -ENOMEM)
|
|
@@ -772,7 +752,7 @@ EXPORT_SYMBOL(__dax_fault);
|
|
* fault handler for DAX files.
|
|
* fault handler for DAX files.
|
|
*/
|
|
*/
|
|
int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
- get_block_t get_block, dax_iodone_t complete_unwritten)
|
|
|
|
|
|
+ get_block_t get_block)
|
|
{
|
|
{
|
|
int result;
|
|
int result;
|
|
struct super_block *sb = file_inode(vma->vm_file)->i_sb;
|
|
struct super_block *sb = file_inode(vma->vm_file)->i_sb;
|
|
@@ -781,7 +761,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
sb_start_pagefault(sb);
|
|
sb_start_pagefault(sb);
|
|
file_update_time(vma->vm_file);
|
|
file_update_time(vma->vm_file);
|
|
}
|
|
}
|
|
- result = __dax_fault(vma, vmf, get_block, complete_unwritten);
|
|
|
|
|
|
+ result = __dax_fault(vma, vmf, get_block);
|
|
if (vmf->flags & FAULT_FLAG_WRITE)
|
|
if (vmf->flags & FAULT_FLAG_WRITE)
|
|
sb_end_pagefault(sb);
|
|
sb_end_pagefault(sb);
|
|
|
|
|
|
@@ -815,8 +795,7 @@ static void __dax_dbg(struct buffer_head *bh, unsigned long address,
|
|
#define dax_pmd_dbg(bh, address, reason) __dax_dbg(bh, address, reason, "dax_pmd")
|
|
#define dax_pmd_dbg(bh, address, reason) __dax_dbg(bh, address, reason, "dax_pmd")
|
|
|
|
|
|
int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
- pmd_t *pmd, unsigned int flags, get_block_t get_block,
|
|
|
|
- dax_iodone_t complete_unwritten)
|
|
|
|
|
|
+ pmd_t *pmd, unsigned int flags, get_block_t get_block)
|
|
{
|
|
{
|
|
struct file *file = vma->vm_file;
|
|
struct file *file = vma->vm_file;
|
|
struct address_space *mapping = file->f_mapping;
|
|
struct address_space *mapping = file->f_mapping;
|
|
@@ -875,6 +854,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
if (get_block(inode, block, &bh, 1) != 0)
|
|
if (get_block(inode, block, &bh, 1) != 0)
|
|
return VM_FAULT_SIGBUS;
|
|
return VM_FAULT_SIGBUS;
|
|
alloc = true;
|
|
alloc = true;
|
|
|
|
+ WARN_ON_ONCE(buffer_unwritten(&bh));
|
|
}
|
|
}
|
|
|
|
|
|
bdev = bh.b_bdev;
|
|
bdev = bh.b_bdev;
|
|
@@ -1020,9 +1000,6 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
out:
|
|
out:
|
|
i_mmap_unlock_read(mapping);
|
|
i_mmap_unlock_read(mapping);
|
|
|
|
|
|
- if (buffer_unwritten(&bh))
|
|
|
|
- complete_unwritten(&bh, !(result & VM_FAULT_ERROR));
|
|
|
|
-
|
|
|
|
return result;
|
|
return result;
|
|
|
|
|
|
fallback:
|
|
fallback:
|
|
@@ -1042,8 +1019,7 @@ EXPORT_SYMBOL_GPL(__dax_pmd_fault);
|
|
* pmd_fault handler for DAX files.
|
|
* pmd_fault handler for DAX files.
|
|
*/
|
|
*/
|
|
int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
- pmd_t *pmd, unsigned int flags, get_block_t get_block,
|
|
|
|
- dax_iodone_t complete_unwritten)
|
|
|
|
|
|
+ pmd_t *pmd, unsigned int flags, get_block_t get_block)
|
|
{
|
|
{
|
|
int result;
|
|
int result;
|
|
struct super_block *sb = file_inode(vma->vm_file)->i_sb;
|
|
struct super_block *sb = file_inode(vma->vm_file)->i_sb;
|
|
@@ -1052,8 +1028,7 @@ int dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
|
|
sb_start_pagefault(sb);
|
|
sb_start_pagefault(sb);
|
|
file_update_time(vma->vm_file);
|
|
file_update_time(vma->vm_file);
|
|
}
|
|
}
|
|
- result = __dax_pmd_fault(vma, address, pmd, flags, get_block,
|
|
|
|
- complete_unwritten);
|
|
|
|
|
|
+ result = __dax_pmd_fault(vma, address, pmd, flags, get_block);
|
|
if (flags & FAULT_FLAG_WRITE)
|
|
if (flags & FAULT_FLAG_WRITE)
|
|
sb_end_pagefault(sb);
|
|
sb_end_pagefault(sb);
|
|
|
|
|