|
@@ -526,13 +526,13 @@ static int copy_user_dax(struct block_device *bdev, struct dax_device *dax_dev,
|
|
static void *dax_insert_mapping_entry(struct address_space *mapping,
|
|
static void *dax_insert_mapping_entry(struct address_space *mapping,
|
|
struct vm_fault *vmf,
|
|
struct vm_fault *vmf,
|
|
void *entry, sector_t sector,
|
|
void *entry, sector_t sector,
|
|
- unsigned long flags)
|
|
|
|
|
|
+ unsigned long flags, bool dirty)
|
|
{
|
|
{
|
|
struct radix_tree_root *page_tree = &mapping->page_tree;
|
|
struct radix_tree_root *page_tree = &mapping->page_tree;
|
|
void *new_entry;
|
|
void *new_entry;
|
|
pgoff_t index = vmf->pgoff;
|
|
pgoff_t index = vmf->pgoff;
|
|
|
|
|
|
- if (vmf->flags & FAULT_FLAG_WRITE)
|
|
|
|
|
|
+ if (dirty)
|
|
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
|
__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
|
|
|
|
|
|
if (dax_is_zero_entry(entry) && !(flags & RADIX_DAX_ZERO_PAGE)) {
|
|
if (dax_is_zero_entry(entry) && !(flags & RADIX_DAX_ZERO_PAGE)) {
|
|
@@ -569,7 +569,7 @@ static void *dax_insert_mapping_entry(struct address_space *mapping,
|
|
entry = new_entry;
|
|
entry = new_entry;
|
|
}
|
|
}
|
|
|
|
|
|
- if (vmf->flags & FAULT_FLAG_WRITE)
|
|
|
|
|
|
+ if (dirty)
|
|
radix_tree_tag_set(page_tree, index, PAGECACHE_TAG_DIRTY);
|
|
radix_tree_tag_set(page_tree, index, PAGECACHE_TAG_DIRTY);
|
|
|
|
|
|
spin_unlock_irq(&mapping->tree_lock);
|
|
spin_unlock_irq(&mapping->tree_lock);
|
|
@@ -881,7 +881,7 @@ static int dax_load_hole(struct address_space *mapping, void *entry,
|
|
}
|
|
}
|
|
|
|
|
|
entry2 = dax_insert_mapping_entry(mapping, vmf, entry, 0,
|
|
entry2 = dax_insert_mapping_entry(mapping, vmf, entry, 0,
|
|
- RADIX_DAX_ZERO_PAGE);
|
|
|
|
|
|
+ RADIX_DAX_ZERO_PAGE, false);
|
|
if (IS_ERR(entry2)) {
|
|
if (IS_ERR(entry2)) {
|
|
ret = VM_FAULT_SIGBUS;
|
|
ret = VM_FAULT_SIGBUS;
|
|
goto out;
|
|
goto out;
|
|
@@ -1182,7 +1182,7 @@ static int dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp,
|
|
|
|
|
|
entry = dax_insert_mapping_entry(mapping, vmf, entry,
|
|
entry = dax_insert_mapping_entry(mapping, vmf, entry,
|
|
dax_iomap_sector(&iomap, pos),
|
|
dax_iomap_sector(&iomap, pos),
|
|
- 0);
|
|
|
|
|
|
+ 0, write);
|
|
if (IS_ERR(entry)) {
|
|
if (IS_ERR(entry)) {
|
|
error = PTR_ERR(entry);
|
|
error = PTR_ERR(entry);
|
|
goto error_finish_iomap;
|
|
goto error_finish_iomap;
|
|
@@ -1258,7 +1258,7 @@ static int dax_pmd_load_hole(struct vm_fault *vmf, struct iomap *iomap,
|
|
goto fallback;
|
|
goto fallback;
|
|
|
|
|
|
ret = dax_insert_mapping_entry(mapping, vmf, entry, 0,
|
|
ret = dax_insert_mapping_entry(mapping, vmf, entry, 0,
|
|
- RADIX_DAX_PMD | RADIX_DAX_ZERO_PAGE);
|
|
|
|
|
|
+ RADIX_DAX_PMD | RADIX_DAX_ZERO_PAGE, false);
|
|
if (IS_ERR(ret))
|
|
if (IS_ERR(ret))
|
|
goto fallback;
|
|
goto fallback;
|
|
|
|
|
|
@@ -1379,7 +1379,7 @@ static int dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp,
|
|
|
|
|
|
entry = dax_insert_mapping_entry(mapping, vmf, entry,
|
|
entry = dax_insert_mapping_entry(mapping, vmf, entry,
|
|
dax_iomap_sector(&iomap, pos),
|
|
dax_iomap_sector(&iomap, pos),
|
|
- RADIX_DAX_PMD);
|
|
|
|
|
|
+ RADIX_DAX_PMD, write);
|
|
if (IS_ERR(entry))
|
|
if (IS_ERR(entry))
|
|
goto finish_iomap;
|
|
goto finish_iomap;
|
|
|
|
|