at v4.20 5.2 kB view raw
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 10typedef unsigned long dax_entry_t; 11 12struct iomap_ops; 13struct dax_device; 14struct 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 30extern struct attribute_group dax_attribute_group; 31 32#if IS_ENABLED(CONFIG_DAX) 33struct dax_device *dax_get_by_host(const char *host); 34struct dax_device *alloc_dax(void *private, const char *host, 35 const struct dax_operations *ops); 36void put_dax(struct dax_device *dax_dev); 37void kill_dax(struct dax_device *dax_dev); 38void dax_write_cache(struct dax_device *dax_dev, bool wc); 39bool dax_write_cache_enabled(struct dax_device *dax_dev); 40#else 41static inline struct dax_device *dax_get_by_host(const char *host) 42{ 43 return NULL; 44} 45static 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} 54static inline void put_dax(struct dax_device *dax_dev) 55{ 56} 57static inline void kill_dax(struct dax_device *dax_dev) 58{ 59} 60static inline void dax_write_cache(struct dax_device *dax_dev, bool wc) 61{ 62} 63static inline bool dax_write_cache_enabled(struct dax_device *dax_dev) 64{ 65 return false; 66} 67#endif 68 69struct writeback_control; 70int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); 71#if IS_ENABLED(CONFIG_FS_DAX) 72bool __bdev_dax_supported(struct block_device *bdev, int blocksize); 73static inline bool bdev_dax_supported(struct block_device *bdev, int blocksize) 74{ 75 return __bdev_dax_supported(bdev, blocksize); 76} 77 78static inline struct dax_device *fs_dax_get_by_host(const char *host) 79{ 80 return dax_get_by_host(host); 81} 82 83static inline void fs_put_dax(struct dax_device *dax_dev) 84{ 85 put_dax(dax_dev); 86} 87 88struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); 89int dax_writeback_mapping_range(struct address_space *mapping, 90 struct block_device *bdev, struct writeback_control *wbc); 91 92struct page *dax_layout_busy_page(struct address_space *mapping); 93dax_entry_t dax_lock_page(struct page *page); 94void dax_unlock_page(struct page *page, dax_entry_t cookie); 95#else 96static inline bool bdev_dax_supported(struct block_device *bdev, 97 int blocksize) 98{ 99 return false; 100} 101 102static inline struct dax_device *fs_dax_get_by_host(const char *host) 103{ 104 return NULL; 105} 106 107static inline void fs_put_dax(struct dax_device *dax_dev) 108{ 109} 110 111static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) 112{ 113 return NULL; 114} 115 116static inline struct page *dax_layout_busy_page(struct address_space *mapping) 117{ 118 return NULL; 119} 120 121static 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 127static 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 134static inline void dax_unlock_page(struct page *page, dax_entry_t cookie) 135{ 136} 137#endif 138 139int dax_read_lock(void); 140void dax_read_unlock(int id); 141bool dax_alive(struct dax_device *dax_dev); 142void *dax_get_private(struct dax_device *dax_dev); 143long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, 144 void **kaddr, pfn_t *pfn); 145size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 146 size_t bytes, struct iov_iter *i); 147size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 148 size_t bytes, struct iov_iter *i); 149void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); 150 151ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, 152 const struct iomap_ops *ops); 153vm_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); 155vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf, 156 enum page_entry_size pe_size, pfn_t pfn); 157int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index); 158int dax_invalidate_mapping_entry_sync(struct address_space *mapping, 159 pgoff_t index); 160 161#ifdef CONFIG_FS_DAX 162int __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 166static 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 174static inline bool dax_mapping(struct address_space *mapping) 175{ 176 return mapping->host && IS_DAX(mapping->host); 177} 178 179#endif