dax.h 5.0 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4 5 6
#ifndef _LINUX_DAX_H
#define _LINUX_DAX_H

#include <linux/fs.h>
#include <linux/mm.h>
7
#include <linux/radix-tree.h>
8 9
#include <asm/pgtable.h>

10
struct iomap_ops;
D
Dan Williams 已提交
11 12 13 14 15 16 17 18 19
struct dax_device;
struct dax_operations {
	/*
	 * direct_access: translate a device-relative
	 * logical-page-offset into an absolute physical pfn. Return the
	 * number of pages available for DAX at that pfn.
	 */
	long (*direct_access)(struct dax_device *, pgoff_t, long,
			void **, pfn_t *);
20
	/* copy_from_iter: required operation for fs-dax direct-i/o */
21 22
	size_t (*copy_from_iter)(struct dax_device *, pgoff_t, void *, size_t,
			struct iov_iter *);
23 24 25
	/* copy_to_iter: required operation for fs-dax direct-i/o */
	size_t (*copy_to_iter)(struct dax_device *, pgoff_t, void *, size_t,
			struct iov_iter *);
D
Dan Williams 已提交
26
};
27

28 29
extern struct attribute_group dax_attribute_group;

30 31
#if IS_ENABLED(CONFIG_DAX)
struct dax_device *dax_get_by_host(const char *host);
32 33
struct dax_device *alloc_dax(void *private, const char *host,
		const struct dax_operations *ops);
34
void put_dax(struct dax_device *dax_dev);
35 36 37
void kill_dax(struct dax_device *dax_dev);
void dax_write_cache(struct dax_device *dax_dev, bool wc);
bool dax_write_cache_enabled(struct dax_device *dax_dev);
38 39 40 41 42
#else
static inline struct dax_device *dax_get_by_host(const char *host)
{
	return NULL;
}
43 44 45 46 47 48 49 50 51
static inline struct dax_device *alloc_dax(void *private, const char *host,
		const struct dax_operations *ops)
{
	/*
	 * Callers should check IS_ENABLED(CONFIG_DAX) to know if this
	 * NULL is an error or expected.
	 */
	return NULL;
}
52 53 54
static inline void put_dax(struct dax_device *dax_dev)
{
}
55 56 57 58 59 60 61 62 63 64
static inline void kill_dax(struct dax_device *dax_dev)
{
}
static inline void dax_write_cache(struct dax_device *dax_dev, bool wc)
{
}
static inline bool dax_write_cache_enabled(struct dax_device *dax_dev)
{
	return false;
}
65 66
#endif

67
struct writeback_control;
68 69
int bdev_dax_pgoff(struct block_device *, sector_t, size_t, pgoff_t *pgoff);
#if IS_ENABLED(CONFIG_FS_DAX)
70 71
bool __bdev_dax_supported(struct block_device *bdev, int blocksize);
static inline bool bdev_dax_supported(struct block_device *bdev, int blocksize)
72
{
73
	return __bdev_dax_supported(bdev, blocksize);
74
}
75 76 77 78 79 80 81 82 83 84 85

static inline struct dax_device *fs_dax_get_by_host(const char *host)
{
	return dax_get_by_host(host);
}

static inline void fs_put_dax(struct dax_device *dax_dev)
{
	put_dax(dax_dev);
}

86
struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev);
87 88
int dax_writeback_mapping_range(struct address_space *mapping,
		struct block_device *bdev, struct writeback_control *wbc);
89 90

struct page *dax_layout_busy_page(struct address_space *mapping);
91 92
bool dax_lock_mapping_entry(struct page *page);
void dax_unlock_mapping_entry(struct page *page);
93
#else
94
static inline bool bdev_dax_supported(struct block_device *bdev,
95
		int blocksize)
96
{
97
	return false;
98 99
}

100
static inline struct dax_device *fs_dax_get_by_host(const char *host)
101 102 103 104
{
	return NULL;
}

105
static inline void fs_put_dax(struct dax_device *dax_dev)
106 107
{
}
108 109 110 111 112

static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev)
{
	return NULL;
}
113

114 115 116 117 118
static inline struct page *dax_layout_busy_page(struct address_space *mapping)
{
	return NULL;
}

119 120 121 122 123
static inline int dax_writeback_mapping_range(struct address_space *mapping,
		struct block_device *bdev, struct writeback_control *wbc)
{
	return -EOPNOTSUPP;
}
124 125 126 127 128 129 130 131 132 133 134

static inline bool dax_lock_mapping_entry(struct page *page)
{
	if (IS_DAX(page->mapping->host))
		return true;
	return false;
}

static inline void dax_unlock_mapping_entry(struct page *page)
{
}
135 136
#endif

137 138
int dax_read_lock(void);
void dax_read_unlock(int id);
D
Dan Williams 已提交
139 140
bool dax_alive(struct dax_device *dax_dev);
void *dax_get_private(struct dax_device *dax_dev);
141 142
long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
		void **kaddr, pfn_t *pfn);
143 144
size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
		size_t bytes, struct iov_iter *i);
145 146
size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
		size_t bytes, struct iov_iter *i);
147
void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
148

149
ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
150
		const struct iomap_ops *ops);
151
vm_fault_t dax_iomap_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
152
		    pfn_t *pfnp, int *errp, const struct iomap_ops *ops);
153 154
vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
		enum page_entry_size pe_size, pfn_t pfn);
J
Jan Kara 已提交
155
int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
156 157
int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
				      pgoff_t index);
158 159

#ifdef CONFIG_FS_DAX
160 161
int __dax_zero_page_range(struct block_device *bdev,
		struct dax_device *dax_dev, sector_t sector,
162
		unsigned int offset, unsigned int length);
163
#else
164
static inline int __dax_zero_page_range(struct block_device *bdev,
165 166
		struct dax_device *dax_dev, sector_t sector,
		unsigned int offset, unsigned int length)
167 168 169
{
	return -ENXIO;
}
170 171
#endif

172 173 174 175
static inline bool dax_mapping(struct address_space *mapping)
{
	return mapping->host && IS_DAX(mapping->host);
}
176

177
#endif