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 typedef unsigned long dax_entry_t; 11 12 struct iomap_ops; 13 struct dax_device; 14 struct dax_operations { 15 /* 16 * direct_access: translate a device-relative 17 * logical-page-offset into an absolute physical pfn. Return the 18 * number of pages available for DAX at that pfn. 19 */ 20 long (*direct_access)(struct dax_device *, pgoff_t, long, 21 void **, pfn_t *); 22 /* copy_from_iter: required operation for fs-dax direct-i/o */ 23 size_t (*copy_from_iter)(struct dax_device *, pgoff_t, void *, size_t, 24 struct iov_iter *); 25 /* copy_to_iter: required operation for fs-dax direct-i/o */ 26 size_t (*copy_to_iter)(struct dax_device *, pgoff_t, void *, size_t, 27 struct iov_iter *); 28 }; 29 30 extern struct attribute_group dax_attribute_group; 31 32 #if IS_ENABLED(CONFIG_DAX) 33 struct dax_device *dax_get_by_host(const char *host); 34 struct dax_device *alloc_dax(void *private, const char *host, 35 const struct dax_operations *ops); 36 void put_dax(struct dax_device *dax_dev); 37 void kill_dax(struct dax_device *dax_dev); 38 void dax_write_cache(struct dax_device *dax_dev, bool wc); 39 bool dax_write_cache_enabled(struct dax_device *dax_dev); 40 #else 41 static inline struct dax_device *dax_get_by_host(const char *host) 42 { 43 return NULL; 44 } 45 static inline struct dax_device *alloc_dax(void *private, const char *host, 46 const struct dax_operations *ops) 47 { 48 /* 49 * Callers should check IS_ENABLED(CONFIG_DAX) to know if this 50 * NULL is an error or expected. 51 */ 52 return NULL; 53 } 54 static inline void put_dax(struct dax_device *dax_dev) 55 { 56 } 57 static inline void kill_dax(struct dax_device *dax_dev) 58 { 59 } 60 static inline void dax_write_cache(struct dax_device *dax_dev, bool wc) 61 { 62 } 63 static inline bool dax_write_cache_enabled(struct dax_device *dax_dev) 64 { 65 return false; 66 } 67 #endif 68 69 struct writeback_control; 70 int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); 71 #if IS_ENABLED(CONFIG_FS_DAX) 72 bool __bdev_dax_supported(struct block_device *bdev, int blocksize); 73 static inline bool bdev_dax_supported(struct block_device *bdev, int blocksize) 74 { 75 return __bdev_dax_supported(bdev, blocksize); 76 } 77 78 static inline struct dax_device *fs_dax_get_by_host(const char *host) 79 { 80 return dax_get_by_host(host); 81 } 82 83 static inline void fs_put_dax(struct dax_device *dax_dev) 84 { 85 put_dax(dax_dev); 86 } 87 88 struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); 89 int dax_writeback_mapping_range(struct address_space *mapping, 90 struct block_device *bdev, struct writeback_control *wbc); 91 92 struct page *dax_layout_busy_page(struct address_space *mapping); 93 dax_entry_t dax_lock_page(struct page *page); 94 void dax_unlock_page(struct page *page, dax_entry_t cookie); 95 #else 96 static inline bool bdev_dax_supported(struct block_device *bdev, 97 int blocksize) 98 { 99 return false; 100 } 101 102 static inline struct dax_device *fs_dax_get_by_host(const char *host) 103 { 104 return NULL; 105 } 106 107 static inline void fs_put_dax(struct dax_device *dax_dev) 108 { 109 } 110 111 static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) 112 { 113 return NULL; 114 } 115 116 static inline struct page *dax_layout_busy_page(struct address_space *mapping) 117 { 118 return NULL; 119 } 120 121 static inline int dax_writeback_mapping_range(struct address_space *mapping, 122 struct block_device *bdev, struct writeback_control *wbc) 123 { 124 return -EOPNOTSUPP; 125 } 126 127 static inline dax_entry_t dax_lock_page(struct page *page) 128 { 129 if (IS_DAX(page->mapping->host)) 130 return ~0UL; 131 return 0; 132 } 133 134 static inline void dax_unlock_page(struct page *page, dax_entry_t cookie) 135 { 136 } 137 #endif 138 139 int dax_read_lock(void); 140 void dax_read_unlock(int id); 141 bool dax_alive(struct dax_device *dax_dev); 142 void *dax_get_private(struct dax_device *dax_dev); 143 long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, 144 void **kaddr, pfn_t *pfn); 145 size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 146 size_t bytes, struct iov_iter *i); 147 size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 148 size_t bytes, struct iov_iter *i); 149 void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); 150 151 ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, 152 const struct iomap_ops *ops); 153 vm_fault_t dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size, 154 pfn_t *pfnp, int *errp, const struct iomap_ops *ops); 155 vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf, 156 enum page_entry_size pe_size, pfn_t pfn); 157 int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index); 158 int dax_invalidate_mapping_entry_sync(struct address_space *mapping, 159 pgoff_t index); 160 161 #ifdef CONFIG_FS_DAX 162 int __dax_zero_page_range(struct block_device *bdev, 163 struct dax_device *dax_dev, sector_t sector, 164 unsigned int offset, unsigned int length); 165 #else 166 static inline int __dax_zero_page_range(struct block_device *bdev, 167 struct dax_device *dax_dev, sector_t sector, 168 unsigned int offset, unsigned int length) 169 { 170 return -ENXIO; 171 } 172 #endif 173 174 static inline bool dax_mapping(struct address_space *mapping) 175 { 176 return mapping->host && IS_DAX(mapping->host); 177 } 178 179 #endif 180