MAP_SYNC in libnvdimm-for-next and collision fixups

From: Williams, Dan J
Date: Thu Nov 02 2017 - 23:20:47 EST


Hi Stephen,

I've pushed a new libnvdimm-for-next branch that includes the libnvdimm
update for 4.15 as well as the MAP+AF8-SYNC patch set for -next exposure.
It has some collisions with code already pending in -next. My proposed
merge resolution is here:

https://git.kernel.org/pub/scm/linux/kernel/git/djbw/nvdimm.git/log/?h+AD0-
libnvdimm-vs-next-20171102

---
commit 2adeca04276acb4e747dbe7a5668efe03b164566
Merge: fa8785e862ef c29c91a9daa3
Author: Dan Williams +ADw-dan.j.williams+AEA-intel.com+AD4-
Date: Thu Nov 2 19:20:59 2017 -0700

Merge branch 'libnvdimm-for-next' into test

diff --cc fs/dax.c
index 3652b26a0048,78233c716757..f3a7fb804a50
--- a/fs/dax.c
+-+-+- b/fs/dax.c
+AEAAQABA- -825,38 -820,42 +-825,42 +AEAAQABA- out
+AH0-
EXPORT+AF8-SYMBOL+AF8-GPL(dax+AF8-writeback+AF8-mapping+AF8-range)+ADs-

- static int dax+AF8-insert+AF8-mapping(struct address+AF8-space +ACo-mapping,
- struct block+AF8-device +ACo-bdev, struct dax+AF8-device +ACo-dax+AF8-dev,
- sector+AF8-t sector, size+AF8-t size, void +ACo-entry,
- struct vm+AF8-area+AF8-struct +ACo-vma, struct vm+AF8-fault +ACo-vmf)
+- static sector+AF8-t dax+AF8-iomap+AF8-sector(struct iomap +ACo-iomap, loff+AF8-t pos)
+AHs-
- unsigned long vaddr +AD0- vmf-+AD4-address+ADs-
- void +ACo-ret, +ACo-kaddr+ADs-
- return iomap-+AD4-blkno +- (((pos +ACY- PAGE+AF8-MASK) - iomap-+AD4-offset) +AD4APg- 9)+ADs-
+-+- return (iomap-+AD4-addr +- (pos +ACY- PAGE+AF8-MASK) - iomap-+AD4-offset) +AD4APg- 9+ADs-
+- +AH0-
+-
+- static int dax+AF8-iomap+AF8-pfn(struct iomap +ACo-iomap, loff+AF8-t pos, size+AF8-t size,
+- pfn+AF8-t +ACo-pfnp)
+- +AHs-
+- const sector+AF8-t sector +AD0- dax+AF8-iomap+AF8-sector(iomap, pos)+ADs-
pgoff+AF8-t pgoff+ADs-
+- void +ACo-kaddr+ADs-
int id, rc+ADs-
- pfn+AF8-t pfn+ADs-
+- long length+ADs-

- rc +AD0- bdev+AF8-dax+AF8-pgoff(bdev, sector, size, +ACY-pgoff)+ADs-
+- rc +AD0- bdev+AF8-dax+AF8-pgoff(iomap-+AD4-bdev, sector, size, +ACY-pgoff)+ADs-
if (rc)
return rc+ADs-
-
id +AD0- dax+AF8-read+AF8-lock()+ADs-
- rc +AD0- dax+AF8-direct+AF8-access(dax+AF8-dev, pgoff, PHYS+AF8-PFN(size), +ACY-kaddr, +ACY-pfn)+ADs-
- if (rc +ADw- 0) +AHs-
- dax+AF8-read+AF8-unlock(id)+ADs-
- return rc+ADs-
+- length +AD0- dax+AF8-direct+AF8-access(iomap-+AD4-dax+AF8-dev, pgoff, PHYS+AF8-PFN(size),
+- +ACY-kaddr, pfnp)+ADs-
+- if (length +ADw- 0) +AHs-
+- rc +AD0- length+ADs-
+- goto out+ADs-
+AH0-
+- rc +AD0- -EINVAL+ADs-
+- if (PFN+AF8-PHYS(length) +ADw- size)
+- goto out+ADs-
+- if (pfn+AF8-t+AF8-to+AF8-pfn(+ACo-pfnp) +ACY- (PHYS+AF8-PFN(size)-1))
+- goto out+ADs-
+- /+ACo- For larger pages we need devmap +ACo-/
+- if (length +AD4- 1 +ACYAJg- +ACE-pfn+AF8-t+AF8-devmap(+ACo-pfnp))
+- goto out+ADs-
+- rc +AD0- 0+ADs-
+- out:
dax+AF8-read+AF8-unlock(id)+ADs-
-
- ret +AD0- dax+AF8-insert+AF8-mapping+AF8-entry(mapping, vmf, entry, sector, 0)+ADs-
- if (IS+AF8-ERR(ret))
- return PTR+AF8-ERR(ret)+ADs-
-
- trace+AF8-dax+AF8-insert+AF8-mapping(mapping-+AD4-host, vmf, ret)+ADs-
- if (vmf-+AD4-flags +ACY- FAULT+AF8-FLAG+AF8-WRITE)
- return vm+AF8-insert+AF8-mixed+AF8-mkwrite(vma, vaddr, pfn)+ADs-
- else
- return vm+AF8-insert+AF8-mixed(vma, vaddr, pfn)+ADs-
+- return rc+ADs-
+AH0-

