• Muchun Song's avatar
    dax: fix missing writeprotect the pte entry · 06083a09
    Muchun Song authored
    Currently dax_mapping_entry_mkclean() fails to clean and write protect the
    pte entry within a DAX PMD entry during an *sync operation.  This can
    result in data loss in the following sequence:
    
      1) process A mmap write to DAX PMD, dirtying PMD radix tree entry and
         making the pmd entry dirty and writeable.
      2) process B mmap with the @offset (e.g. 4K) and @length (e.g. 4K)
         write to the same file, dirtying PMD radix tree entry (already
         done in 1)) and making the pte entry dirty and writeable.
      3) fsync, flushing out PMD data and cleaning the radix tree entry. We
         currently fail to mark the pte entry as clean and write protected
         since the vma of process B is not covered in dax_entry_mkclean().
      4) process B writes to the pte. These don't cause any page faults since
         the pte entry is dirty and writeable. The radix tree entry remains
         clean.
      5) fsync, which fails to flush the dirty PMD data because the radix tree
         entry was clean.
      6) crash - dirty data that should have been fsync'd as part of 5) could
         still have been in the processor cache, and is lost.
    
    Just to use pfn_mkclean_range() to clean the pfns to fix this issue.
    
    Link: https://lkml.kernel.org/r/20220403053957.10770-6-songmuchun@bytedance.com
    Fixes: 4b4bb46d ("dax: clear dirty entry tags on cache flush")
    Signed-off-by: default avatarMuchun Song <songmuchun@bytedance.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Ross Zwisler <zwisler@kernel.org>
    Cc: Xiongchun Duan <duanxiongchun@bytedance.com>
    Cc: Xiyu Yang <xiyuyang19@fudan.edu.cn>
    Cc: Yang Shi <shy828301@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    06083a09
dax.c 44.8 KB