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: