xref: /linux/fs/xfs/xfs_platform.h (revision 8457669db968c98edb781892d73fa559e1efcbd4)
1971ffb63SChristoph Hellwig // SPDX-License-Identifier: GPL-2.0
2971ffb63SChristoph Hellwig /*
3971ffb63SChristoph Hellwig  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4971ffb63SChristoph Hellwig  * All Rights Reserved.
5971ffb63SChristoph Hellwig  */
6971ffb63SChristoph Hellwig #ifndef _XFS_PLATFORM_H
7971ffb63SChristoph Hellwig #define _XFS_PLATFORM_H
8971ffb63SChristoph Hellwig 
9971ffb63SChristoph Hellwig #include <linux/types.h>
10971ffb63SChristoph Hellwig #include <linux/uuid.h>
11971ffb63SChristoph Hellwig #include <linux/semaphore.h>
12971ffb63SChristoph Hellwig #include <linux/mm.h>
13971ffb63SChristoph Hellwig #include <linux/sched/mm.h>
14971ffb63SChristoph Hellwig #include <linux/kernel.h>
15971ffb63SChristoph Hellwig #include <linux/blkdev.h>
16971ffb63SChristoph Hellwig #include <linux/slab.h>
17971ffb63SChristoph Hellwig #include <linux/vmalloc.h>
18971ffb63SChristoph Hellwig #include <linux/crc32c.h>
19971ffb63SChristoph Hellwig #include <linux/module.h>
20971ffb63SChristoph Hellwig #include <linux/mutex.h>
21971ffb63SChristoph Hellwig #include <linux/file.h>
22971ffb63SChristoph Hellwig #include <linux/filelock.h>
23971ffb63SChristoph Hellwig #include <linux/swap.h>
24971ffb63SChristoph Hellwig #include <linux/errno.h>
25971ffb63SChristoph Hellwig #include <linux/sched/signal.h>
26971ffb63SChristoph Hellwig #include <linux/bitops.h>
27971ffb63SChristoph Hellwig #include <linux/major.h>
28971ffb63SChristoph Hellwig #include <linux/pagemap.h>
29971ffb63SChristoph Hellwig #include <linux/vfs.h>
30971ffb63SChristoph Hellwig #include <linux/seq_file.h>
31971ffb63SChristoph Hellwig #include <linux/init.h>
32971ffb63SChristoph Hellwig #include <linux/list.h>
33971ffb63SChristoph Hellwig #include <linux/proc_fs.h>
34971ffb63SChristoph Hellwig #include <linux/sort.h>
35971ffb63SChristoph Hellwig #include <linux/cpu.h>
36971ffb63SChristoph Hellwig #include <linux/notifier.h>
37971ffb63SChristoph Hellwig #include <linux/delay.h>
38971ffb63SChristoph Hellwig #include <linux/log2.h>
39971ffb63SChristoph Hellwig #include <linux/rwsem.h>
40971ffb63SChristoph Hellwig #include <linux/spinlock.h>
41971ffb63SChristoph Hellwig #include <linux/random.h>
42971ffb63SChristoph Hellwig #include <linux/ctype.h>
43971ffb63SChristoph Hellwig #include <linux/writeback.h>
44971ffb63SChristoph Hellwig #include <linux/capability.h>
45971ffb63SChristoph Hellwig #include <linux/kthread.h>
46971ffb63SChristoph Hellwig #include <linux/freezer.h>
47971ffb63SChristoph Hellwig #include <linux/list_sort.h>
48971ffb63SChristoph Hellwig #include <linux/ratelimit.h>
49971ffb63SChristoph Hellwig #include <linux/rhashtable.h>
50971ffb63SChristoph Hellwig #include <linux/xattr.h>
51971ffb63SChristoph Hellwig #include <linux/mnt_idmapping.h>
52971ffb63SChristoph Hellwig #include <linux/debugfs.h>
53971ffb63SChristoph Hellwig #include <asm/page.h>
54971ffb63SChristoph Hellwig #include <asm/div64.h>
55971ffb63SChristoph Hellwig #include <asm/param.h>
56971ffb63SChristoph Hellwig #include <linux/uaccess.h>
57971ffb63SChristoph Hellwig #include <asm/byteorder.h>
58971ffb63SChristoph Hellwig #include <linux/unaligned.h>
59971ffb63SChristoph Hellwig 
6019a46f12SChristoph Hellwig #ifdef CONFIG_XFS_DEBUG
6119a46f12SChristoph Hellwig #define DEBUG 1
6219a46f12SChristoph Hellwig #endif
6319a46f12SChristoph Hellwig 
6419a46f12SChristoph Hellwig #ifdef CONFIG_XFS_DEBUG_EXPENSIVE
6519a46f12SChristoph Hellwig #define DEBUG_EXPENSIVE 1
6619a46f12SChristoph Hellwig #endif
6719a46f12SChristoph Hellwig 
6819a46f12SChristoph Hellwig #ifdef CONFIG_XFS_ASSERT_FATAL
6919a46f12SChristoph Hellwig #define XFS_ASSERT_FATAL 1
7019a46f12SChristoph Hellwig #endif
7119a46f12SChristoph Hellwig 
7219a46f12SChristoph Hellwig #ifdef CONFIG_XFS_WARN
7319a46f12SChristoph Hellwig #define XFS_WARN 1
7419a46f12SChristoph Hellwig #endif
7519a46f12SChristoph Hellwig 
76501a5161SChristoph Hellwig /*
77501a5161SChristoph Hellwig  * Kernel specific type declarations for XFS
78501a5161SChristoph Hellwig  */
79501a5161SChristoph Hellwig typedef __s64			xfs_off_t;	/* <file offset> type */
80501a5161SChristoph Hellwig typedef unsigned long long	xfs_ino_t;	/* <inode> type */
81501a5161SChristoph Hellwig typedef __s64			xfs_daddr_t;	/* <disk address> type */
82501a5161SChristoph Hellwig typedef __u32			xfs_dev_t;
83501a5161SChristoph Hellwig typedef __u32			xfs_nlink_t;
84501a5161SChristoph Hellwig 
85501a5161SChristoph Hellwig #include "xfs_types.h"
86971ffb63SChristoph Hellwig #include "xfs_fs.h"
87971ffb63SChristoph Hellwig #include "xfs_stats.h"
88971ffb63SChristoph Hellwig #include "xfs_sysctl.h"
89971ffb63SChristoph Hellwig #include "xfs_iops.h"
90971ffb63SChristoph Hellwig #include "xfs_aops.h"
91971ffb63SChristoph Hellwig #include "xfs_super.h"
92971ffb63SChristoph Hellwig #include "xfs_cksum.h"
93971ffb63SChristoph Hellwig #include "xfs_buf.h"
94971ffb63SChristoph Hellwig #include "xfs_message.h"
95971ffb63SChristoph Hellwig #include "xfs_drain.h"
96971ffb63SChristoph Hellwig #include "xfs_hooks.h"
97971ffb63SChristoph Hellwig 
98971ffb63SChristoph Hellwig #ifdef __BIG_ENDIAN
99971ffb63SChristoph Hellwig #define XFS_NATIVE_HOST 1
100971ffb63SChristoph Hellwig #else
101971ffb63SChristoph Hellwig #undef XFS_NATIVE_HOST
102971ffb63SChristoph Hellwig #endif
103971ffb63SChristoph Hellwig 
104971ffb63SChristoph Hellwig #define xfs_panic_mask		xfs_params.panic_mask.val
105971ffb63SChristoph Hellwig #define xfs_error_level		xfs_params.error_level.val
106971ffb63SChristoph Hellwig #define xfs_syncd_centisecs	xfs_params.syncd_timer.val
107971ffb63SChristoph Hellwig #define xfs_stats_clear		xfs_params.stats_clear.val
108971ffb63SChristoph Hellwig #define xfs_inherit_sync	xfs_params.inherit_sync.val
109971ffb63SChristoph Hellwig #define xfs_inherit_nodump	xfs_params.inherit_nodump.val
110971ffb63SChristoph Hellwig #define xfs_inherit_noatime	xfs_params.inherit_noatim.val
111971ffb63SChristoph Hellwig #define xfs_inherit_nosymlinks	xfs_params.inherit_nosym.val
112971ffb63SChristoph Hellwig #define xfs_rotorstep		xfs_params.rotorstep.val
113971ffb63SChristoph Hellwig #define xfs_inherit_nodefrag	xfs_params.inherit_nodfrg.val
114971ffb63SChristoph Hellwig #define xfs_fstrm_centisecs	xfs_params.fstrm_timer.val
115971ffb63SChristoph Hellwig #define xfs_blockgc_secs	xfs_params.blockgc_timer.val
116971ffb63SChristoph Hellwig 
117971ffb63SChristoph Hellwig #define current_cpu()		(raw_smp_processor_id())
118971ffb63SChristoph Hellwig #define current_set_flags_nested(sp, f)		\
119971ffb63SChristoph Hellwig 		(*(sp) = current->flags, current->flags |= (f))
120971ffb63SChristoph Hellwig #define current_restore_flags_nested(sp, f)	\
121971ffb63SChristoph Hellwig 		(current->flags = ((current->flags & ~(f)) | (*(sp) & (f))))
122971ffb63SChristoph Hellwig 
123971ffb63SChristoph Hellwig #define NBBY		8		/* number of bits per byte */
124971ffb63SChristoph Hellwig 
125971ffb63SChristoph Hellwig /*
126971ffb63SChristoph Hellwig  * Size of block device i/o is parameterized here.
127971ffb63SChristoph Hellwig  * Currently the system supports page-sized i/o.
128971ffb63SChristoph Hellwig  */
129971ffb63SChristoph Hellwig #define	BLKDEV_IOSHIFT		PAGE_SHIFT
130971ffb63SChristoph Hellwig #define	BLKDEV_IOSIZE		(1<<BLKDEV_IOSHIFT)
131971ffb63SChristoph Hellwig /* number of BB's per block device block */
132971ffb63SChristoph Hellwig #define	BLKDEV_BB		BTOBB(BLKDEV_IOSIZE)
133971ffb63SChristoph Hellwig 
134971ffb63SChristoph Hellwig #define ENOATTR		ENODATA		/* Attribute not found */
135971ffb63SChristoph Hellwig #define EWRONGFS	EINVAL		/* Mount with wrong filesystem type */
136971ffb63SChristoph Hellwig 
137971ffb63SChristoph Hellwig #define __return_address __builtin_return_address(0)
138971ffb63SChristoph Hellwig 
139971ffb63SChristoph Hellwig /*
140971ffb63SChristoph Hellwig  * Return the address of a label.  Use barrier() so that the optimizer
141971ffb63SChristoph Hellwig  * won't reorder code to refactor the error jumpouts into a single
142971ffb63SChristoph Hellwig  * return, which throws off the reported address.
143971ffb63SChristoph Hellwig  */
144971ffb63SChristoph Hellwig #define __this_address	({ __label__ __here; __here: barrier(); &&__here; })
145971ffb63SChristoph Hellwig 
146971ffb63SChristoph Hellwig #define howmany(x, y)	(((x)+((y)-1))/(y))
147971ffb63SChristoph Hellwig 
delay(long ticks)148971ffb63SChristoph Hellwig static inline void delay(long ticks)
149971ffb63SChristoph Hellwig {
150971ffb63SChristoph Hellwig 	schedule_timeout_uninterruptible(ticks);
151971ffb63SChristoph Hellwig }
152971ffb63SChristoph Hellwig 
153971ffb63SChristoph Hellwig /*
154971ffb63SChristoph Hellwig  * XFS wrapper structure for sysfs support. It depends on external data
155971ffb63SChristoph Hellwig  * structures and is embedded in various internal data structures to implement
156971ffb63SChristoph Hellwig  * the XFS sysfs object heirarchy. Define it here for broad access throughout
157971ffb63SChristoph Hellwig  * the codebase.
158971ffb63SChristoph Hellwig  */
159971ffb63SChristoph Hellwig struct xfs_kobj {
160971ffb63SChristoph Hellwig 	struct kobject		kobject;
161971ffb63SChristoph Hellwig 	struct completion	complete;
162971ffb63SChristoph Hellwig };
163971ffb63SChristoph Hellwig 
164971ffb63SChristoph Hellwig struct xstats {
165971ffb63SChristoph Hellwig 	struct xfsstats __percpu	*xs_stats;
166971ffb63SChristoph Hellwig 	struct xfs_kobj			xs_kobj;
167971ffb63SChristoph Hellwig };
168971ffb63SChristoph Hellwig 
169971ffb63SChristoph Hellwig extern struct xstats xfsstats;
170971ffb63SChristoph Hellwig 
xfs_to_linux_dev_t(xfs_dev_t dev)171971ffb63SChristoph Hellwig static inline dev_t xfs_to_linux_dev_t(xfs_dev_t dev)
172971ffb63SChristoph Hellwig {
173971ffb63SChristoph Hellwig 	return MKDEV(sysv_major(dev) & 0x1ff, sysv_minor(dev));
174971ffb63SChristoph Hellwig }
175971ffb63SChristoph Hellwig 
linux_to_xfs_dev_t(dev_t dev)176971ffb63SChristoph Hellwig static inline xfs_dev_t linux_to_xfs_dev_t(dev_t dev)
177971ffb63SChristoph Hellwig {
178971ffb63SChristoph Hellwig 	return sysv_encode_dev(dev);
179971ffb63SChristoph Hellwig }
180971ffb63SChristoph Hellwig 
181971ffb63SChristoph Hellwig /*
182971ffb63SChristoph Hellwig  * Various platform dependent calls that don't fit anywhere else
183971ffb63SChristoph Hellwig  */
184971ffb63SChristoph Hellwig #define xfs_sort(a,n,s,fn)	sort(a,n,s,fn,NULL)
185971ffb63SChristoph Hellwig #define xfs_stack_trace()	dump_stack()
186971ffb63SChristoph Hellwig 
rounddown_64(uint64_t x,uint32_t y)187971ffb63SChristoph Hellwig static inline uint64_t rounddown_64(uint64_t x, uint32_t y)
188971ffb63SChristoph Hellwig {
189971ffb63SChristoph Hellwig 	do_div(x, y);
190971ffb63SChristoph Hellwig 	return x * y;
191971ffb63SChristoph Hellwig }
192971ffb63SChristoph Hellwig 
roundup_64(uint64_t x,uint32_t y)193971ffb63SChristoph Hellwig static inline uint64_t roundup_64(uint64_t x, uint32_t y)
194971ffb63SChristoph Hellwig {
195971ffb63SChristoph Hellwig 	x += y - 1;
196971ffb63SChristoph Hellwig 	do_div(x, y);
197971ffb63SChristoph Hellwig 	return x * y;
198971ffb63SChristoph Hellwig }
199971ffb63SChristoph Hellwig 
howmany_64(uint64_t x,uint32_t y)200971ffb63SChristoph Hellwig static inline uint64_t howmany_64(uint64_t x, uint32_t y)
201971ffb63SChristoph Hellwig {
202971ffb63SChristoph Hellwig 	x += y - 1;
203971ffb63SChristoph Hellwig 	do_div(x, y);
204971ffb63SChristoph Hellwig 	return x;
205971ffb63SChristoph Hellwig }
206971ffb63SChristoph Hellwig 
isaligned_64(uint64_t x,uint32_t y)207971ffb63SChristoph Hellwig static inline bool isaligned_64(uint64_t x, uint32_t y)
208971ffb63SChristoph Hellwig {
209971ffb63SChristoph Hellwig 	return do_div(x, y) == 0;
210971ffb63SChristoph Hellwig }
211971ffb63SChristoph Hellwig 
212971ffb63SChristoph Hellwig /* If @b is a power of 2, return log2(b).  Else return -1. */
log2_if_power2(unsigned long b)213971ffb63SChristoph Hellwig static inline int8_t log2_if_power2(unsigned long b)
214971ffb63SChristoph Hellwig {
215971ffb63SChristoph Hellwig 	return is_power_of_2(b) ? ilog2(b) : -1;
216971ffb63SChristoph Hellwig }
217971ffb63SChristoph Hellwig 
218971ffb63SChristoph Hellwig /* If @b is a power of 2, return a mask of the lower bits, else return zero. */
mask64_if_power2(unsigned long b)219971ffb63SChristoph Hellwig static inline unsigned long long mask64_if_power2(unsigned long b)
220971ffb63SChristoph Hellwig {
221971ffb63SChristoph Hellwig 	return is_power_of_2(b) ? b - 1 : 0;
222971ffb63SChristoph Hellwig }
223971ffb63SChristoph Hellwig 
224971ffb63SChristoph Hellwig int xfs_rw_bdev(struct block_device *bdev, sector_t sector, unsigned int count,
225971ffb63SChristoph Hellwig 		char *data, enum req_op op);
226971ffb63SChristoph Hellwig 
227971ffb63SChristoph Hellwig #define ASSERT_ALWAYS(expr)	\
228971ffb63SChristoph Hellwig 	(likely(expr) ? (void)0 : assfail(NULL, #expr, __FILE__, __LINE__))
229971ffb63SChristoph Hellwig 
230971ffb63SChristoph Hellwig #ifdef DEBUG
231971ffb63SChristoph Hellwig #define ASSERT(expr)	\
232971ffb63SChristoph Hellwig 	(likely(expr) ? (void)0 : assfail(NULL, #expr, __FILE__, __LINE__))
233971ffb63SChristoph Hellwig 
234971ffb63SChristoph Hellwig #else	/* !DEBUG */
235971ffb63SChristoph Hellwig 
236971ffb63SChristoph Hellwig #ifdef XFS_WARN
237971ffb63SChristoph Hellwig 
238*9a654a8fSNirjhar Roy (IBM) /*
239*9a654a8fSNirjhar Roy (IBM)  * Please note that this ASSERT doesn't kill the kernel. It will if the kernel
240*9a654a8fSNirjhar Roy (IBM)  * has panic_on_warn set.
241*9a654a8fSNirjhar Roy (IBM)  */
242971ffb63SChristoph Hellwig #define ASSERT(expr)	\
243971ffb63SChristoph Hellwig 	(likely(expr) ? (void)0 : asswarn(NULL, #expr, __FILE__, __LINE__))
244971ffb63SChristoph Hellwig 
245971ffb63SChristoph Hellwig #else	/* !DEBUG && !XFS_WARN */
246971ffb63SChristoph Hellwig 
247971ffb63SChristoph Hellwig #define ASSERT(expr)		((void)0)
248971ffb63SChristoph Hellwig 
249971ffb63SChristoph Hellwig #endif /* XFS_WARN */
250971ffb63SChristoph Hellwig #endif /* DEBUG */
251971ffb63SChristoph Hellwig 
252*9a654a8fSNirjhar Roy (IBM) /*
253*9a654a8fSNirjhar Roy (IBM)  * Use this to catch metadata corruptions that are not caught by block or
254*9a654a8fSNirjhar Roy (IBM)  * structure verifiers. The reason is that the verifiers check corruptions only
255*9a654a8fSNirjhar Roy (IBM)  * within the scope of the object being verified.
256*9a654a8fSNirjhar Roy (IBM)  */
257971ffb63SChristoph Hellwig #define XFS_IS_CORRUPT(mp, expr)	\
258971ffb63SChristoph Hellwig 	(unlikely(expr) ? xfs_corruption_error(#expr, XFS_ERRLEVEL_LOW, (mp), \
259971ffb63SChristoph Hellwig 					       NULL, 0, __FILE__, __LINE__, \
260971ffb63SChristoph Hellwig 					       __this_address), \
261971ffb63SChristoph Hellwig 			  true : false)
262971ffb63SChristoph Hellwig 
263971ffb63SChristoph Hellwig #define STATIC static noinline
264971ffb63SChristoph Hellwig 
265971ffb63SChristoph Hellwig #ifdef CONFIG_XFS_RT
266971ffb63SChristoph Hellwig 
267971ffb63SChristoph Hellwig /*
268971ffb63SChristoph Hellwig  * make sure we ignore the inode flag if the filesystem doesn't have a
269971ffb63SChristoph Hellwig  * configured realtime device.
270971ffb63SChristoph Hellwig  */
271971ffb63SChristoph Hellwig #define XFS_IS_REALTIME_INODE(ip)			\
272971ffb63SChristoph Hellwig 	(((ip)->i_diflags & XFS_DIFLAG_REALTIME) &&	\
273971ffb63SChristoph Hellwig 	 (ip)->i_mount->m_rtdev_targp)
274971ffb63SChristoph Hellwig #define XFS_IS_REALTIME_MOUNT(mp) ((mp)->m_rtdev_targp ? 1 : 0)
275971ffb63SChristoph Hellwig #else
276971ffb63SChristoph Hellwig #define XFS_IS_REALTIME_INODE(ip) (0)
277971ffb63SChristoph Hellwig #define XFS_IS_REALTIME_MOUNT(mp) (0)
278971ffb63SChristoph Hellwig #endif
279971ffb63SChristoph Hellwig 
280971ffb63SChristoph Hellwig /*
281971ffb63SChristoph Hellwig  * Starting in Linux 4.15, the %p (raw pointer value) printk modifier
282971ffb63SChristoph Hellwig  * prints a hashed version of the pointer to avoid leaking kernel
283971ffb63SChristoph Hellwig  * pointers into dmesg.  If we're trying to debug the kernel we want the
284971ffb63SChristoph Hellwig  * raw values, so override this behavior as best we can.
285971ffb63SChristoph Hellwig  */
286971ffb63SChristoph Hellwig #ifdef DEBUG
287971ffb63SChristoph Hellwig # define PTR_FMT "%px"
288971ffb63SChristoph Hellwig #else
289971ffb63SChristoph Hellwig # define PTR_FMT "%p"
290971ffb63SChristoph Hellwig #endif
291971ffb63SChristoph Hellwig 
292971ffb63SChristoph Hellwig /*
293971ffb63SChristoph Hellwig  * Helper for IO routines to grab backing pages from allocated kernel memory.
294971ffb63SChristoph Hellwig  */
295971ffb63SChristoph Hellwig static inline struct page *
kmem_to_page(void * addr)296971ffb63SChristoph Hellwig kmem_to_page(void *addr)
297971ffb63SChristoph Hellwig {
298971ffb63SChristoph Hellwig 	if (is_vmalloc_addr(addr))
299971ffb63SChristoph Hellwig 		return vmalloc_to_page(addr);
300971ffb63SChristoph Hellwig 	return virt_to_page(addr);
301971ffb63SChristoph Hellwig }
302971ffb63SChristoph Hellwig 
303971ffb63SChristoph Hellwig #endif /* _XFS_PLATFORM_H */
304