diff options
Diffstat (limited to 'fs/xfs/xfs_linux.h')
-rw-r--r-- | fs/xfs/xfs_linux.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h new file mode 100644 index 000000000000..1e8a45e74c3e --- /dev/null +++ b/fs/xfs/xfs_linux.h | |||
@@ -0,0 +1,309 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2000-2005 Silicon Graphics, Inc. | ||
3 | * All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it would be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write the Free Software Foundation, | ||
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
17 | */ | ||
18 | #ifndef __XFS_LINUX__ | ||
19 | #define __XFS_LINUX__ | ||
20 | |||
21 | #include <linux/types.h> | ||
22 | |||
23 | /* | ||
24 | * XFS_BIG_BLKNOS needs block layer disk addresses to be 64 bits. | ||
25 | * XFS_BIG_INUMS requires XFS_BIG_BLKNOS to be set. | ||
26 | */ | ||
27 | #if defined(CONFIG_LBDAF) || (BITS_PER_LONG == 64) | ||
28 | # define XFS_BIG_BLKNOS 1 | ||
29 | # define XFS_BIG_INUMS 1 | ||
30 | #else | ||
31 | # define XFS_BIG_BLKNOS 0 | ||
32 | # define XFS_BIG_INUMS 0 | ||
33 | #endif | ||
34 | |||
35 | #include "xfs_types.h" | ||
36 | |||
37 | #include "kmem.h" | ||
38 | #include "mrlock.h" | ||
39 | #include "time.h" | ||
40 | #include "uuid.h" | ||
41 | |||
42 | #include <linux/semaphore.h> | ||
43 | #include <linux/mm.h> | ||
44 | #include <linux/kernel.h> | ||
45 | #include <linux/blkdev.h> | ||
46 | #include <linux/slab.h> | ||
47 | #include <linux/module.h> | ||
48 | #include <linux/mutex.h> | ||
49 | #include <linux/file.h> | ||
50 | #include <linux/swap.h> | ||
51 | #include <linux/errno.h> | ||
52 | #include <linux/sched.h> | ||
53 | #include <linux/bitops.h> | ||
54 | #include <linux/major.h> | ||
55 | #include <linux/pagemap.h> | ||
56 | #include <linux/vfs.h> | ||
57 | #include <linux/seq_file.h> | ||
58 | #include <linux/init.h> | ||
59 | #include <linux/list.h> | ||
60 | #include <linux/proc_fs.h> | ||
61 | #include <linux/sort.h> | ||
62 | #include <linux/cpu.h> | ||
63 | #include <linux/notifier.h> | ||
64 | #include <linux/delay.h> | ||
65 | #include <linux/log2.h> | ||
66 | #include <linux/spinlock.h> | ||
67 | #include <linux/random.h> | ||
68 | #include <linux/ctype.h> | ||
69 | #include <linux/writeback.h> | ||
70 | #include <linux/capability.h> | ||
71 | #include <linux/list_sort.h> | ||
72 | |||
73 | #include <asm/page.h> | ||
74 | #include <asm/div64.h> | ||
75 | #include <asm/param.h> | ||
76 | #include <asm/uaccess.h> | ||
77 | #include <asm/byteorder.h> | ||
78 | #include <asm/unaligned.h> | ||
79 | |||
80 | #include "xfs_vnode.h" | ||
81 | #include "xfs_stats.h" | ||
82 | #include "xfs_sysctl.h" | ||
83 | #include "xfs_iops.h" | ||
84 | #include "xfs_aops.h" | ||
85 | #include "xfs_super.h" | ||
86 | #include "xfs_buf.h" | ||
87 | #include "xfs_message.h" | ||
88 | |||
89 | #ifdef __BIG_ENDIAN | ||
90 | #define XFS_NATIVE_HOST 1 | ||
91 | #else | ||
92 | #undef XFS_NATIVE_HOST | ||
93 | #endif | ||
94 | |||
95 | /* | ||
96 | * Feature macros (disable/enable) | ||
97 | */ | ||
98 | #ifdef CONFIG_SMP | ||
99 | #define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ | ||
100 | #else | ||
101 | #undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ | ||
102 | #endif | ||
103 | |||
104 | #define irix_sgid_inherit xfs_params.sgid_inherit.val | ||
105 | #define irix_symlink_mode xfs_params.symlink_mode.val | ||
106 | #define xfs_panic_mask xfs_params.panic_mask.val | ||
107 | #define xfs_error_level xfs_params.error_level.val | ||
108 | #define xfs_syncd_centisecs xfs_params.syncd_timer.val | ||
109 | #define xfs_stats_clear xfs_params.stats_clear.val | ||
110 | #define xfs_inherit_sync xfs_params.inherit_sync.val | ||
111 | #define xfs_inherit_nodump xfs_params.inherit_nodump.val | ||
112 | #define xfs_inherit_noatime xfs_params.inherit_noatim.val | ||
113 | #define xfs_buf_timer_centisecs xfs_params.xfs_buf_timer.val | ||
114 | #define xfs_buf_age_centisecs xfs_params.xfs_buf_age.val | ||
115 | #define xfs_inherit_nosymlinks xfs_params.inherit_nosym.val | ||
116 | #define xfs_rotorstep xfs_params.rotorstep.val | ||
117 | #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val | ||
118 | #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val | ||
119 | |||
120 | #define current_cpu() (raw_smp_processor_id()) | ||
121 | #define current_pid() (current->pid) | ||
122 | #define current_test_flags(f) (current->flags & (f)) | ||
123 | #define current_set_flags_nested(sp, f) \ | ||
124 | (*(sp) = current->flags, current->flags |= (f)) | ||
125 | #define current_clear_flags_nested(sp, f) \ | ||
126 | (*(sp) = current->flags, current->flags &= ~(f)) | ||
127 | #define current_restore_flags_nested(sp, f) \ | ||
128 | (current->flags = ((current->flags & ~(f)) | (*(sp) & (f)))) | ||
129 | |||
130 | #define spinlock_destroy(lock) | ||
131 | |||
132 | #define NBBY 8 /* number of bits per byte */ | ||
133 | |||
134 | /* | ||
135 | * Size of block device i/o is parameterized here. | ||
136 | * Currently the system supports page-sized i/o. | ||
137 | */ | ||
138 | #define BLKDEV_IOSHIFT PAGE_CACHE_SHIFT | ||
139 | #define BLKDEV_IOSIZE (1<<BLKDEV_IOSHIFT) | ||
140 | /* number of BB's per block device block */ | ||
141 | #define BLKDEV_BB BTOBB(BLKDEV_IOSIZE) | ||
142 | |||
143 | #define ENOATTR ENODATA /* Attribute not found */ | ||
144 | #define EWRONGFS EINVAL /* Mount with wrong filesystem type */ | ||
145 | #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ | ||
146 | |||
147 | #define SYNCHRONIZE() barrier() | ||
148 | #define __return_address __builtin_return_address(0) | ||
149 | |||
150 | #define XFS_PROJID_DEFAULT 0 | ||
151 | #define MAXPATHLEN 1024 | ||
152 | |||
153 | #define MIN(a,b) (min(a,b)) | ||
154 | #define MAX(a,b) (max(a,b)) | ||
155 | #define howmany(x, y) (((x)+((y)-1))/(y)) | ||
156 | |||
157 | /* | ||
158 | * Various platform dependent calls that don't fit anywhere else | ||
159 | */ | ||
160 | #define xfs_sort(a,n,s,fn) sort(a,n,s,fn,NULL) | ||
161 | #define xfs_stack_trace() dump_stack() | ||
162 | |||
163 | |||
164 | /* Move the kernel do_div definition off to one side */ | ||
165 | |||
166 | #if defined __i386__ | ||
167 | /* For ia32 we need to pull some tricks to get past various versions | ||
168 | * of the compiler which do not like us using do_div in the middle | ||
169 | * of large functions. | ||
170 | */ | ||
171 | static inline __u32 xfs_do_div(void *a, __u32 b, int n) | ||
172 | { | ||
173 | __u32 mod; | ||
174 | |||
175 | switch (n) { | ||
176 | case 4: | ||
177 | mod = *(__u32 *)a % b; | ||
178 | *(__u32 *)a = *(__u32 *)a / b; | ||
179 | return mod; | ||
180 | case 8: | ||
181 | { | ||
182 | unsigned long __upper, __low, __high, __mod; | ||
183 | __u64 c = *(__u64 *)a; | ||
184 | __upper = __high = c >> 32; | ||
185 | __low = c; | ||
186 | if (__high) { | ||
187 | __upper = __high % (b); | ||
188 | __high = __high / (b); | ||
189 | } | ||
190 | asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (b), "0" (__low), "1" (__upper)); | ||
191 | asm("":"=A" (c):"a" (__low),"d" (__high)); | ||
192 | *(__u64 *)a = c; | ||
193 | return __mod; | ||
194 | } | ||
195 | } | ||
196 | |||
197 | /* NOTREACHED */ | ||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | /* Side effect free 64 bit mod operation */ | ||
202 | static inline __u32 xfs_do_mod(void *a, __u32 b, int n) | ||
203 | { | ||
204 | switch (n) { | ||
205 | case 4: | ||
206 | return *(__u32 *)a % b; | ||
207 | case 8: | ||
208 | { | ||
209 | unsigned long __upper, __low, __high, __mod; | ||
210 | __u64 c = *(__u64 *)a; | ||
211 | __upper = __high = c >> 32; | ||
212 | __low = c; | ||
213 | if (__high) { | ||
214 | __upper = __high % (b); | ||
215 | __high = __high / (b); | ||
216 | } | ||
217 | asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (b), "0" (__low), "1" (__upper)); | ||
218 | asm("":"=A" (c):"a" (__low),"d" (__high)); | ||
219 | return __mod; | ||
220 | } | ||
221 | } | ||
222 | |||
223 | /* NOTREACHED */ | ||
224 | return 0; | ||
225 | } | ||
226 | #else | ||
227 | static inline __u32 xfs_do_div(void *a, __u32 b, int n) | ||
228 | { | ||
229 | __u32 mod; | ||
230 | |||
231 | switch (n) { | ||
232 | case 4: | ||
233 | mod = *(__u32 *)a % b; | ||
234 | *(__u32 *)a = *(__u32 *)a / b; | ||
235 | return mod; | ||
236 | case 8: | ||
237 | mod = do_div(*(__u64 *)a, b); | ||
238 | return mod; | ||
239 | } | ||
240 | |||
241 | /* NOTREACHED */ | ||
242 | return 0; | ||
243 | } | ||
244 | |||
245 | /* Side effect free 64 bit mod operation */ | ||
246 | static inline __u32 xfs_do_mod(void *a, __u32 b, int n) | ||
247 | { | ||
248 | switch (n) { | ||
249 | case 4: | ||
250 | return *(__u32 *)a % b; | ||
251 | case 8: | ||
252 | { | ||
253 | __u64 c = *(__u64 *)a; | ||
254 | return do_div(c, b); | ||
255 | } | ||
256 | } | ||
257 | |||
258 | /* NOTREACHED */ | ||
259 | return 0; | ||
260 | } | ||
261 | #endif | ||
262 | |||
263 | #undef do_div | ||
264 | #define do_div(a, b) xfs_do_div(&(a), (b), sizeof(a)) | ||
265 | #define do_mod(a, b) xfs_do_mod(&(a), (b), sizeof(a)) | ||
266 | |||
267 | static inline __uint64_t roundup_64(__uint64_t x, __uint32_t y) | ||
268 | { | ||
269 | x += y - 1; | ||
270 | do_div(x, y); | ||
271 | return(x * y); | ||
272 | } | ||
273 | |||
274 | static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) | ||
275 | { | ||
276 | x += y - 1; | ||
277 | do_div(x, y); | ||
278 | return x; | ||
279 | } | ||
280 | |||
281 | /* ARM old ABI has some weird alignment/padding */ | ||
282 | #if defined(__arm__) && !defined(__ARM_EABI__) | ||
283 | #define __arch_pack __attribute__((packed)) | ||
284 | #else | ||
285 | #define __arch_pack | ||
286 | #endif | ||
287 | |||
288 | #define ASSERT_ALWAYS(expr) \ | ||
289 | (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) | ||
290 | |||
291 | #ifndef DEBUG | ||
292 | #define ASSERT(expr) ((void)0) | ||
293 | |||
294 | #ifndef STATIC | ||
295 | # define STATIC static noinline | ||
296 | #endif | ||
297 | |||
298 | #else /* DEBUG */ | ||
299 | |||
300 | #define ASSERT(expr) \ | ||
301 | (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) | ||
302 | |||
303 | #ifndef STATIC | ||
304 | # define STATIC noinline | ||
305 | #endif | ||
306 | |||
307 | #endif /* DEBUG */ | ||
308 | |||
309 | #endif /* __XFS_LINUX__ */ | ||