On Mon, Sep 25, 2017 at 05:14:03PM -0600, Ross Zwisler wrote:
When mappings are created the vma->vm_flags that they use vary
based on
whether the inode being mapped is using DAX or not. This setup happens in
XFS via mmap_region()=>call_mmap()=>xfs_file_mmap().
For us to be able to safely use the DAX per-inode flag we need to prevent
S_DAX transitions when any mappings are present, and we will do that by
looking at the address_space->i_mmap tree and returning -EBUSY if any
mappings are present.
Unfortunately at the time that the filesystem's file_operations->mmap()
entry point is called the mapping has not yet been added to the
address_space->i_mmap tree. This means that at that point in time we
cannot determine whether or not the mapping will be set up to support DAX.
Fix this by adding a new file_operations entry called post_mmap() which is
called after the mapping has been added to the address_space->i_mmap tree.
This post_mmap() op now happens at a time when we can be sure whether the
mapping will use DAX or not, and we can set up the vma->vm_flags
appropriately.
Just like in the read/write path we'll need a flag that is passed down
from the VM based on checking IS_DAX once and exactly once instead.