linux/include/linux/dax.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_DAX_H
   3#define _LINUX_DAX_H
   4
   5#include <linux/fs.h>
   6#include <linux/mm.h>
   7#include <linux/radix-tree.h>
   8#include <asm/pgtable.h>
   9
  10struct iomap_ops;
  11struct dax_device;
  12struct dax_operations {
  13        /*
  14         * direct_access: translate a device-relative
  15         * logical-page-offset into an absolute physical pfn. Return the
  16         * number of pages available for DAX at that pfn.
  17         */
  18        long (*direct_access)(struct dax_device *, pgoff_t, long,
  19                        void **, pfn_t *);
  20        /* copy_from_iter: required operation for fs-dax direct-i/o */
  21        size_t (*copy_from_iter)(struct dax_device *, pgoff_t, void *, size_t,
  22                        struct iov_iter *);
  23};
  24
  25extern struct attribute_group dax_attribute_group;
  26
  27#if IS_ENABLED(CONFIG_DAX)
  28struct dax_device *dax_get_by_host(const char *host);
  29void put_dax(struct dax_device *dax_dev);
  30#else
  31static inline struct dax_device *dax_get_by_host(const char *host)
  32{
  33        return NULL;
  34}
  35
  36static inline void put_dax(struct dax_device *dax_dev)
  37{
  38}
  39#endif
  40
  41int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff);
  42#if IS_ENABLED(CONFIG_FS_DAX)
  43int __bdev_dax_supported(struct super_block *sb, int blocksize);
  44static inline int bdev_dax_supported(struct super_block *sb, int blocksize)
  45{
  46        return __bdev_dax_supported(sb, blocksize);
  47}
  48
  49static inline struct dax_device *fs_dax_get_by_host(const char *host)
  50{
  51        return dax_get_by_host(host);
  52}
  53
  54static inline void fs_put_dax(struct dax_device *dax_dev)
  55{
  56        put_dax(dax_dev);
  57}
  58
  59struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev);
  60#else
  61static inline int bdev_dax_supported(struct super_block *sb, int blocksize)
  62{
  63        return -EOPNOTSUPP;
  64}
  65
  66static inline struct dax_device *fs_dax_get_by_host(const char *host)
  67{
  68        return NULL;
  69}
  70
  71static inline void fs_put_dax(struct dax_device *dax_dev)
  72{
  73}
  74
  75static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
  76{
  77        return NULL;
  78}
  79#endif
  80
  81int dax_read_lock(void);
  82void dax_read_unlock(int id);
  83struct dax_device *alloc_dax(void *private, const char *host,
  84                const struct dax_operations *ops);
  85bool dax_alive(struct dax_device *dax_dev);
  86void kill_dax(struct dax_device *dax_dev);
  87void *dax_get_private(struct dax_device *dax_dev);
  88long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
  89                void **kaddr, pfn_t *pfn);
  90size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
  91                size_t bytes, struct iov_iter *i);
  92void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
  93void dax_write_cache(struct dax_device *dax_dev, bool wc);
  94bool dax_write_cache_enabled(struct dax_device *dax_dev);
  95
  96ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
  97                const struct iomap_ops *ops);
  98int dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
  99                    pfn_t *pfnp, int *errp, const struct iomap_ops *ops);
 100int dax_finish_sync_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
 101                          pfn_t pfn);
 102int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
 103int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
 104                                      pgoff_t index);
 105
 106#ifdef CONFIG_FS_DAX
 107int __dax_zero_page_range(struct block_device *bdev,
 108                struct dax_device *dax_dev, sector_t sector,
 109                unsigned int offset, unsigned int length);
 110#else
 111static inline int __dax_zero_page_range(struct block_device *bdev,
 112                struct dax_device *dax_dev, sector_t sector,
 113                unsigned int offset, unsigned int length)
 114{
 115        return -ENXIO;
 116}
 117#endif
 118
 119static inline bool dax_mapping(struct address_space *mapping)
 120{
 121        return mapping->host && IS_DAX(mapping->host);
 122}
 123
 124struct writeback_control;
 125int dax_writeback_mapping_range(struct address_space *mapping,
 126                struct block_device *bdev, struct writeback_control *wbc);
 127#endif
 128