linux/fs/xfs/xfs_linux.h
<<
>>
Prefs
   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 * Kernel specific type declarations for XFS
  25 */
  26typedef signed char             __int8_t;
  27typedef unsigned char           __uint8_t;
  28typedef signed short int        __int16_t;
  29typedef unsigned short int      __uint16_t;
  30typedef signed int              __int32_t;
  31typedef unsigned int            __uint32_t;
  32typedef signed long long int    __int64_t;
  33typedef unsigned long long int  __uint64_t;
  34
  35typedef __uint32_t              inst_t;         /* an instruction */
  36
  37typedef __s64                   xfs_off_t;      /* <file offset> type */
  38typedef unsigned long long      xfs_ino_t;      /* <inode> type */
  39typedef __s64                   xfs_daddr_t;    /* <disk address> type */
  40typedef char *                  xfs_caddr_t;    /* <core address> type */
  41typedef __u32                   xfs_dev_t;
  42typedef __u32                   xfs_nlink_t;
  43
  44/* __psint_t is the same size as a pointer */
  45#if (BITS_PER_LONG == 32)
  46typedef __int32_t __psint_t;
  47typedef __uint32_t __psunsigned_t;
  48#elif (BITS_PER_LONG == 64)
  49typedef __int64_t __psint_t;
  50typedef __uint64_t __psunsigned_t;
  51#else
  52#error BITS_PER_LONG must be 32 or 64
  53#endif
  54
  55#include "xfs_types.h"
  56
  57#include "kmem.h"
  58#include "mrlock.h"
  59#include "uuid.h"
  60
  61#include <linux/semaphore.h>
  62#include <linux/mm.h>
  63#include <linux/kernel.h>
  64#include <linux/blkdev.h>
  65#include <linux/slab.h>
  66#include <linux/crc32c.h>
  67#include <linux/module.h>
  68#include <linux/mutex.h>
  69#include <linux/file.h>
  70#include <linux/swap.h>
  71#include <linux/errno.h>
  72#include <linux/sched.h>
  73#include <linux/bitops.h>
  74#include <linux/major.h>
  75#include <linux/pagemap.h>
  76#include <linux/vfs.h>
  77#include <linux/seq_file.h>
  78#include <linux/init.h>
  79#include <linux/list.h>
  80#include <linux/proc_fs.h>
  81#include <linux/sort.h>
  82#include <linux/cpu.h>
  83#include <linux/notifier.h>
  84#include <linux/delay.h>
  85#include <linux/log2.h>
  86#include <linux/spinlock.h>
  87#include <linux/random.h>
  88#include <linux/ctype.h>
  89#include <linux/writeback.h>
  90#include <linux/capability.h>
  91#include <linux/kthread.h>
  92#include <linux/freezer.h>
  93#include <linux/list_sort.h>
  94#include <linux/ratelimit.h>
  95
  96#include <asm/page.h>
  97#include <asm/div64.h>
  98#include <asm/param.h>
  99#include <asm/uaccess.h>
 100#include <asm/byteorder.h>
 101#include <asm/unaligned.h>
 102
 103#include "xfs_fs.h"
 104#include "xfs_stats.h"
 105#include "xfs_sysctl.h"
 106#include "xfs_iops.h"
 107#include "xfs_aops.h"
 108#include "xfs_super.h"
 109#include "xfs_cksum.h"
 110#include "xfs_buf.h"
 111#include "xfs_message.h"
 112
 113#ifdef __BIG_ENDIAN
 114#define XFS_NATIVE_HOST 1
 115#else
 116#undef XFS_NATIVE_HOST
 117#endif
 118
 119/*
 120 * Feature macros (disable/enable)
 121 */
 122#ifdef CONFIG_SMP
 123#define HAVE_PERCPU_SB  /* per cpu superblock counters are a 2.6 feature */
 124#else
 125#undef  HAVE_PERCPU_SB  /* per cpu superblock counters are a 2.6 feature */
 126#endif
 127
 128#define irix_sgid_inherit       xfs_params.sgid_inherit.val
 129#define irix_symlink_mode       xfs_params.symlink_mode.val
 130#define xfs_panic_mask          xfs_params.panic_mask.val
 131#define xfs_error_level         xfs_params.error_level.val
 132#define xfs_syncd_centisecs     xfs_params.syncd_timer.val
 133#define xfs_stats_clear         xfs_params.stats_clear.val
 134#define xfs_inherit_sync        xfs_params.inherit_sync.val
 135#define xfs_inherit_nodump      xfs_params.inherit_nodump.val
 136#define xfs_inherit_noatime     xfs_params.inherit_noatim.val
 137#define xfs_inherit_nosymlinks  xfs_params.inherit_nosym.val
 138#define xfs_rotorstep           xfs_params.rotorstep.val
 139#define xfs_inherit_nodefrag    xfs_params.inherit_nodfrg.val
 140#define xfs_fstrm_centisecs     xfs_params.fstrm_timer.val
 141#define xfs_eofb_secs           xfs_params.eofb_timer.val
 142
 143#define current_cpu()           (raw_smp_processor_id())
 144#define current_pid()           (current->pid)
 145#define current_test_flags(f)   (current->flags & (f))
 146#define current_set_flags_nested(sp, f)         \
 147                (*(sp) = current->flags, current->flags |= (f))
 148#define current_clear_flags_nested(sp, f)       \
 149                (*(sp) = current->flags, current->flags &= ~(f))
 150#define current_restore_flags_nested(sp, f)     \
 151                (current->flags = ((current->flags & ~(f)) | (*(sp) & (f))))
 152
 153#define spinlock_destroy(lock)
 154
 155#define NBBY            8               /* number of bits per byte */
 156
 157/*
 158 * Size of block device i/o is parameterized here.
 159 * Currently the system supports page-sized i/o.
 160 */
 161#define BLKDEV_IOSHIFT          PAGE_CACHE_SHIFT
 162#define BLKDEV_IOSIZE           (1<<BLKDEV_IOSHIFT)
 163/* number of BB's per block device block */
 164#define BLKDEV_BB               BTOBB(BLKDEV_IOSIZE)
 165
 166#define ENOATTR         ENODATA         /* Attribute not found */
 167#define EWRONGFS        EINVAL          /* Mount with wrong filesystem type */
 168#define EFSCORRUPTED    EUCLEAN         /* Filesystem is corrupted */
 169#define EFSBADCRC       EBADMSG         /* Bad CRC detected */
 170
 171#define SYNCHRONIZE()   barrier()
 172#define __return_address __builtin_return_address(0)
 173
 174#define XFS_PROJID_DEFAULT      0
 175#define MAXPATHLEN      1024
 176
 177#define MIN(a,b)        (min(a,b))
 178#define MAX(a,b)        (max(a,b))
 179#define howmany(x, y)   (((x)+((y)-1))/(y))
 180
 181static inline void delay(long ticks)
 182{
 183        schedule_timeout_uninterruptible(ticks);
 184}
 185
 186/*
 187 * XFS wrapper structure for sysfs support. It depends on external data
 188 * structures and is embedded in various internal data structures to implement
 189 * the XFS sysfs object heirarchy. Define it here for broad access throughout
 190 * the codebase.
 191 */
 192struct xfs_kobj {
 193        struct kobject          kobject;
 194        struct completion       complete;
 195};
 196
 197/* Kernel uid/gid conversion. These are used to convert to/from the on disk
 198 * uid_t/gid_t types to the kuid_t/kgid_t types that the kernel uses internally.
 199 * The conversion here is type only, the value will remain the same since we
 200 * are converting to the init_user_ns. The uid is later mapped to a particular
 201 * user namespace value when crossing the kernel/user boundary.
 202 */
 203static inline __uint32_t xfs_kuid_to_uid(kuid_t uid)
 204{
 205        return from_kuid(&init_user_ns, uid);
 206}
 207
 208static inline kuid_t xfs_uid_to_kuid(__uint32_t uid)
 209{
 210        return make_kuid(&init_user_ns, uid);
 211}
 212
 213static inline __uint32_t xfs_kgid_to_gid(kgid_t gid)
 214{
 215        return from_kgid(&init_user_ns, gid);
 216}
 217
 218static inline kgid_t xfs_gid_to_kgid(__uint32_t gid)
 219{
 220        return make_kgid(&init_user_ns, gid);
 221}
 222
 223/*
 224 * Various platform dependent calls that don't fit anywhere else
 225 */
 226#define xfs_sort(a,n,s,fn)      sort(a,n,s,fn,NULL)
 227#define xfs_stack_trace()       dump_stack()
 228
 229
 230/* Move the kernel do_div definition off to one side */
 231
 232#if defined __i386__
 233/* For ia32 we need to pull some tricks to get past various versions
 234 * of the compiler which do not like us using do_div in the middle
 235 * of large functions.
 236 */
 237static inline __u32 xfs_do_div(void *a, __u32 b, int n)
 238{
 239        __u32   mod;
 240
 241        switch (n) {
 242                case 4:
 243                        mod = *(__u32 *)a % b;
 244                        *(__u32 *)a = *(__u32 *)a / b;
 245                        return mod;
 246                case 8:
 247                        {
 248                        unsigned long __upper, __low, __high, __mod;
 249                        __u64   c = *(__u64 *)a;
 250                        __upper = __high = c >> 32;
 251                        __low = c;
 252                        if (__high) {
 253                                __upper = __high % (b);
 254                                __high = __high / (b);
 255                        }
 256                        asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (b), "0" (__low), "1" (__upper));
 257                        asm("":"=A" (c):"a" (__low),"d" (__high));
 258                        *(__u64 *)a = c;
 259                        return __mod;
 260                        }
 261        }
 262
 263        /* NOTREACHED */
 264        return 0;
 265}
 266
 267/* Side effect free 64 bit mod operation */
 268static inline __u32 xfs_do_mod(void *a, __u32 b, int n)
 269{
 270        switch (n) {
 271                case 4:
 272                        return *(__u32 *)a % b;
 273                case 8:
 274                        {
 275                        unsigned long __upper, __low, __high, __mod;
 276                        __u64   c = *(__u64 *)a;
 277                        __upper = __high = c >> 32;
 278                        __low = c;
 279                        if (__high) {
 280                                __upper = __high % (b);
 281                                __high = __high / (b);
 282                        }
 283                        asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (b), "0" (__low), "1" (__upper));
 284                        asm("":"=A" (c):"a" (__low),"d" (__high));
 285                        return __mod;
 286                        }
 287        }
 288
 289        /* NOTREACHED */
 290        return 0;
 291}
 292#else
 293static inline __u32 xfs_do_div(void *a, __u32 b, int n)
 294{
 295        __u32   mod;
 296
 297        switch (n) {
 298                case 4:
 299                        mod = *(__u32 *)a % b;
 300                        *(__u32 *)a = *(__u32 *)a / b;
 301                        return mod;
 302                case 8:
 303                        mod = do_div(*(__u64 *)a, b);
 304                        return mod;
 305        }
 306
 307        /* NOTREACHED */
 308        return 0;
 309}
 310
 311/* Side effect free 64 bit mod operation */
 312static inline __u32 xfs_do_mod(void *a, __u32 b, int n)
 313{
 314        switch (n) {
 315                case 4:
 316                        return *(__u32 *)a % b;
 317                case 8:
 318                        {
 319                        __u64   c = *(__u64 *)a;
 320                        return do_div(c, b);
 321                        }
 322        }
 323
 324        /* NOTREACHED */
 325        return 0;
 326}
 327#endif
 328
 329#undef do_div
 330#define do_div(a, b)    xfs_do_div(&(a), (b), sizeof(a))
 331#define do_mod(a, b)    xfs_do_mod(&(a), (b), sizeof(a))
 332
 333static inline __uint64_t roundup_64(__uint64_t x, __uint32_t y)
 334{
 335        x += y - 1;
 336        do_div(x, y);
 337        return x * y;
 338}
 339
 340static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y)
 341{
 342        x += y - 1;
 343        do_div(x, y);
 344        return x;
 345}
 346
 347/* ARM old ABI has some weird alignment/padding */
 348#if defined(__arm__) && !defined(__ARM_EABI__)
 349#define __arch_pack __attribute__((packed))
 350#else
 351#define __arch_pack
 352#endif
 353
 354#define ASSERT_ALWAYS(expr)     \
 355        (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
 356
 357#ifdef DEBUG
 358#define ASSERT(expr)    \
 359        (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
 360
 361#ifndef STATIC
 362# define STATIC noinline
 363#endif
 364
 365#else   /* !DEBUG */
 366
 367#ifdef XFS_WARN
 368
 369#define ASSERT(expr)    \
 370        (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__))
 371
 372#ifndef STATIC
 373# define STATIC static noinline
 374#endif
 375
 376#else   /* !DEBUG && !XFS_WARN */
 377
 378#define ASSERT(expr)    ((void)0)
 379
 380#ifndef STATIC
 381# define STATIC static noinline
 382#endif
 383
 384#endif /* XFS_WARN */
 385#endif /* DEBUG */
 386
 387#endif /* __XFS_LINUX__ */
 388