linux/fs/xfs/xfs_inode.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2003,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_INODE_H__
  19#define __XFS_INODE_H__
  20
  21struct xfs_dinode;
  22struct xfs_dinode_core;
  23
  24
  25/*
  26 * Fork identifiers.
  27 */
  28#define XFS_DATA_FORK   0
  29#define XFS_ATTR_FORK   1
  30
  31/*
  32 * The following xfs_ext_irec_t struct introduces a second (top) level
  33 * to the in-core extent allocation scheme. These structs are allocated
  34 * in a contiguous block, creating an indirection array where each entry
  35 * (irec) contains a pointer to a buffer of in-core extent records which
  36 * it manages. Each extent buffer is 4k in size, since 4k is the system
  37 * page size on Linux i386 and systems with larger page sizes don't seem
  38 * to gain much, if anything, by using their native page size as the
  39 * extent buffer size. Also, using 4k extent buffers everywhere provides
  40 * a consistent interface for CXFS across different platforms.
  41 *
  42 * There is currently no limit on the number of irec's (extent lists)
  43 * allowed, so heavily fragmented files may require an indirection array
  44 * which spans multiple system pages of memory. The number of extents
  45 * which would require this amount of contiguous memory is very large
  46 * and should not cause problems in the foreseeable future. However,
  47 * if the memory needed for the contiguous array ever becomes a problem,
  48 * it is possible that a third level of indirection may be required.
  49 */
  50typedef struct xfs_ext_irec {
  51        xfs_bmbt_rec_host_t *er_extbuf; /* block of extent records */
  52        xfs_extnum_t    er_extoff;      /* extent offset in file */
  53        xfs_extnum_t    er_extcount;    /* number of extents in page/block */
  54} xfs_ext_irec_t;
  55
  56/*
  57 * File incore extent information, present for each of data & attr forks.
  58 */
  59#define XFS_IEXT_BUFSZ          4096
  60#define XFS_LINEAR_EXTS         (XFS_IEXT_BUFSZ / (uint)sizeof(xfs_bmbt_rec_t))
  61#define XFS_INLINE_EXTS         2
  62#define XFS_INLINE_DATA         32
  63typedef struct xfs_ifork {
  64        int                     if_bytes;       /* bytes in if_u1 */
  65        int                     if_real_bytes;  /* bytes allocated in if_u1 */
  66        xfs_bmbt_block_t        *if_broot;      /* file's incore btree root */
  67        short                   if_broot_bytes; /* bytes allocated for root */
  68        unsigned char           if_flags;       /* per-fork flags */
  69        unsigned char           if_ext_max;     /* max # of extent records */
  70        xfs_extnum_t            if_lastex;      /* last if_extents used */
  71        union {
  72                xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */
  73                xfs_ext_irec_t  *if_ext_irec;   /* irec map file exts */
  74                char            *if_data;       /* inline file data */
  75        } if_u1;
  76        union {
  77                xfs_bmbt_rec_host_t if_inline_ext[XFS_INLINE_EXTS];
  78                                                /* very small file extents */
  79                char            if_inline_data[XFS_INLINE_DATA];
  80                                                /* very small file data */
  81                xfs_dev_t       if_rdev;        /* dev number if special */
  82                uuid_t          if_uuid;        /* mount point value */
  83        } if_u2;
  84} xfs_ifork_t;
  85
  86/*
  87 * Flags for xfs_ichgtime().
  88 */
  89#define XFS_ICHGTIME_MOD        0x1     /* data fork modification timestamp */
  90#define XFS_ICHGTIME_ACC        0x2     /* data fork access timestamp */
  91#define XFS_ICHGTIME_CHG        0x4     /* inode field change timestamp */
  92
  93/*
  94 * Per-fork incore inode flags.
  95 */
  96#define XFS_IFINLINE    0x01    /* Inline data is read in */
  97#define XFS_IFEXTENTS   0x02    /* All extent pointers are read in */
  98#define XFS_IFBROOT     0x04    /* i_broot points to the bmap b-tree root */
  99#define XFS_IFEXTIREC   0x08    /* Indirection array of extent blocks */
 100
 101/*
 102 * Flags for xfs_itobp(), xfs_imap() and xfs_dilocate().
 103 */
 104#define XFS_IMAP_LOOKUP         0x1
 105#define XFS_IMAP_BULKSTAT       0x2
 106
 107#ifdef __KERNEL__
 108struct bhv_desc;
 109struct cred;
 110struct ktrace;
 111struct xfs_buf;
 112struct xfs_bmap_free;
 113struct xfs_bmbt_irec;
 114struct xfs_bmbt_block;
 115struct xfs_inode;
 116struct xfs_inode_log_item;
 117struct xfs_mount;
 118struct xfs_trans;
 119struct xfs_dquot;
 120
 121#if defined(XFS_ILOCK_TRACE)
 122#define XFS_ILOCK_KTRACE_SIZE   32
 123extern ktrace_t *xfs_ilock_trace_buf;
 124extern void xfs_ilock_trace(struct xfs_inode *, int, unsigned int, inst_t *);
 125#else
 126#define xfs_ilock_trace(i,n,f,ra)
 127#endif
 128
 129typedef struct dm_attrs_s {
 130        __uint32_t      da_dmevmask;    /* DMIG event mask */
 131        __uint16_t      da_dmstate;     /* DMIG state info */
 132        __uint16_t      da_pad;         /* DMIG extra padding */
 133} dm_attrs_t;
 134
 135typedef struct xfs_iocore {
 136        void                    *io_obj;        /* pointer to container
 137                                                 * inode or dcxvn structure */
 138        struct xfs_mount        *io_mount;      /* fs mount struct ptr */
 139#ifdef DEBUG
 140        mrlock_t                *io_lock;       /* inode IO lock */
 141        mrlock_t                *io_iolock;     /* inode IO lock */
 142#endif
 143
 144        /* I/O state */
 145        xfs_fsize_t             io_new_size;    /* sz when write completes */
 146
 147        /* Miscellaneous state. */
 148        unsigned int            io_flags;       /* IO related flags */
 149
 150        /* DMAPI state */
 151        dm_attrs_t              io_dmattrs;
 152
 153} xfs_iocore_t;
 154
 155#define        io_dmevmask     io_dmattrs.da_dmevmask
 156#define        io_dmstate      io_dmattrs.da_dmstate
 157
 158#define XFS_IO_INODE(io)        ((xfs_inode_t *) ((io)->io_obj))
 159#define XFS_IO_DCXVN(io)        ((dcxvn_t *) ((io)->io_obj))
 160
 161/*
 162 * Flags in the flags field
 163 */
 164
 165#define XFS_IOCORE_RT           0x1
 166
 167/*
 168 * xfs_iocore prototypes
 169 */
 170
 171extern void xfs_iocore_inode_init(struct xfs_inode *);
 172extern void xfs_iocore_inode_reinit(struct xfs_inode *);
 173
 174/*
 175 * This is the xfs inode cluster structure.  This structure is used by
 176 * xfs_iflush to find inodes that share a cluster and can be flushed to disk at
 177 * the same time.
 178 */
 179typedef struct xfs_icluster {
 180        struct hlist_head       icl_inodes;     /* list of inodes on cluster */
 181        xfs_daddr_t             icl_blkno;      /* starting block number of
 182                                                 * the cluster */
 183        struct xfs_buf          *icl_buf;       /* the inode buffer */
 184        lock_t                  icl_lock;       /* inode list lock */
 185} xfs_icluster_t;
 186
 187/*
 188 * This is the xfs in-core inode structure.
 189 * Most of the on-disk inode is embedded in the i_d field.
 190 *
 191 * The extent pointers/inline file space, however, are managed
 192 * separately.  The memory for this information is pointed to by
 193 * the if_u1 unions depending on the type of the data.
 194 * This is used to linearize the array of extents for fast in-core
 195 * access.  This is used until the file's number of extents
 196 * surpasses XFS_MAX_INCORE_EXTENTS, at which point all extent pointers
 197 * are accessed through the buffer cache.
 198 *
 199 * Other state kept in the in-core inode is used for identification,
 200 * locking, transactional updating, etc of the inode.
 201 *
 202 * Generally, we do not want to hold the i_rlock while holding the
 203 * i_ilock. Hierarchy is i_iolock followed by i_rlock.
 204 *
 205 * xfs_iptr_t contains all the inode fields upto and including the
 206 * i_mnext and i_mprev fields, it is used as a marker in the inode
 207 * chain off the mount structure by xfs_sync calls.
 208 */
 209
 210typedef struct xfs_ictimestamp {
 211        __int32_t       t_sec;          /* timestamp seconds */
 212        __int32_t       t_nsec;         /* timestamp nanoseconds */
 213} xfs_ictimestamp_t;
 214
 215/*
 216 * NOTE:  This structure must be kept identical to struct xfs_dinode_core
 217 *        in xfs_dinode.h except for the endianess annotations.
 218 */
 219typedef struct xfs_icdinode {
 220        __uint16_t      di_magic;       /* inode magic # = XFS_DINODE_MAGIC */
 221        __uint16_t      di_mode;        /* mode and type of file */
 222        __int8_t        di_version;     /* inode version */
 223        __int8_t        di_format;      /* format of di_c data */
 224        __uint16_t      di_onlink;      /* old number of links to file */
 225        __uint32_t      di_uid;         /* owner's user id */
 226        __uint32_t      di_gid;         /* owner's group id */
 227        __uint32_t      di_nlink;       /* number of links to file */
 228        __uint16_t      di_projid;      /* owner's project id */
 229        __uint8_t       di_pad[8];      /* unused, zeroed space */
 230        __uint16_t      di_flushiter;   /* incremented on flush */
 231        xfs_ictimestamp_t di_atime;     /* time last accessed */
 232        xfs_ictimestamp_t di_mtime;     /* time last modified */
 233        xfs_ictimestamp_t di_ctime;     /* time created/inode modified */
 234        xfs_fsize_t     di_size;        /* number of bytes in file */
 235        xfs_drfsbno_t   di_nblocks;     /* # of direct & btree blocks used */
 236        xfs_extlen_t    di_extsize;     /* basic/minimum extent size for file */
 237        xfs_extnum_t    di_nextents;    /* number of extents in data fork */
 238        xfs_aextnum_t   di_anextents;   /* number of extents in attribute fork*/
 239        __uint8_t       di_forkoff;     /* attr fork offs, <<3 for 64b align */
 240        __int8_t        di_aformat;     /* format of attr fork's data */
 241        __uint32_t      di_dmevmask;    /* DMIG event mask */
 242        __uint16_t      di_dmstate;     /* DMIG state info */
 243        __uint16_t      di_flags;       /* random flags, XFS_DIFLAG_... */
 244        __uint32_t      di_gen;         /* generation number */
 245} xfs_icdinode_t;
 246
 247typedef struct {
 248        struct xfs_inode        *ip_mnext;      /* next inode in mount list */
 249        struct xfs_inode        *ip_mprev;      /* ptr to prev inode */
 250        struct xfs_mount        *ip_mount;      /* fs mount struct ptr */
 251} xfs_iptr_t;
 252
 253typedef struct xfs_inode {
 254        /* Inode linking and identification information. */
 255        struct xfs_inode        *i_mnext;       /* next inode in mount list */
 256        struct xfs_inode        *i_mprev;       /* ptr to prev inode */
 257        struct xfs_mount        *i_mount;       /* fs mount struct ptr */
 258        struct list_head        i_reclaim;      /* reclaim list */
 259        bhv_vnode_t             *i_vnode;       /* vnode backpointer */
 260        struct xfs_dquot        *i_udquot;      /* user dquot */
 261        struct xfs_dquot        *i_gdquot;      /* group dquot */
 262
 263        /* Inode location stuff */
 264        xfs_ino_t               i_ino;          /* inode number (agno/agino)*/
 265        xfs_daddr_t             i_blkno;        /* blkno of inode buffer */
 266        ushort                  i_len;          /* len of inode buffer */
 267        ushort                  i_boffset;      /* off of inode in buffer */
 268
 269        /* Extent information. */
 270        xfs_ifork_t             *i_afp;         /* attribute fork pointer */
 271        xfs_ifork_t             i_df;           /* data fork */
 272
 273        /* Transaction and locking information. */
 274        struct xfs_trans        *i_transp;      /* ptr to owning transaction*/
 275        struct xfs_inode_log_item *i_itemp;     /* logging information */
 276        mrlock_t                i_lock;         /* inode lock */
 277        mrlock_t                i_iolock;       /* inode IO lock */
 278        sema_t                  i_flock;        /* inode flush lock */
 279        atomic_t                i_pincount;     /* inode pin count */
 280        wait_queue_head_t       i_ipin_wait;    /* inode pinning wait queue */
 281        spinlock_t              i_flags_lock;   /* inode i_flags lock */
 282#ifdef HAVE_REFCACHE
 283        struct xfs_inode        **i_refcache;   /* ptr to entry in ref cache */
 284        struct xfs_inode        *i_release;     /* inode to unref */
 285#endif
 286        /* I/O state */
 287        xfs_iocore_t            i_iocore;       /* I/O core */
 288
 289        /* Miscellaneous state. */
 290        unsigned short          i_flags;        /* see defined flags below */
 291        unsigned char           i_update_core;  /* timestamps/size is dirty */
 292        unsigned char           i_update_size;  /* di_size field is dirty */
 293        unsigned int            i_gen;          /* generation count */
 294        unsigned int            i_delayed_blks; /* count of delay alloc blks */
 295
 296        xfs_icdinode_t          i_d;            /* most of ondisk inode */
 297        xfs_icluster_t          *i_cluster;     /* cluster list header */
 298        struct hlist_node       i_cnode;        /* cluster link node */
 299
 300        xfs_fsize_t             i_size;         /* in-memory size */
 301        atomic_t                i_iocount;      /* outstanding I/O count */
 302        /* Trace buffers per inode. */
 303#ifdef XFS_VNODE_TRACE
 304        struct ktrace           *i_trace;       /* general inode trace */
 305#endif
 306#ifdef XFS_BMAP_TRACE
 307        struct ktrace           *i_xtrace;      /* inode extent list trace */
 308#endif
 309#ifdef XFS_BMBT_TRACE
 310        struct ktrace           *i_btrace;      /* inode bmap btree trace */
 311#endif
 312#ifdef XFS_RW_TRACE
 313        struct ktrace           *i_rwtrace;     /* inode read/write trace */
 314#endif
 315#ifdef XFS_ILOCK_TRACE
 316        struct ktrace           *i_lock_trace;  /* inode lock/unlock trace */
 317#endif
 318#ifdef XFS_DIR2_TRACE
 319        struct ktrace           *i_dir_trace;   /* inode directory trace */
 320#endif
 321} xfs_inode_t;
 322
 323#define XFS_ISIZE(ip)   (((ip)->i_d.di_mode & S_IFMT) == S_IFREG) ? \
 324                                (ip)->i_size : (ip)->i_d.di_size;
 325
 326/*
 327 * i_flags helper functions
 328 */
 329static inline void
 330__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
 331{
 332        ip->i_flags |= flags;
 333}
 334
 335static inline void
 336xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
 337{
 338        spin_lock(&ip->i_flags_lock);
 339        __xfs_iflags_set(ip, flags);
 340        spin_unlock(&ip->i_flags_lock);
 341}
 342
 343static inline void
 344xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags)
 345{
 346        spin_lock(&ip->i_flags_lock);
 347        ip->i_flags &= ~flags;
 348        spin_unlock(&ip->i_flags_lock);
 349}
 350
 351static inline int
 352__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
 353{
 354        return (ip->i_flags & flags);
 355}
 356
 357static inline int
 358xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
 359{
 360        int ret;
 361        spin_lock(&ip->i_flags_lock);
 362        ret = __xfs_iflags_test(ip, flags);
 363        spin_unlock(&ip->i_flags_lock);
 364        return ret;
 365}
 366
 367static inline int
 368xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
 369{
 370        int ret;
 371
 372        spin_lock(&ip->i_flags_lock);
 373        ret = ip->i_flags & flags;
 374        if (ret)
 375                ip->i_flags &= ~flags;
 376        spin_unlock(&ip->i_flags_lock);
 377        return ret;
 378}
 379#endif  /* __KERNEL__ */
 380
 381
 382/*
 383 * Fork handling.
 384 */
 385#define XFS_IFORK_PTR(ip,w)             \
 386        ((w) == XFS_DATA_FORK ? &(ip)->i_df : (ip)->i_afp)
 387#define XFS_IFORK_Q(ip)                 XFS_CFORK_Q(&(ip)->i_d)
 388#define XFS_IFORK_DSIZE(ip)             XFS_CFORK_DSIZE(&ip->i_d, ip->i_mount)
 389#define XFS_IFORK_ASIZE(ip)             XFS_CFORK_ASIZE(&ip->i_d, ip->i_mount)
 390#define XFS_IFORK_SIZE(ip,w)            XFS_CFORK_SIZE(&ip->i_d, ip->i_mount, w)
 391#define XFS_IFORK_FORMAT(ip,w)          XFS_CFORK_FORMAT(&ip->i_d, w)
 392#define XFS_IFORK_FMT_SET(ip,w,n)       XFS_CFORK_FMT_SET(&ip->i_d, w, n)
 393#define XFS_IFORK_NEXTENTS(ip,w)        XFS_CFORK_NEXTENTS(&ip->i_d, w)
 394#define XFS_IFORK_NEXT_SET(ip,w,n)      XFS_CFORK_NEXT_SET(&ip->i_d, w, n)
 395
 396
 397#ifdef __KERNEL__
 398
 399/*
 400 * In-core inode flags.
 401 */
 402#define XFS_IGRIO       0x0001  /* inode used for guaranteed rate i/o */
 403#define XFS_IUIOSZ      0x0002  /* inode i/o sizes have been explicitly set */
 404#define XFS_IQUIESCE    0x0004  /* we have started quiescing for this inode */
 405#define XFS_IRECLAIM    0x0008  /* we have started reclaiming this inode    */
 406#define XFS_ISTALE      0x0010  /* inode has been staled */
 407#define XFS_IRECLAIMABLE 0x0020 /* inode can be reclaimed */
 408#define XFS_INEW        0x0040
 409#define XFS_IFILESTREAM 0x0080  /* inode is in a filestream directory */
 410#define XFS_IMODIFIED   0x0100  /* XFS inode state possibly differs */
 411                                /* to the Linux inode state. */
 412#define XFS_ITRUNCATED  0x0200  /* truncated down so flush-on-close */
 413
 414/*
 415 * Flags for inode locking.
 416 * Bit ranges:  1<<1  - 1<<16-1 -- iolock/ilock modes (bitfield)
 417 *              1<<16 - 1<<32-1 -- lockdep annotation (integers)
 418 */
 419#define XFS_IOLOCK_EXCL         (1<<0)
 420#define XFS_IOLOCK_SHARED       (1<<1)
 421#define XFS_ILOCK_EXCL          (1<<2)
 422#define XFS_ILOCK_SHARED        (1<<3)
 423#define XFS_IUNLOCK_NONOTIFY    (1<<4)
 424/*      #define XFS_IOLOCK_NESTED       (1<<5)  */
 425#define XFS_EXTENT_TOKEN_RD     (1<<6)
 426#define XFS_SIZE_TOKEN_RD       (1<<7)
 427#define XFS_EXTSIZE_RD          (XFS_EXTENT_TOKEN_RD|XFS_SIZE_TOKEN_RD)
 428#define XFS_WILLLEND            (1<<8)  /* Always acquire tokens for lending */
 429#define XFS_EXTENT_TOKEN_WR     (XFS_EXTENT_TOKEN_RD | XFS_WILLLEND)
 430#define XFS_SIZE_TOKEN_WR       (XFS_SIZE_TOKEN_RD | XFS_WILLLEND)
 431#define XFS_EXTSIZE_WR          (XFS_EXTSIZE_RD | XFS_WILLLEND)
 432/* TODO:XFS_SIZE_TOKEN_WANT     (1<<9) */
 433
 434#define XFS_LOCK_MASK           (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
 435                                | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \
 436                                | XFS_EXTENT_TOKEN_RD | XFS_SIZE_TOKEN_RD \
 437                                | XFS_WILLLEND)
 438
 439/*
 440 * Flags for lockdep annotations.
 441 *
 442 * XFS_I[O]LOCK_PARENT - for operations that require locking two inodes
 443 * (ie directory operations that require locking a directory inode and
 444 * an entry inode).  The first inode gets locked with this flag so it
 445 * gets a lockdep subclass of 1 and the second lock will have a lockdep
 446 * subclass of 0.
 447 *
 448 * XFS_LOCK_INUMORDER - for locking several inodes at the some time
 449 * with xfs_lock_inodes().  This flag is used as the starting subclass
 450 * and each subsequent lock acquired will increment the subclass by one.
 451 * So the first lock acquired will have a lockdep subclass of 2, the
 452 * second lock will have a lockdep subclass of 3, and so on. It is
 453 * the responsibility of the class builder to shift this to the correct
 454 * portion of the lock_mode lockdep mask.
 455 */
 456#define XFS_LOCK_PARENT         1
 457#define XFS_LOCK_INUMORDER      2
 458
 459#define XFS_IOLOCK_SHIFT        16
 460#define XFS_IOLOCK_PARENT       (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT)
 461
 462#define XFS_ILOCK_SHIFT         24
 463#define XFS_ILOCK_PARENT        (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT)
 464
 465#define XFS_IOLOCK_DEP_MASK     0x00ff0000
 466#define XFS_ILOCK_DEP_MASK      0xff000000
 467#define XFS_LOCK_DEP_MASK       (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK)
 468
 469#define XFS_IOLOCK_DEP(flags)   (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT)
 470#define XFS_ILOCK_DEP(flags)    (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT)
 471
 472/*
 473 * Flags for xfs_iflush()
 474 */
 475#define XFS_IFLUSH_DELWRI_ELSE_SYNC     1
 476#define XFS_IFLUSH_DELWRI_ELSE_ASYNC    2
 477#define XFS_IFLUSH_SYNC                 3
 478#define XFS_IFLUSH_ASYNC                4
 479#define XFS_IFLUSH_DELWRI               5
 480
 481/*
 482 * Flags for xfs_itruncate_start().
 483 */
 484#define XFS_ITRUNC_DEFINITE     0x1
 485#define XFS_ITRUNC_MAYBE        0x2
 486
 487#define XFS_ITOV(ip)            ((ip)->i_vnode)
 488#define XFS_ITOV_NULL(ip)       ((ip)->i_vnode)
 489
 490/*
 491 * For multiple groups support: if S_ISGID bit is set in the parent
 492 * directory, group of new file is set to that of the parent, and
 493 * new subdirectory gets S_ISGID bit from parent.
 494 */
 495#define XFS_INHERIT_GID(pip)    \
 496        (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \
 497         ((pip)->i_d.di_mode & S_ISGID))
 498
 499/*
 500 * Flags for xfs_iget()
 501 */
 502#define XFS_IGET_CREATE         0x1
 503#define XFS_IGET_BULKSTAT       0x2
 504
 505/*
 506 * xfs_iget.c prototypes.
 507 */
 508void            xfs_ihash_init(struct xfs_mount *);
 509void            xfs_ihash_free(struct xfs_mount *);
 510xfs_inode_t     *xfs_inode_incore(struct xfs_mount *, xfs_ino_t,
 511                                  struct xfs_trans *);
 512void            xfs_inode_lock_init(xfs_inode_t *, bhv_vnode_t *);
 513int             xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
 514                         uint, uint, xfs_inode_t **, xfs_daddr_t);
 515void            xfs_iput(xfs_inode_t *, uint);
 516void            xfs_iput_new(xfs_inode_t *, uint);
 517void            xfs_ilock(xfs_inode_t *, uint);
 518int             xfs_ilock_nowait(xfs_inode_t *, uint);
 519void            xfs_iunlock(xfs_inode_t *, uint);
 520void            xfs_ilock_demote(xfs_inode_t *, uint);
 521void            xfs_iflock(xfs_inode_t *);
 522int             xfs_iflock_nowait(xfs_inode_t *);
 523uint            xfs_ilock_map_shared(xfs_inode_t *);
 524void            xfs_iunlock_map_shared(xfs_inode_t *, uint);
 525void            xfs_ifunlock(xfs_inode_t *);
 526void            xfs_ireclaim(xfs_inode_t *);
 527int             xfs_finish_reclaim(xfs_inode_t *, int, int);
 528int             xfs_finish_reclaim_all(struct xfs_mount *, int);
 529
 530/*
 531 * xfs_inode.c prototypes.
 532 */
 533int             xfs_itobp(struct xfs_mount *, struct xfs_trans *,
 534                          xfs_inode_t *, struct xfs_dinode **, struct xfs_buf **,
 535                          xfs_daddr_t, uint);
 536int             xfs_iread(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
 537                          xfs_inode_t **, xfs_daddr_t, uint);
 538int             xfs_iread_extents(struct xfs_trans *, xfs_inode_t *, int);
 539int             xfs_ialloc(struct xfs_trans *, xfs_inode_t *, mode_t,
 540                           xfs_nlink_t, xfs_dev_t, struct cred *, xfs_prid_t,
 541                           int, struct xfs_buf **, boolean_t *, xfs_inode_t **);
 542void            xfs_dinode_from_disk(struct xfs_icdinode *,
 543                                     struct xfs_dinode_core *);
 544void            xfs_dinode_to_disk(struct xfs_dinode_core *,
 545                                   struct xfs_icdinode *);
 546
 547uint            xfs_ip2xflags(struct xfs_inode *);
 548uint            xfs_dic2xflags(struct xfs_dinode_core *);
 549int             xfs_ifree(struct xfs_trans *, xfs_inode_t *,
 550                           struct xfs_bmap_free *);
 551int             xfs_itruncate_start(xfs_inode_t *, uint, xfs_fsize_t);
 552int             xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *,
 553                                     xfs_fsize_t, int, int);
 554int             xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
 555int             xfs_igrow_start(xfs_inode_t *, xfs_fsize_t, struct cred *);
 556void            xfs_igrow_finish(struct xfs_trans *, xfs_inode_t *,
 557                                 xfs_fsize_t, int);
 558
 559void            xfs_idestroy_fork(xfs_inode_t *, int);
 560void            xfs_idestroy(xfs_inode_t *);
 561void            xfs_idata_realloc(xfs_inode_t *, int, int);
 562void            xfs_iextract(xfs_inode_t *);
 563void            xfs_iext_realloc(xfs_inode_t *, int, int);
 564void            xfs_iroot_realloc(xfs_inode_t *, int, int);
 565void            xfs_ipin(xfs_inode_t *);
 566void            xfs_iunpin(xfs_inode_t *);
 567int             xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int);
 568int             xfs_iflush(xfs_inode_t *, uint);
 569void            xfs_iflush_all(struct xfs_mount *);
 570int             xfs_iaccess(xfs_inode_t *, mode_t, cred_t *);
 571uint            xfs_iroundup(uint);
 572void            xfs_ichgtime(xfs_inode_t *, int);
 573xfs_fsize_t     xfs_file_last_byte(xfs_inode_t *);
 574void            xfs_lock_inodes(xfs_inode_t **, int, int, uint);
 575
 576void            xfs_synchronize_atime(xfs_inode_t *);
 577
 578xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t);
 579void            xfs_iext_insert(xfs_ifork_t *, xfs_extnum_t, xfs_extnum_t,
 580                                xfs_bmbt_irec_t *);
 581void            xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int);
 582void            xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int);
 583void            xfs_iext_remove(xfs_ifork_t *, xfs_extnum_t, int);
 584void            xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int);
 585void            xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int);
 586void            xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int);
 587void            xfs_iext_realloc_direct(xfs_ifork_t *, int);
 588void            xfs_iext_realloc_indirect(xfs_ifork_t *, int);
 589void            xfs_iext_indirect_to_direct(xfs_ifork_t *);
 590void            xfs_iext_direct_to_inline(xfs_ifork_t *, xfs_extnum_t);
 591void            xfs_iext_inline_to_direct(xfs_ifork_t *, int);
 592void            xfs_iext_destroy(xfs_ifork_t *);
 593xfs_bmbt_rec_host_t *xfs_iext_bno_to_ext(xfs_ifork_t *, xfs_fileoff_t, int *);
 594xfs_ext_irec_t  *xfs_iext_bno_to_irec(xfs_ifork_t *, xfs_fileoff_t, int *);
 595xfs_ext_irec_t  *xfs_iext_idx_to_irec(xfs_ifork_t *, xfs_extnum_t *, int *, int);
 596void            xfs_iext_irec_init(xfs_ifork_t *);
 597xfs_ext_irec_t *xfs_iext_irec_new(xfs_ifork_t *, int);
 598void            xfs_iext_irec_remove(xfs_ifork_t *, int);
 599void            xfs_iext_irec_compact(xfs_ifork_t *);
 600void            xfs_iext_irec_compact_pages(xfs_ifork_t *);
 601void            xfs_iext_irec_compact_full(xfs_ifork_t *);
 602void            xfs_iext_irec_update_extoffs(xfs_ifork_t *, int, int);
 603
 604#define xfs_ipincount(ip)       ((unsigned int) atomic_read(&ip->i_pincount))
 605
 606#ifdef DEBUG
 607void            xfs_isize_check(struct xfs_mount *, xfs_inode_t *, xfs_fsize_t);
 608#else   /* DEBUG */
 609#define xfs_isize_check(mp, ip, isize)
 610#endif  /* DEBUG */
 611
 612#if defined(DEBUG)
 613void            xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
 614#else
 615#define xfs_inobp_check(mp, bp)
 616#endif /* DEBUG */
 617
 618extern struct kmem_zone *xfs_icluster_zone;
 619extern struct kmem_zone *xfs_ifork_zone;
 620extern struct kmem_zone *xfs_inode_zone;
 621extern struct kmem_zone *xfs_ili_zone;
 622
 623#endif  /* __KERNEL__ */
 624
 625#endif  /* __XFS_INODE_H__ */
 626