1153323Srodrigc#ifndef __XFS_COMPAT_H__
2153323Srodrigc#define	__XFS_COMPAT_H__
3153323Srodrigc
4153323Srodrigc#include <sys/param.h>
5153323Srodrigc#include <sys/libkern.h>
6153323Srodrigc#include <sys/limits.h>
7153323Srodrigc#include <sys/uuid.h>
8153323Srodrigc#include <sys/conf.h>
9153323Srodrigc#include <sys/sbuf.h>
10153323Srodrigc#include <sys/stat.h>
11153323Srodrigc#include <sys/ioccom.h>
12153323Srodrigc#include <sys/fcntl.h>
13153323Srodrigc#include <sys/dirent.h>
14153323Srodrigc#include <sys/ktr.h>
15153323Srodrigc#include <sys/kdb.h>
16153323Srodrigc
17153323Srodrigc#ifdef _KERNEL
18153323Srodrigc#define __KERNEL__
19153323Srodrigc#endif
20153323Srodrigc
21153323Srodrigc#define printk printf
22153323Srodrigc
23153323Srodrigc#define MAJOR(x) major(x)
24153323Srodrigc#define MINOR(x) minor(x)
25153323Srodrigc
26153323Srodrigc/*
27153323Srodrigc * SYSV compatibility types missing in FreeBSD.
28153323Srodrigc */
29153323Srodrigctypedef unsigned long		ulong;
30153323Srodrigctypedef unsigned int		uint;
31153323Srodrigctypedef unsigned short		ushort;
32153323Srodrigc
33153323Srodrigc/*
34153323Srodrigc * Additional type declarations for XFS.
35153323Srodrigc */
36153323Srodrigctypedef signed char		__s8;
37153323Srodrigctypedef unsigned char		__u8;
38153323Srodrigctypedef signed short int	__s16;
39153323Srodrigctypedef unsigned short int	__u16;
40153323Srodrigctypedef signed int		__s32;
41153323Srodrigctypedef unsigned int		__u32;
42153323Srodrigctypedef signed long long int	__s64;
43153323Srodrigctypedef unsigned long long int	__u64;
44153323Srodrigc
45159451Srodrigc/* linus now has sparse which expects big endian or little endian */
46159451Srodrigctypedef __u16 __be16;
47159451Srodrigctypedef __u32 __be32;
48159451Srodrigctypedef __u64 __be64;
49159451Srodrigc
50153323Srodrigc/*
51153323Srodrigc * Linux types with direct FreeBSD conterparts
52153323Srodrigc */
53153323Srodrigctypedef off_t			loff_t;
54153323Srodrigctypedef struct timespec		timespec_t;
55153323Srodrigctypedef	struct uuid		uuid_t;
56153323Srodrigctypedef struct fid		fid_t;
57153323Srodrigctypedef dev_t			os_dev_t;
58153323Srodrigc
59153323Srodrigc/*
60153323Srodrigc *  Linux block devices are device vnodes in FreeBSD.
61153323Srodrigc */
62153323Srodrigc#define	block_device		vnode
63153323Srodrigc
64153323Srodrigc/*
65153323Srodrigc *  Get the current CPU ID.
66153323Srodrigc */
67153323Srodrigc#define	smp_processor_id()	PCPU_GET(cpuid)
68153323Srodrigc
69153323Srodrigc/*
70153323Srodrigc * FreeBSD does not have BITS_PER_LONG defined.
71153323Srodrigc */
72153323Srodrigc#if defined(LONG_BIT)
73153323Srodrigc#define	BITS_PER_LONG		LONG_BIT
74153323Srodrigc#elif defined(__i386__)
75153323Srodrigc#define	BITS_PER_LONG		32
76153323Srodrigc#endif
77153323Srodrigc
78159451Srodrigc#define rol32(x, y)	(((x)<<(y))|((x)>>(32-(y))))
79153323Srodrigc/*
80153323Srodrigc * boolean_t is enum on Linux, int on FreeBSD.
81153323Srodrigc * Provide value defines.
82153323Srodrigc */
83153323Srodrigc#define	B_FALSE			0
84153323Srodrigc#define	B_TRUE			1
85153323Srodrigc
86153323Srodrigc/*
87153323Srodrigc * GCC 3.x static branch prediction hints
88153323Srodrigc */
89153323Srodrigc#if __GNUC__ < 3
90153323Srodrigc#define __builtin_expect(x, expected_value) (x)
91153323Srodrigc#endif
92153323Srodrigc
93153323Srodrigc#ifndef likely
94153323Srodrigc#define	likely(x)	__builtin_expect((x), 1)
95153323Srodrigc#endif
96153323Srodrigc
97153323Srodrigc#ifndef unlikely
98153323Srodrigc#define	unlikely(x)	__builtin_expect((x), 0)
99153323Srodrigc#endif
100153323Srodrigc
101153323Srodrigc/*
102153323Srodrigc * ANSI and GCC extension keywords compatibity
103153323Srodrigc */
104153323Srodrigc#ifndef inline
105153323Srodrigc#define	inline __inline__
106153323Srodrigc#endif
107153323Srodrigc
108153323Srodrigc#ifndef asm
109153323Srodrigc#define	asm __asm
110153323Srodrigc#endif
111153323Srodrigc
112153323Srodrigc#ifndef typeof
113153323Srodrigc#define	typeof __typeof
114153323Srodrigc#endif
115153323Srodrigc
116153323Srodrigc/*
117153323Srodrigc * Miscellaneous limit constants
118153323Srodrigc */
119153323Srodrigc#define	MAX_LFS_FILESIZE	0x7fffffffffffffffLL
120153323Srodrigc
121153323Srodrigc/*
122153323Srodrigc * Map simple functions to their FreeBSD kernel equivalents
123153323Srodrigc */
124153323Srodrigc#ifndef copy_to_user
125153323Srodrigc#define	copy_to_user(dst, src, len)	copyout((src), (dst), (len))
126153323Srodrigc#endif
127153323Srodrigc
128153323Srodrigc#ifndef copy_from_user
129153323Srodrigc#define	copy_from_user(dst, src, len)	copyin((src), (dst), (len))
130153323Srodrigc#endif
131153323Srodrigc
132153323Srodrigc/*
133153323Srodrigc * Map simple global vairables to FreeBSD kernel equivalents
134153323Srodrigc */
135153323Srodrigc#if !defined(xfs_physmem)
136153323Srodrigc#define	xfs_physmem	physmem
137153323Srodrigc#endif
138153323Srodrigc
139153323Srodrigc#ifndef HZ
140153323Srodrigc#define	HZ		hz
141153323Srodrigc#endif
142153323Srodrigc
143153323Srodrigc/*
144153323Srodrigc * These should be implemented properly for all architectures
145153323Srodrigc * we want to support.
146153323Srodrigc */
147153323Srodrigc#define	get_unaligned(ptr)	(*(ptr))
148153323Srodrigc#define	put_unaligned(val, ptr)	((void)( *(ptr) = (val) ))
149153323Srodrigc
150153323Srodrigc/*
151153323Srodrigc * Linux type-safe min/max macros.
152153323Srodrigc */
153153323Srodrigc#define	min_t(type,x,y)		MIN((x),(y))
154153323Srodrigc#define	max_t(type,x,y)		MAX((x),(y))
155153323Srodrigc
156153323Srodrigc
157159451Srodrigctypedef struct mtx xfs_mutex_t;
158153323Srodrigc/*
159153323Srodrigc * Cedentials manipulation.
160153323Srodrigc */
161153323Srodrigc#define current_fsuid(credp)	(credp)->cr_uid
162153323Srodrigc#define current_fsgid(credp)	(credp)->cr_groups[0]
163153323Srodrigc
164159451Srodrigc#define PAGE_CACHE_SIZE PAGE_SIZE
165159451Srodrigc
166159451Srodrigc#define IS_ERR(err) (err)
167159451Srodrigc
168159451Srodrigcstatic inline unsigned long ffz(unsigned long val)
169159451Srodrigc{
170159451Srodrigc        return ffsl(~val);
171159451Srodrigc}
172159451Srodrigc
173153323Srodrigc#endif /* __XFS_COMPAT_H__ */
174