iomap: use a srcmap for a read-modify-write I/O
[sfrench/cifs-2.6.git] / fs / dax.c
index 6bf81f931de39e48bc2983a1c901b1a6643443f8..68eef98cd9c4068ffa880aaa7937d34e0052bc15 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1090,7 +1090,7 @@ EXPORT_SYMBOL_GPL(__dax_zero_page_range);
 
 static loff_t
 dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
-               struct iomap *iomap)
+               struct iomap *iomap, struct iomap *srcmap)
 {
        struct block_device *bdev = iomap->bdev;
        struct dax_device *dax_dev = iomap->dax_dev;
@@ -1247,7 +1247,8 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp,
        struct inode *inode = mapping->host;
        unsigned long vaddr = vmf->address;
        loff_t pos = (loff_t)vmf->pgoff << PAGE_SHIFT;
-       struct iomap iomap = { 0 };
+       struct iomap iomap = { .type = IOMAP_HOLE };
+       struct iomap srcmap = { .type = IOMAP_HOLE };
        unsigned flags = IOMAP_FAULT;
        int error, major = 0;
        bool write = vmf->flags & FAULT_FLAG_WRITE;
@@ -1292,7 +1293,7 @@ static vm_fault_t dax_iomap_pte_fault(struct vm_fault *vmf, pfn_t *pfnp,
         * the file system block size to be equal the page size, which means
         * that we never have to deal with more than a single extent here.
         */
-       error = ops->iomap_begin(inode, pos, PAGE_SIZE, flags, &iomap);
+       error = ops->iomap_begin(inode, pos, PAGE_SIZE, flags, &iomap, &srcmap);
        if (iomap_errp)
                *iomap_errp = error;
        if (error) {
@@ -1471,7 +1472,8 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp,
        unsigned int iomap_flags = (write ? IOMAP_WRITE : 0) | IOMAP_FAULT;
        struct inode *inode = mapping->host;
        vm_fault_t result = VM_FAULT_FALLBACK;
-       struct iomap iomap = { 0 };
+       struct iomap iomap = { .type = IOMAP_HOLE };
+       struct iomap srcmap = { .type = IOMAP_HOLE };
        pgoff_t max_pgoff;
        void *entry;
        loff_t pos;
@@ -1546,7 +1548,8 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp,
         * to look up our filesystem block.
         */
        pos = (loff_t)xas.xa_index << PAGE_SHIFT;
-       error = ops->iomap_begin(inode, pos, PMD_SIZE, iomap_flags, &iomap);
+       error = ops->iomap_begin(inode, pos, PMD_SIZE, iomap_flags, &iomap,
+                       &srcmap);
        if (error)
                goto unlock_entry;