at v4.17 4.4 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 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); 29struct dax_device *alloc_dax(void *private, const char *host, 30 const struct dax_operations *ops); 31void put_dax(struct dax_device *dax_dev); 32void kill_dax(struct dax_device *dax_dev); 33void dax_write_cache(struct dax_device *dax_dev, bool wc); 34bool dax_write_cache_enabled(struct dax_device *dax_dev); 35#else 36static inline struct dax_device *dax_get_by_host(const char *host) 37{ 38 return NULL; 39} 40static 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} 49static inline void put_dax(struct dax_device *dax_dev) 50{ 51} 52static inline void kill_dax(struct dax_device *dax_dev) 53{ 54} 55static inline void dax_write_cache(struct dax_device *dax_dev, bool wc) 56{ 57} 58static inline bool dax_write_cache_enabled(struct dax_device *dax_dev) 59{ 60 return false; 61} 62#endif 63 64struct writeback_control; 65int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff); 66#if IS_ENABLED(CONFIG_FS_DAX) 67int __bdev_dax_supported(struct super_block *sb, int blocksize); 68static inline int bdev_dax_supported(struct super_block *sb, int blocksize) 69{ 70 return __bdev_dax_supported(sb, blocksize); 71} 72 73static inline struct dax_device *fs_dax_get_by_host(const char *host) 74{ 75 return dax_get_by_host(host); 76} 77 78static inline void fs_put_dax(struct dax_device *dax_dev) 79{ 80 put_dax(dax_dev); 81} 82 83struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); 84int dax_writeback_mapping_range(struct address_space *mapping, 85 struct block_device *bdev, struct writeback_control *wbc); 86#else 87static inline int bdev_dax_supported(struct super_block *sb, int blocksize) 88{ 89 return -EOPNOTSUPP; 90} 91 92static inline struct dax_device *fs_dax_get_by_host(const char *host) 93{ 94 return NULL; 95} 96 97static inline void fs_put_dax(struct dax_device *dax_dev) 98{ 99} 100 101static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) 102{ 103 return NULL; 104} 105 106static 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 113int dax_read_lock(void); 114void dax_read_unlock(int id); 115bool dax_alive(struct dax_device *dax_dev); 116void *dax_get_private(struct dax_device *dax_dev); 117long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, 118 void **kaddr, pfn_t *pfn); 119size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 120 size_t bytes, struct iov_iter *i); 121void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); 122 123ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, 124 const struct iomap_ops *ops); 125int dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size, 126 pfn_t *pfnp, int *errp, const struct iomap_ops *ops); 127int dax_finish_sync_fault(struct vm_fault *vmf, enum page_entry_size pe_size, 128 pfn_t pfn); 129int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index); 130int dax_invalidate_mapping_entry_sync(struct address_space *mapping, 131 pgoff_t index); 132 133#ifdef CONFIG_FS_DAX 134int __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 138static 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 146static inline bool dax_mapping(struct address_space *mapping) 147{ 148 return mapping->host && IS_DAX(mapping->host); 149} 150 151#endif