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 10 struct iomap_ops; 11 struct dax_device; 12 struct 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 25 extern struct attribute_group dax_attribute_group; 26 27 #if IS_ENABLED(CONFIG_DAX) 28 struct dax_device *dax_get_by_host(const char *host); 29 struct dax_device *alloc_dax(void *private, const char *host, 30 const struct dax_operations *ops); 31 void put_dax(struct dax_device *dax_dev); 32 void kill_dax(struct dax_device *dax_dev); 33 void dax_write_cache(struct dax_device *dax_dev, bool wc); 34 bool dax_write_cache_enabled(struct dax_device *dax_dev); 35 #else 36 static inline struct dax_device *dax_get_by_host(const char *host) 37 { 38 return NULL; 39 } 40 static inline struct dax_device *alloc_dax(void *private, const char *host, 41 const struct dax_operations *ops) 42 { 43 /* 44 * Callers should check IS_ENABLED(CONFIG_DAX) to know if this 45 * NULL is an error or expected. 46 */ 47 return NULL; 48 } 49 static inline void put_dax(struct dax_device *dax_dev) 50 { 51 } 52 static inline void kill_dax(struct dax_device *dax_dev) 53 { 54 } 55 static inline void dax_write_cache(struct dax_device *dax_dev, bool wc) 56 { 57 } 58 static inline bool dax_write_cache_enabled(struct dax_device *dax_dev) 59 { 60 return false; 61 } 62 #endif 63 64 struct writeback_control; 65 int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); 66 #if IS_ENABLED(CONFIG_FS_DAX) 67 int __bdev_dax_supported(struct super_block *sb, int blocksize); 68 static inline int bdev_dax_supported(struct super_block *sb, int blocksize) 69 { 70 return __bdev_dax_supported(sb, blocksize); 71 } 72 73 static inline struct dax_device *fs_dax_get_by_host(const char *host) 74 { 75 return dax_get_by_host(host); 76 } 77 78 static inline void fs_put_dax(struct dax_device *dax_dev) 79 { 80 put_dax(dax_dev); 81 } 82 83 struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); 84 int dax_writeback_mapping_range(struct address_space *mapping, 85 struct block_device *bdev, struct writeback_control *wbc); 86 #else 87 static inline int bdev_dax_supported(struct super_block *sb, int blocksize) 88 { 89 return -EOPNOTSUPP; 90 } 91 92 static inline struct dax_device *fs_dax_get_by_host(const char *host) 93 { 94 return NULL; 95 } 96 97 static inline void fs_put_dax(struct dax_device *dax_dev) 98 { 99 } 100 101 static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) 102 { 103 return NULL; 104 } 105 106 static inline int dax_writeback_mapping_range(struct address_space *mapping, 107 struct block_device *bdev, struct writeback_control *wbc) 108 { 109 return -EOPNOTSUPP; 110 } 111 #endif 112 113 int dax_read_lock(void); 114 void dax_read_unlock(int id); 115 bool dax_alive(struct dax_device *dax_dev); 116 void *dax_get_private(struct dax_device *dax_dev); 117 long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, 118 void **kaddr, pfn_t *pfn); 119 size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 120 size_t bytes, struct iov_iter *i); 121 void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); 122 123 ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, 124 const struct iomap_ops *ops); 125 int dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size, 126 pfn_t *pfnp, int *errp, const struct iomap_ops *ops); 127 int dax_finish_sync_fault(struct vm_fault *vmf, enum page_entry_size pe_size, 128 pfn_t pfn); 129 int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index); 130 int dax_invalidate_mapping_entry_sync(struct address_space *mapping, 131 pgoff_t index); 132 133 #ifdef CONFIG_FS_DAX 134 int __dax_zero_page_range(struct block_device *bdev, 135 struct dax_device *dax_dev, sector_t sector, 136 unsigned int offset, unsigned int length); 137 #else 138 static inline int __dax_zero_page_range(struct block_device *bdev, 139 struct dax_device *dax_dev, sector_t sector, 140 unsigned int offset, unsigned int length) 141 { 142 return -ENXIO; 143 } 144 #endif 145 146 static inline bool dax_mapping(struct address_space *mapping) 147 { 148 return mapping->host && IS_DAX(mapping->host); 149 } 150 151 #endif 152