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