text: #ifndef _LINUX_TYPES_H
  #define _LINUX_TYPES_H
  
  #include <asm/types.h>
  
  #ifndef __ASSEMBLY__
  #ifdef	__KERNEL__
  
  #define DECLARE_BITMAP(name,bits) \
  	unsigned long name[BITS_TO_LONGS(bits)]
  #else
  #ifndef __EXPORTED_HEADERS__
  #warning "Attempt to use kernel headers from user space, see http://kernelnewbies.org/KernelHeaders"
  #endif /* __EXPORTED_HEADERS__ */
  #endif
  
  #include <linux/posix_types.h>
  
  #ifdef __KERNEL__
  
  typedef __u32 __kernel_dev_t;
  
  typedef __kernel_fd_set		fd_set;
  typedef __kernel_dev_t		dev_t;
  typedef __kernel_ino_t		ino_t;
  typedef __kernel_mode_t		mode_t;
  typedef __kernel_nlink_t	nlink_t;
  typedef __kernel_off_t		off_t;
  typedef __kernel_pid_t		pid_t;
  typedef __kernel_daddr_t	daddr_t;
  typedef __kernel_key_t		key_t;
  typedef __kernel_suseconds_t	suseconds_t;
  typedef __kernel_timer_t	timer_t;
  typedef __kernel_clockid_t	clockid_t;
  typedef __kernel_mqd_t		mqd_t;
  
  typedef _Bool			bool;
  
  typedef __kernel_uid32_t	uid_t;
  typedef __kernel_gid32_t	gid_t;
  typedef __kernel_uid16_t        uid16_t;
  typedef __kernel_gid16_t        gid16_t;
  
  typedef unsigned long		uintptr_t;
  
  #ifdef CONFIG_UID16
  /* This is defined by include/asm-{arch}/posix_types.h */
  typedef __kernel_old_uid_t	old_uid_t;
  typedef __kernel_old_gid_t	old_gid_t;
  #endif /* CONFIG_UID16 */
  
  #if defined(__GNUC__)
  typedef __kernel_loff_t		loff_t;
  #endif
  
  /*
   * The following typedefs are also protected by individual ifdefs for
   * historical reasons:
   */
  #ifndef _SIZE_T
  #define _SIZE_T
  typedef __kernel_size_t		size_t;
  #endif
  
  #ifndef _SSIZE_T
  #define _SSIZE_T
  typedef __kernel_ssize_t	ssize_t;
  #endif
  
  #ifndef _PTRDIFF_T
  #define _PTRDIFF_T
  typedef __kernel_ptrdiff_t	ptrdiff_t;
  #endif
  
  #ifndef _TIME_T
  #define _TIME_T
  typedef __kernel_time_t		time_t;
  #endif
  
  #ifndef _CLOCK_T
  #define _CLOCK_T
  typedef __kernel_clock_t	clock_t;
  #endif
  
  #ifndef _CADDR_T
  #define _CADDR_T
  typedef __kernel_caddr_t	caddr_t;
  #endif
  
  /* bsd */
  typedef unsigned char		u_char;
  typedef unsigned short		u_short;
  typedef unsigned int		u_int;
  typedef unsigned long		u_long;
  
  /* sysv */
  typedef unsigned char		unchar;
  typedef unsigned short		ushort;
  typedef unsigned int		uint;
  typedef unsigned long		ulong;
  
  #ifndef __BIT_TYPES_DEFINED__
  #define __BIT_TYPES_DEFINED__
  
  typedef		__u8		u_int8_t;
  typedef		__s8		int8_t;
  typedef		__u16		u_int16_t;
  typedef		__s16		int16_t;
  typedef		__u32		u_int32_t;
  typedef		__s32		int32_t;
  
  #endif /* !(__BIT_TYPES_DEFINED__) */
  
  typedef		__u8		uint8_t;
  typedef		__u16		uint16_t;
  typedef		__u32		uint32_t;
  
  #if defined(__GNUC__)
  typedef		__u64		uint64_t;
  typedef		__u64		u_int64_t;
  typedef		__s64		int64_t;
  #endif
  
  /*
   * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid
   * common 32/64-bit compat problems.
   * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other
   * architectures) and to 8-byte boundaries on 64-bit architetures.  The new
   * aligned_64 type enforces 8-byte alignment so that structs containing
   * aligned_64 values have the same alignment on 32-bit and 64-bit architectures.
   * No conversions are necessary between 32-bit user-space and a 64-bit kernel.
   */
  #define aligned_u64 __u64 __attribute__((aligned(8)))
  #define aligned_be64 __be64 __attribute__((aligned(8)))
  #define aligned_le64 __le64 __attribute__((aligned(8)))
  
  /**
   * The type used for indexing onto a disc or disc partition.
   *
   * Linux always considers sectors to be 512 bytes long independently
   * of the devices real block size.
   *
   * blkcnt_t is the type of the inode's block count.
   */
  #ifdef CONFIG_LBDAF
  typedef u64 sector_t;
  typedef u64 blkcnt_t;
  #else
  typedef unsigned long sector_t;
  typedef unsigned long blkcnt_t;
  #endif
  
  /*
   * The type of an index into the pagecache.  Use a #define so asm/types.h
   * can override it.
   */
  #ifndef pgoff_t
  #define pgoff_t unsigned long
  #endif
  
  #endif /* __KERNEL__ */
  
  /*
   * Below are truly Linux-specific types that should never collide with
   * any application/library that wants linux/types.h.
   */
  
  #ifdef __CHECKER__
  #define __bitwise__ __attribute__((bitwise))
  #else
  #define __bitwise__
  #endif
  #ifdef __CHECK_ENDIAN__
  #define __bitwise __bitwise__
  #else
  #define __bitwise
  #endif
  
  typedef __u16 __bitwise __le16;
  typedef __u16 __bitwise __be16;
  typedef __u32 __bitwise __le32;
  typedef __u32 __bitwise __be32;
  typedef __u64 __bitwise __le64;
  typedef __u64 __bitwise __be64;
  
  typedef __u16 __bitwise __sum16;
  typedef __u32 __bitwise __wsum;
  
  /* this is a special 64bit data type that is 8-byte aligned */
  #define __aligned_u64 __u64 __attribute__((aligned(8)))
  #define __aligned_be64 __be64 __attribute__((aligned(8)))
  #define __aligned_le64 __le64 __attribute__((aligned(8)))
  
  #ifdef __KERNEL__
  typedef unsigned __bitwise__ gfp_t;
  typedef unsigned __bitwise__ fmode_t;
  
  #ifdef CONFIG_PHYS_ADDR_T_64BIT
  typedef u64 phys_addr_t;
  #else
  typedef u32 phys_addr_t;
  #endif
  
  typedef phys_addr_t resource_size_t;
  
  typedef struct {
  	int counter;
  } atomic_t;
  
  #ifdef CONFIG_64BIT
  typedef struct {
  	long counter;
  } atomic64_t;
  #endif
  
  struct list_head {
  	struct list_head *next, *prev;
  };
  
  struct hlist_head {
  	struct hlist_node *first;
  };
  
  struct hlist_node {
  	struct hlist_node *next, **pprev;
  };
  
  struct ustat {
  	__kernel_daddr_t	f_tfree;
  	__kernel_ino_t		f_tinode;
  	char			f_fname[6];
  	char			f_fpack[6];
  };
  
  #endif	/* __KERNEL__ */
  #endif /*  __ASSEMBLY__ */
  #endif /* _LINUX_TYPES_H */
  