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 posix_acl;
  22struct xfs_dinode;
  23struct xfs_inode;
  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        struct xfs_btree_block  *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        union {
  70                xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */
  71                xfs_ext_irec_t  *if_ext_irec;   /* irec map file exts */
  72                char            *if_data;       /* inline file data */
  73        } if_u1;
  74        union {
  75                xfs_bmbt_rec_host_t if_inline_ext[XFS_INLINE_EXTS];
  76                                                /* very small file extents */
  77                char            if_inline_data[XFS_INLINE_DATA];
  78                                                /* very small file data */
  79                xfs_dev_t       if_rdev;        /* dev number if special */
  80                uuid_t          if_uuid;        /* mount point value */
  81        } if_u2;
  82} xfs_ifork_t;
  83
  84/*
  85 * Inode location information.  Stored in the inode and passed to
  86 * xfs_imap_to_bp() to get a buffer and dinode for a given inode.
  87 */
  88struct xfs_imap {
  89        xfs_daddr_t     im_blkno;       /* starting BB of inode chunk */
  90        ushort          im_len;         /* length in BBs of inode chunk */
  91        ushort          im_boffset;     /* inode offset in block in bytes */
  92};
  93
  94/*
  95 * This is the xfs in-core inode structure.
  96 * Most of the on-disk inode is embedded in the i_d field.
  97 *
  98 * The extent pointers/inline file space, however, are managed
  99 * separately.  The memory for this information is pointed to by
 100 * the if_u1 unions depending on the type of the data.
 101 * This is used to linearize the array of extents for fast in-core
 102 * access.  This is used until the file's number of extents
 103 * surpasses XFS_MAX_INCORE_EXTENTS, at which point all extent pointers
 104 * are accessed through the buffer cache.
 105 *
 106 * Other state kept in the in-core inode is used for identification,
 107 * locking, transactional updating, etc of the inode.
 108 *
 109 * Generally, we do not want to hold the i_rlock while holding the
 110 * i_ilock. Hierarchy is i_iolock followed by i_rlock.
 111 *
 112 * xfs_iptr_t contains all the inode fields up to and including the
 113 * i_mnext and i_mprev fields, it is used as a marker in the inode
 114 * chain off the mount structure by xfs_sync calls.
 115 */
 116
 117typedef struct xfs_ictimestamp {
 118        __int32_t       t_sec;          /* timestamp seconds */
 119        __int32_t       t_nsec;         /* timestamp nanoseconds */
 120} xfs_ictimestamp_t;
 121
 122/*
 123 * NOTE:  This structure must be kept identical to struct xfs_dinode
 124 *        in xfs_dinode.h except for the endianness annotations.
 125 */
 126typedef struct xfs_icdinode {
 127        __uint16_t      di_magic;       /* inode magic # = XFS_DINODE_MAGIC */
 128        __uint16_t      di_mode;        /* mode and type of file */
 129        __int8_t        di_version;     /* inode version */
 130        __int8_t        di_format;      /* format of di_c data */
 131        __uint16_t      di_onlink;      /* old number of links to file */
 132        __uint32_t      di_uid;         /* owner's user id */
 133        __uint32_t      di_gid;         /* owner's group id */
 134        __uint32_t      di_nlink;       /* number of links to file */
 135        __uint16_t      di_projid_lo;   /* lower part of owner's project id */
 136        __uint16_t      di_projid_hi;   /* higher part of owner's project id */
 137        __uint8_t       di_pad[6];      /* unused, zeroed space */
 138        __uint16_t      di_flushiter;   /* incremented on flush */
 139        xfs_ictimestamp_t di_atime;     /* time last accessed */
 140        xfs_ictimestamp_t di_mtime;     /* time last modified */
 141        xfs_ictimestamp_t di_ctime;     /* time created/inode modified */
 142        xfs_fsize_t     di_size;        /* number of bytes in file */
 143        xfs_drfsbno_t   di_nblocks;     /* # of direct & btree blocks used */
 144        xfs_extlen_t    di_extsize;     /* basic/minimum extent size for file */
 145        xfs_extnum_t    di_nextents;    /* number of extents in data fork */
 146        xfs_aextnum_t   di_anextents;   /* number of extents in attribute fork*/
 147        __uint8_t       di_forkoff;     /* attr fork offs, <<3 for 64b align */
 148        __int8_t        di_aformat;     /* format of attr fork's data */
 149        __uint32_t      di_dmevmask;    /* DMIG event mask */
 150        __uint16_t      di_dmstate;     /* DMIG state info */
 151        __uint16_t      di_flags;       /* random flags, XFS_DIFLAG_... */
 152        __uint32_t      di_gen;         /* generation number */
 153} xfs_icdinode_t;
 154
 155/*
 156 * Flags for xfs_ichgtime().
 157 */
 158#define XFS_ICHGTIME_MOD        0x1     /* data fork modification timestamp */
 159#define XFS_ICHGTIME_CHG        0x2     /* inode field change timestamp */
 160
 161/*
 162 * Per-fork incore inode flags.
 163 */
 164#define XFS_IFINLINE    0x01    /* Inline data is read in */
 165#define XFS_IFEXTENTS   0x02    /* All extent pointers are read in */
 166#define XFS_IFBROOT     0x04    /* i_broot points to the bmap b-tree root */
 167#define XFS_IFEXTIREC   0x08    /* Indirection array of extent blocks */
 168
 169/*
 170 * Fork handling.
 171 */
 172
 173#define XFS_IFORK_Q(ip)                 ((ip)->i_d.di_forkoff != 0)
 174#define XFS_IFORK_BOFF(ip)              ((int)((ip)->i_d.di_forkoff << 3))
 175
 176#define XFS_IFORK_PTR(ip,w)             \
 177        ((w) == XFS_DATA_FORK ? \
 178                &(ip)->i_df : \
 179                (ip)->i_afp)
 180#define XFS_IFORK_DSIZE(ip) \
 181        (XFS_IFORK_Q(ip) ? \
 182                XFS_IFORK_BOFF(ip) : \
 183                XFS_LITINO((ip)->i_mount))
 184#define XFS_IFORK_ASIZE(ip) \
 185        (XFS_IFORK_Q(ip) ? \
 186                XFS_LITINO((ip)->i_mount) - XFS_IFORK_BOFF(ip) : \
 187                0)
 188#define XFS_IFORK_SIZE(ip,w) \
 189        ((w) == XFS_DATA_FORK ? \
 190                XFS_IFORK_DSIZE(ip) : \
 191                XFS_IFORK_ASIZE(ip))
 192#define XFS_IFORK_FORMAT(ip,w) \
 193        ((w) == XFS_DATA_FORK ? \
 194                (ip)->i_d.di_format : \
 195                (ip)->i_d.di_aformat)
 196#define XFS_IFORK_FMT_SET(ip,w,n) \
 197        ((w) == XFS_DATA_FORK ? \
 198                ((ip)->i_d.di_format = (n)) : \
 199                ((ip)->i_d.di_aformat = (n)))
 200#define XFS_IFORK_NEXTENTS(ip,w) \
 201        ((w) == XFS_DATA_FORK ? \
 202                (ip)->i_d.di_nextents : \
 203                (ip)->i_d.di_anextents)
 204#define XFS_IFORK_NEXT_SET(ip,w,n) \
 205        ((w) == XFS_DATA_FORK ? \
 206                ((ip)->i_d.di_nextents = (n)) : \
 207                ((ip)->i_d.di_anextents = (n)))
 208#define XFS_IFORK_MAXEXT(ip, w) \
 209        (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t))
 210
 211
 212#ifdef __KERNEL__
 213
 214struct xfs_buf;
 215struct xfs_bmap_free;
 216struct xfs_bmbt_irec;
 217struct xfs_inode_log_item;
 218struct xfs_mount;
 219struct xfs_trans;
 220struct xfs_dquot;
 221
 222typedef struct xfs_inode {
 223        /* Inode linking and identification information. */
 224        struct xfs_mount        *i_mount;       /* fs mount struct ptr */
 225        struct xfs_dquot        *i_udquot;      /* user dquot */
 226        struct xfs_dquot        *i_gdquot;      /* group dquot */
 227
 228        /* Inode location stuff */
 229        xfs_ino_t               i_ino;          /* inode number (agno/agino)*/
 230        struct xfs_imap         i_imap;         /* location for xfs_imap() */
 231
 232        /* Extent information. */
 233        xfs_ifork_t             *i_afp;         /* attribute fork pointer */
 234        xfs_ifork_t             i_df;           /* data fork */
 235
 236        /* Transaction and locking information. */
 237        struct xfs_inode_log_item *i_itemp;     /* logging information */
 238        mrlock_t                i_lock;         /* inode lock */
 239        mrlock_t                i_iolock;       /* inode IO lock */
 240        atomic_t                i_pincount;     /* inode pin count */
 241        spinlock_t              i_flags_lock;   /* inode i_flags lock */
 242        /* Miscellaneous state. */
 243        unsigned long           i_flags;        /* see defined flags below */
 244        unsigned int            i_delayed_blks; /* count of delay alloc blks */
 245
 246        xfs_icdinode_t          i_d;            /* most of ondisk inode */
 247
 248        /* VFS inode */
 249        struct inode            i_vnode;        /* embedded VFS inode */
 250} xfs_inode_t;
 251
 252/* Convert from vfs inode to xfs inode */
 253static inline struct xfs_inode *XFS_I(struct inode *inode)
 254{
 255        return container_of(inode, struct xfs_inode, i_vnode);
 256}
 257
 258/* convert from xfs inode to vfs inode */
 259static inline struct inode *VFS_I(struct xfs_inode *ip)
 260{
 261        return &ip->i_vnode;
 262}
 263
 264/*
 265 * For regular files we only update the on-disk filesize when actually
 266 * writing data back to disk.  Until then only the copy in the VFS inode
 267 * is uptodate.
 268 */
 269static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip)
 270{
 271        if (S_ISREG(ip->i_d.di_mode))
 272                return i_size_read(VFS_I(ip));
 273        return ip->i_d.di_size;
 274}
 275
 276/*
 277 * If this I/O goes past the on-disk inode size update it unless it would
 278 * be past the current in-core inode size.
 279 */
 280static inline xfs_fsize_t
 281xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size)
 282{
 283        xfs_fsize_t i_size = i_size_read(VFS_I(ip));
 284
 285        if (new_size > i_size)
 286                new_size = i_size;
 287        return new_size > ip->i_d.di_size ? new_size : 0;
 288}
 289
 290/*
 291 * i_flags helper functions
 292 */
 293static inline void
 294__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
 295{
 296        ip->i_flags |= flags;
 297}
 298
 299static inline void
 300xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
 301{
 302        spin_lock(&ip->i_flags_lock);
 303        __xfs_iflags_set(ip, flags);
 304        spin_unlock(&ip->i_flags_lock);
 305}
 306
 307static inline void
 308xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags)
 309{
 310        spin_lock(&ip->i_flags_lock);
 311        ip->i_flags &= ~flags;
 312        spin_unlock(&ip->i_flags_lock);
 313}
 314
 315static inline int
 316__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
 317{
 318        return (ip->i_flags & flags);
 319}
 320
 321static inline int
 322xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
 323{
 324        int ret;
 325        spin_lock(&ip->i_flags_lock);
 326        ret = __xfs_iflags_test(ip, flags);
 327        spin_unlock(&ip->i_flags_lock);
 328        return ret;
 329}
 330
 331static inline int
 332xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
 333{
 334        int ret;
 335
 336        spin_lock(&ip->i_flags_lock);
 337        ret = ip->i_flags & flags;
 338        if (ret)
 339                ip->i_flags &= ~flags;
 340        spin_unlock(&ip->i_flags_lock);
 341        return ret;
 342}
 343
 344static inline int
 345xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags)
 346{
 347        int ret;
 348
 349        spin_lock(&ip->i_flags_lock);
 350        ret = ip->i_flags & flags;
 351        if (!ret)
 352                ip->i_flags |= flags;
 353        spin_unlock(&ip->i_flags_lock);
 354        return ret;
 355}
 356
 357/*
 358 * Project quota id helpers (previously projid was 16bit only
 359 * and using two 16bit values to hold new 32bit projid was chosen
 360 * to retain compatibility with "old" filesystems).
 361 */
 362static inline prid_t
 363xfs_get_projid(struct xfs_inode *ip)
 364{
 365        return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo;
 366}
 367
 368static inline void
 369xfs_set_projid(struct xfs_inode *ip,
 370                prid_t projid)
 371{
 372        ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16);
 373        ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff);
 374}
 375
 376/*
 377 * In-core inode flags.
 378 */
 379#define XFS_IRECLAIM            (1 << 0) /* started reclaiming this inode */
 380#define XFS_ISTALE              (1 << 1) /* inode has been staled */
 381#define XFS_IRECLAIMABLE        (1 << 2) /* inode can be reclaimed */
 382#define XFS_INEW                (1 << 3) /* inode has just been allocated */
 383#define XFS_IFILESTREAM         (1 << 4) /* inode is in a filestream dir. */
 384#define XFS_ITRUNCATED          (1 << 5) /* truncated down so flush-on-close */
 385#define XFS_IDIRTY_RELEASE      (1 << 6) /* dirty release already seen */
 386#define __XFS_IFLOCK_BIT        7        /* inode is being flushed right now */
 387#define XFS_IFLOCK              (1 << __XFS_IFLOCK_BIT)
 388#define __XFS_IPINNED_BIT       8        /* wakeup key for zero pin count */
 389#define XFS_IPINNED             (1 << __XFS_IPINNED_BIT)
 390#define XFS_IDONTCACHE          (1 << 9) /* don't cache the inode long term */
 391
 392/*
 393 * Per-lifetime flags need to be reset when re-using a reclaimable inode during
 394 * inode lookup. This prevents unintended behaviour on the new inode from
 395 * ocurring.
 396 */
 397#define XFS_IRECLAIM_RESET_FLAGS        \
 398        (XFS_IRECLAIMABLE | XFS_IRECLAIM | \
 399         XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \
 400         XFS_IFILESTREAM);
 401
 402/*
 403 * Synchronize processes attempting to flush the in-core inode back to disk.
 404 */
 405
 406extern void __xfs_iflock(struct xfs_inode *ip);
 407
 408static inline int xfs_iflock_nowait(struct xfs_inode *ip)
 409{
 410        return !xfs_iflags_test_and_set(ip, XFS_IFLOCK);
 411}
 412
 413static inline void xfs_iflock(struct xfs_inode *ip)
 414{
 415        if (!xfs_iflock_nowait(ip))
 416                __xfs_iflock(ip);
 417}
 418
 419static inline void xfs_ifunlock(struct xfs_inode *ip)
 420{
 421        xfs_iflags_clear(ip, XFS_IFLOCK);
 422        wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT);
 423}
 424
 425static inline int xfs_isiflocked(struct xfs_inode *ip)
 426{
 427        return xfs_iflags_test(ip, XFS_IFLOCK);
 428}
 429
 430/*
 431 * Flags for inode locking.
 432 * Bit ranges:  1<<1  - 1<<16-1 -- iolock/ilock modes (bitfield)
 433 *              1<<16 - 1<<32-1 -- lockdep annotation (integers)
 434 */
 435#define XFS_IOLOCK_EXCL         (1<<0)
 436#define XFS_IOLOCK_SHARED       (1<<1)
 437#define XFS_ILOCK_EXCL          (1<<2)
 438#define XFS_ILOCK_SHARED        (1<<3)
 439
 440#define XFS_LOCK_MASK           (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
 441                                | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED)
 442
 443#define XFS_LOCK_FLAGS \
 444        { XFS_IOLOCK_EXCL,      "IOLOCK_EXCL" }, \
 445        { XFS_IOLOCK_SHARED,    "IOLOCK_SHARED" }, \
 446        { XFS_ILOCK_EXCL,       "ILOCK_EXCL" }, \
 447        { XFS_ILOCK_SHARED,     "ILOCK_SHARED" }
 448
 449
 450/*
 451 * Flags for lockdep annotations.
 452 *
 453 * XFS_LOCK_PARENT - for directory operations that require locking a
 454 * parent directory inode and a child entry inode.  The parent gets locked
 455 * with this flag so it gets a lockdep subclass of 1 and the child entry
 456 * lock will have a lockdep subclass of 0.
 457 *
 458 * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary
 459 * inodes do not participate in the normal lock order, and thus have their
 460 * own subclasses.
 461 *
 462 * XFS_LOCK_INUMORDER - for locking several inodes at the some time
 463 * with xfs_lock_inodes().  This flag is used as the starting subclass
 464 * and each subsequent lock acquired will increment the subclass by one.
 465 * So the first lock acquired will have a lockdep subclass of 4, the
 466 * second lock will have a lockdep subclass of 5, and so on. It is
 467 * the responsibility of the class builder to shift this to the correct
 468 * portion of the lock_mode lockdep mask.
 469 */
 470#define XFS_LOCK_PARENT         1
 471#define XFS_LOCK_RTBITMAP       2
 472#define XFS_LOCK_RTSUM          3
 473#define XFS_LOCK_INUMORDER      4
 474
 475#define XFS_IOLOCK_SHIFT        16
 476#define XFS_IOLOCK_PARENT       (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT)
 477
 478#define XFS_ILOCK_SHIFT         24
 479#define XFS_ILOCK_PARENT        (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT)
 480#define XFS_ILOCK_RTBITMAP      (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT)
 481#define XFS_ILOCK_RTSUM         (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT)
 482
 483#define XFS_IOLOCK_DEP_MASK     0x00ff0000
 484#define XFS_ILOCK_DEP_MASK      0xff000000
 485#define XFS_LOCK_DEP_MASK       (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK)
 486
 487#define XFS_IOLOCK_DEP(flags)   (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT)
 488#define XFS_ILOCK_DEP(flags)    (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT)
 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 * xfs_iget.c prototypes.
 501 */
 502int             xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
 503                         uint, uint, xfs_inode_t **);
 504void            xfs_ilock(xfs_inode_t *, uint);
 505int             xfs_ilock_nowait(xfs_inode_t *, uint);
 506void            xfs_iunlock(xfs_inode_t *, uint);
 507void            xfs_ilock_demote(xfs_inode_t *, uint);
 508int             xfs_isilocked(xfs_inode_t *, uint);
 509uint            xfs_ilock_map_shared(xfs_inode_t *);
 510void            xfs_iunlock_map_shared(xfs_inode_t *, uint);
 511void            xfs_inode_free(struct xfs_inode *ip);
 512
 513/*
 514 * xfs_inode.c prototypes.
 515 */
 516int             xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t,
 517                           xfs_nlink_t, xfs_dev_t, prid_t, int,
 518                           struct xfs_buf **, xfs_inode_t **);
 519
 520uint            xfs_ip2xflags(struct xfs_inode *);
 521uint            xfs_dic2xflags(struct xfs_dinode *);
 522int             xfs_ifree(struct xfs_trans *, xfs_inode_t *,
 523                           struct xfs_bmap_free *);
 524int             xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *,
 525                                      int, xfs_fsize_t);
 526int             xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
 527
 528void            xfs_iext_realloc(xfs_inode_t *, int, int);
 529void            xfs_iunpin_wait(xfs_inode_t *);
 530int             xfs_iflush(struct xfs_inode *, struct xfs_buf **);
 531void            xfs_lock_inodes(xfs_inode_t **, int, uint);
 532void            xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint);
 533
 534xfs_extlen_t    xfs_get_extsz_hint(struct xfs_inode *ip);
 535
 536#define IHOLD(ip) \
 537do { \
 538        ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \
 539        ihold(VFS_I(ip)); \
 540        trace_xfs_ihold(ip, _THIS_IP_); \
 541} while (0)
 542
 543#define IRELE(ip) \
 544do { \
 545        trace_xfs_irele(ip, _THIS_IP_); \
 546        iput(VFS_I(ip)); \
 547} while (0)
 548
 549#endif /* __KERNEL__ */
 550
 551/*
 552 * Flags for xfs_iget()
 553 */
 554#define XFS_IGET_CREATE         0x1
 555#define XFS_IGET_UNTRUSTED      0x2
 556#define XFS_IGET_DONTCACHE      0x4
 557
 558int             xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
 559                               struct xfs_imap *, struct xfs_dinode **,
 560                               struct xfs_buf **, uint, uint);
 561int             xfs_iread(struct xfs_mount *, struct xfs_trans *,
 562                          struct xfs_inode *, uint);
 563void            xfs_dinode_to_disk(struct xfs_dinode *,
 564                                   struct xfs_icdinode *);
 565void            xfs_idestroy_fork(struct xfs_inode *, int);
 566void            xfs_idata_realloc(struct xfs_inode *, int, int);
 567void            xfs_iroot_realloc(struct xfs_inode *, int, int);
 568int             xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int);
 569int             xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int);
 570
 571xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t);
 572void            xfs_iext_insert(xfs_inode_t *, xfs_extnum_t, xfs_extnum_t,
 573                                xfs_bmbt_irec_t *, int);
 574void            xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int);
 575void            xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int);
 576void            xfs_iext_remove(xfs_inode_t *, xfs_extnum_t, int, int);
 577void            xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int);
 578void            xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int);
 579void            xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int);
 580void            xfs_iext_realloc_direct(xfs_ifork_t *, int);
 581void            xfs_iext_direct_to_inline(xfs_ifork_t *, xfs_extnum_t);
 582void            xfs_iext_inline_to_direct(xfs_ifork_t *, int);
 583void            xfs_iext_destroy(xfs_ifork_t *);
 584xfs_bmbt_rec_host_t *xfs_iext_bno_to_ext(xfs_ifork_t *, xfs_fileoff_t, int *);
 585xfs_ext_irec_t  *xfs_iext_bno_to_irec(xfs_ifork_t *, xfs_fileoff_t, int *);
 586xfs_ext_irec_t  *xfs_iext_idx_to_irec(xfs_ifork_t *, xfs_extnum_t *, int *, int);
 587void            xfs_iext_irec_init(xfs_ifork_t *);
 588xfs_ext_irec_t *xfs_iext_irec_new(xfs_ifork_t *, int);
 589void            xfs_iext_irec_remove(xfs_ifork_t *, int);
 590void            xfs_iext_irec_compact(xfs_ifork_t *);
 591void            xfs_iext_irec_compact_pages(xfs_ifork_t *);
 592void            xfs_iext_irec_compact_full(xfs_ifork_t *);
 593void            xfs_iext_irec_update_extoffs(xfs_ifork_t *, int, int);
 594
 595#define xfs_ipincount(ip)       ((unsigned int) atomic_read(&ip->i_pincount))
 596
 597#if defined(DEBUG)
 598void            xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
 599#else
 600#define xfs_inobp_check(mp, bp)
 601#endif /* DEBUG */
 602
 603extern struct kmem_zone *xfs_ifork_zone;
 604extern struct kmem_zone *xfs_inode_zone;
 605extern struct kmem_zone *xfs_ili_zone;
 606
 607#endif  /* __XFS_INODE_H__ */
 608
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.