/+ACo-
diff --cc fs/ext4/inode.c
index 59d31fec67ae,13a198924a0f..7250861f0f7b
--- a/fs/ext4/inode.c
+-+-+- b/fs/ext4/inode.c
+AEAAQABA- -3383,6 -3393,20 +-3383,19 +AEAAQABA- static int ext4+AF8-releasepage(struct pag
return try+AF8-to+AF8-free+AF8-buffers(page)+ADs-
+AH0-

-+ACM-ifdef CONFIG+AF8-FS+AF8-DAX
+- static bool ext4+AF8-inode+AF8-datasync+AF8-dirty(struct inode +ACo-inode)
+- +AHs-
+- journal+AF8-t +ACo-journal +AD0- EXT4+AF8-SB(inode-+AD4-i+AF8-sb)-+AD4-s+AF8-journal+ADs-
+-
+- if (journal)
+- return +ACE-jbd2+AF8-transaction+AF8-committed(journal,
+- EXT4+AF8-I(inode)-+AD4-i+AF8-datasync+AF8-tid)+ADs-
+- /+ACo- Any metadata buffers to write? +ACo-/
+- if (+ACE-list+AF8-empty(+ACY-inode-+AD4-i+AF8-mapping-+AD4-private+AF8-list))
+- return true+ADs-
+- return inode-+AD4-i+AF8-state +ACY- I+AF8-DIRTY+AF8-DATASYNC+ADs-
+- +AH0-
+-
static int ext4+AF8-iomap+AF8-begin(struct inode +ACo-inode, loff+AF8-t offset, loff+AF8-t length,
unsigned flags, struct iomap +ACo-iomap)
+AHs-
diff --cc include/linux/iomap.h
index a61be86710b5,73e3b7085dbe..a309d611d380
--- a/include/linux/iomap.h
+-+-+- b/include/linux/iomap.h
+AEAAQABA- -21,8 -21,12 +-21,13 +AEAAQABA- struct vm+AF8-fault
/+ACo-
+ACo- Flags for all iomap mappings:
+ACo-/
-+ACM-define IOMAP+AF8-F+AF8-NEW 0x01 /+ACo- blocks have been newly allocated +ACo-/
+-+ACM-define IOMAP+AF8-F+AF8-NEW 0x01 /+ACo- blocks have been newly allocated +ACo-/
+-+ACM-define IOMAP+AF8-F+AF8-BOUNDARY 0x02 /+ACo- mapping ends at metadata boundary +ACo-/
+- /+ACo-
+- +ACo- IOMAP+AF8-F+AF8-DIRTY indicates the inode has uncommitted metadata needed to access
+- +ACo- written data and requires fdatasync to commit them to persistent storage.
+- +ACo-/
-+ACM-define IOMAP+AF8-F+AF8-DIRTY 0x02
+-+-+ACM-define IOMAP+AF8-F+AF8-DIRTY 0x04

/+ACo-
+ACo- Flags that only need to be reported for IOMAP+AF8-REPORT requests: