On 21:07 23/05, Jan Kara wrote: > On Thu 23-05-19 10:27:22, Goldwyn Rodrigues wrote: > > On 16:04 23/05, Jan Kara wrote: > > > On Mon 29-04-19 12:26:47, Goldwyn Rodrigues wrote: > > > > From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > > > > > > > > Inorder to make sure mmap'd files don't change after snapshot, > > > > writeprotect the mmap pages on snapshot. This is done by performing > > > > a data writeback on the pages (which simply mark the pages are > > > > wrprotected). This way if the user process tries to access the memory > > > > we will get another fault and we can perform a CoW. > > > > > > > > In order to accomplish this, we tag all CoW pages as > > > > PAGECACHE_TAG_TOWRITE, and add the mmapd inode in delalloc_inodes. > > > > During snapshot, it starts writeback of all delalloc'd inodes and > > > > here we perform a data writeback. We don't want to keep the inodes > > > > in delalloc_inodes until it umount (WARN_ON), so we remove it > > > > during inode evictions. > > > > > > > > Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > > > > > > OK, so here you use PAGECACHE_TAG_TOWRITE. But why is not > > > PAGECACHE_TAG_DIRTY enough for you? Also why isn't the same needed also for > > > normal non-DAX inodes? There you also need to trigger CoW on mmap write so > > > I just don't see the difference... > > > > Because dax_writeback_mapping_range() writebacks pages marked > > PAGECACHE_TAG_TOWRITE and not PAGECACHE_TAG_DIRTY. Should it > > writeback pages marked as PAGECACHE_TAG_DIRTY as well? > > It does writeback PAGECACHE_TAG_DIRTY pages - tag_pages_for_writeback() > moves PAGECACHE_TAG_DIRTY to PAGECACHE_TAG_TOWRITE... Yes, I missed that. It just needs a writeback with WB_SYNC_ALL. Thanks! -- Goldwyn