• Shiyang Ruan's avatar
    dax: introduce holder for dax_device · 8012b866
    Shiyang Ruan authored
    Patch series "v14 fsdax-rmap + v11 fsdax-reflink", v2.
    
    The patchset fsdax-rmap is aimed to support shared pages tracking for
    fsdax.
    
    It moves owner tracking from dax_assocaite_entry() to pmem device driver,
    by introducing an interface ->memory_failure() for struct pagemap.  This
    interface is called by memory_failure() in mm, and implemented by pmem
    device.
    
    Then call holder operations to find the filesystem which the corrupted
    data located in, and call filesystem handler to track files or metadata
    associated with this page.
    
    Finally we are able to try to fix the corrupted data in filesystem and do
    other necessary processing, such as killing processes who are using the
    files affected.
    
    The call trace is like this:
    memory_failure()
    |* fsdax case
    |------------
    |pgmap->ops->memory_failure()      => pmem_pgmap_memory_failure()
    | dax_holder_notify_failure()      =>
    |  dax_device->holder_ops->notify_failure() =>
    |                                     - xfs_dax_notify_failure()
    |  |* xfs_dax_notify_failure()
    |  |--------------------------
    |  |   xfs_rmap_query_range()
    |  |    xfs_dax_failure_fn()
    |  |    * corrupted on metadata
    |  |       try to recover data, call xfs_force_shutdown()
    |  |    * corrupted on file data
    |  |       try to recover data, call mf_dax_kill_procs()
    |* normal case
    |-------------
    |mf_generic_kill_procs()
    
    
    The patchset fsdax-reflink attempts to add CoW support for fsdax, and
    takes XFS, which has both reflink and fsdax features, as an example.
    
    One of the key mechanisms needed to be implemented in fsdax is CoW.  Copy
    the data from srcmap before we actually write data to the destination
    iomap.  And we just copy range in which data won't be changed.
    
    Another mechanism is range comparison.  In page cache case, readpage() is
    used to load data on disk to page cache in order to be able to compare
    data.  In fsdax case, readpage() does not work.  So, we need another
    compare data with direct access support.
    
    With the two mechanisms implemented in fsdax, we are able to make reflink
    and fsdax work together in XFS.
    
    
    This patch (of 14):
    
    To easily track filesystem from a pmem device, we introduce a holder for
    dax_device structure, and also its operation.  This holder is used to
    remember who is using this dax_device:
    
     - When it is the backend of a filesystem, the holder will be the
       instance of this filesystem.
     - When this pmem device is one of the targets in a mapped device, the
       holder will be this mapped device.  In this case, the mapped device
       has its own dax_device and it will follow the first rule.  So that we
       can finally track to the filesystem we needed.
    
    The holder and holder_ops will be set when filesystem is being mounted,
    or an target device is being activated.
    
    Link: https://lkml.kernel.org/r/20220603053738.1218681-1-ruansy.fnst@fujitsu.com
    Link: https://lkml.kernel.org/r/20220603053738.1218681-2-ruansy.fnst@fujitsu.comSigned-off-by: default avatarShiyang Ruan <ruansy.fnst@fujitsu.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDan Williams <dan.j.wiliams@intel.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Jane Chu <jane.chu@oracle.com>
    Cc: Goldwyn Rodrigues <rgoldwyn@suse.de>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Goldwyn Rodrigues <rgoldwyn@suse.com>
    Cc: Ritesh Harjani <riteshh@linux.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    8012b866
super.c 44.2 KB