Merge remote-tracking branches 'regulator/fix/anatop', 'regulator/fix/gpio', 'regulat...
[firefly-linux-kernel-4.4.55.git] / fs / dax.c
index e43389c74bbcea88956b0c5972f72e94cef58313..7ae6df7ea1d2d04962ef4554a6a2fa1efb977006 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -17,6 +17,7 @@
 #include <linux/atomic.h>
 #include <linux/blkdev.h>
 #include <linux/buffer_head.h>
+#include <linux/dax.h>
 #include <linux/fs.h>
 #include <linux/genhd.h>
 #include <linux/highmem.h>
@@ -118,7 +119,8 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter,
                size_t len;
                if (pos == max) {
                        unsigned blkbits = inode->i_blkbits;
-                       sector_t block = pos >> blkbits;
+                       long page = pos >> PAGE_SHIFT;
+                       sector_t block = page << (PAGE_SHIFT - blkbits);
                        unsigned first = pos - (block << blkbits);
                        long size;
 
@@ -527,7 +529,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
        unsigned long pmd_addr = address & PMD_MASK;
        bool write = flags & FAULT_FLAG_WRITE;
        long length;
-       void *kaddr;
+       void __pmem *kaddr;
        pgoff_t size, pgoff;
        sector_t block, sector;
        unsigned long pfn;
@@ -570,7 +572,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address,
        if (buffer_unwritten(&bh) || buffer_new(&bh)) {
                int i;
                for (i = 0; i < PTRS_PER_PMD; i++)
-                       clear_page(kaddr + i * PAGE_SIZE);
+                       clear_pmem(kaddr + i * PAGE_SIZE, PAGE_SIZE);
+               wmb_pmem();
                count_vm_event(PGMAJFAULT);
                mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT);
                result |= VM_FAULT_MAJOR;