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
 154        /* di_next_unlinked is the only non-core field in the old dinode */
 155        xfs_agino_t     di_next_unlinked;/* agi unlinked list ptr */
 156
 157        /* start of the extended dinode, writable fields */
 158        __uint32_t      di_crc;         /* CRC of the inode */
 159        __uint64_t      di_changecount; /* number of attribute changes */
 160        xfs_lsn_t       di_lsn;         /* flush sequence */
 161        __uint64_t      di_flags2;      /* more random flags */
 162        __uint8_t       di_pad2[16];    /* more padding for future expansion */
 163
 164        /* fields only written to during inode creation */
 165        xfs_ictimestamp_t di_crtime;    /* time created */
 166        xfs_ino_t       di_ino;         /* inode number */
 167        uuid_t          di_uuid;        /* UUID of the filesystem */
 168
 169        /* structure must be padded to 64 bit alignment */
 170} xfs_icdinode_t;
 171
 172static inline uint xfs_icdinode_size(int version)
 173{
 174        if (version == 3)
 175                return sizeof(struct xfs_icdinode);
 176        return offsetof(struct xfs_icdinode, di_next_unlinked);
 177}
 178
 179/*
 180 * Flags for xfs_ichgtime().
 181 */
 182#define XFS_ICHGTIME_MOD        0x1     /* data fork modification timestamp */
 183#define XFS_ICHGTIME_CHG        0x2     /* inode field change timestamp */
 184#define XFS_ICHGTIME_CREATE     0x4     /* inode create timestamp */
 185
 186/*
 187 * Per-fork incore inode flags.
 188 */
 189#define XFS_IFINLINE    0x01    /* Inline data is read in */
 190#define XFS_IFEXTENTS   0x02    /* All extent pointers are read in */
 191#define XFS_IFBROOT     0x04    /* i_broot points to the bmap b-tree root */
 192#define XFS_IFEXTIREC   0x08    /* Indirection array of extent blocks */
 193
 194/*
 195 * Fork handling.
 196 */
 197
 198#define XFS_IFORK_Q(ip)                 ((ip)->i_d.di_forkoff != 0)
 199#define XFS_IFORK_BOFF(ip)              ((int)((ip)->i_d.di_forkoff << 3))
 200
 201#define XFS_IFORK_PTR(ip,w)             \
 202        ((w) == XFS_DATA_FORK ? \
 203                &(ip)->i_df : \
 204                (ip)->i_afp)
 205#define XFS_IFORK_DSIZE(ip) \
 206        (XFS_IFORK_Q(ip) ? \
 207                XFS_IFORK_BOFF(ip) : \
 208                XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version))
 209#define XFS_IFORK_ASIZE(ip) \
 210        (XFS_IFORK_Q(ip) ? \
 211                XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \
 212                        XFS_IFORK_BOFF(ip) : \
 213                0)
 214#define XFS_IFORK_SIZE(ip,w) \
 215        ((w) == XFS_DATA_FORK ? \
 216                XFS_IFORK_DSIZE(ip) : \
 217                XFS_IFORK_ASIZE(ip))
 218#define XFS_IFORK_FORMAT(ip,w) \
 219        ((w) == XFS_DATA_FORK ? \
 220                (ip)->i_d.di_format : \
 221                (ip)->i_d.di_aformat)
 222#define XFS_IFORK_FMT_SET(ip,w,n) \
 223        ((w) == XFS_DATA_FORK ? \
 224                ((ip)->i_d.di_format = (n)) : \
 225                ((ip)->i_d.di_aformat = (n)))
 226#define XFS_IFORK_NEXTENTS(ip,w) \
 227        ((w) == XFS_DATA_FORK ? \
 228                (ip)->i_d.di_nextents : \
 229                (ip)->i_d.di_anextents)
 230#define XFS_IFORK_NEXT_SET(ip,w,n) \
 231        ((w) == XFS_DATA_FORK ? \
 232                ((ip)->i_d.di_nextents = (n)) : \
 233                ((ip)->i_d.di_anextents = (n)))
 234#define XFS_IFORK_MAXEXT(ip, w) \
 235        (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t))
 236
 237
 238#ifdef __KERNEL__
 239
 240struct xfs_buf;
 241struct xfs_bmap_free;
 242struct xfs_bmbt_irec;
 243struct xfs_inode_log_item;
 244struct xfs_mount;
 245struct xfs_trans;
 246struct xfs_dquot;
 247
 248typedef struct xfs_inode {
 249        /* Inode linking and identification information. */
 250        struct xfs_mount        *i_mount;       /* fs mount struct ptr */
 251        struct xfs_dquot        *i_udquot;      /* user dquot */
 252        struct xfs_dquot        *i_gdquot;      /* group dquot */
 253        struct xfs_dquot        *i_pdquot;      /* project dquot */
 254
 255        /* Inode location stuff */
 256        xfs_ino_t               i_ino;          /* inode number (agno/agino)*/
 257        struct xfs_imap         i_imap;         /* location for xfs_imap() */
 258
 259        /* Extent information. */
 260        xfs_ifork_t             *i_afp;         /* attribute fork pointer */
 261        xfs_ifork_t             i_df;           /* data fork */
 262
 263        /* Transaction and locking information. */
 264        struct xfs_inode_log_item *i_itemp;     /* logging information */
 265        mrlock_t                i_lock;         /* inode lock */
 266        mrlock_t                i_iolock;       /* inode IO lock */
 267        atomic_t                i_pincount;     /* inode pin count */
 268        spinlock_t              i_flags_lock;   /* inode i_flags lock */
 269        /* Miscellaneous state. */
 270        unsigned long           i_flags;        /* see defined flags below */
 271        unsigned int            i_delayed_blks; /* count of delay alloc blks */
 272
 273        xfs_icdinode_t          i_d;            /* most of ondisk inode */
 274
 275        /* VFS inode */
 276        struct inode            i_vnode;        /* embedded VFS inode */
 277} xfs_inode_t;
 278
 279/* Convert from vfs inode to xfs inode */
 280static inline struct xfs_inode *XFS_I(struct inode *inode)
 281{
 282        return container_of(inode, struct xfs_inode, i_vnode);
 283}
 284
 285/* convert from xfs inode to vfs inode */
 286static inline struct inode *VFS_I(struct xfs_inode *ip)
 287{
 288        return &ip->i_vnode;
 289}
 290
 291/*
 292 * For regular files we only update the on-disk filesize when actually
 293 * writing data back to disk.  Until then only the copy in the VFS inode
 294 * is uptodate.
 295 */
 296static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip)
 297{
 298        if (S_ISREG(ip->i_d.di_mode))
 299                return i_size_read(VFS_I(ip));
 300        return ip->i_d.di_size;
 301}
 302
 303/*
 304 * If this I/O goes past the on-disk inode size update it unless it would
 305 * be past the current in-core inode size.
 306 */
 307static inline xfs_fsize_t
 308xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size)
 309{
 310        xfs_fsize_t i_size = i_size_read(VFS_I(ip));
 311
 312        if (new_size > i_size)
 313                new_size = i_size;
 314        return new_size > ip->i_d.di_size ? new_size : 0;
 315}
 316
 317/*
 318 * i_flags helper functions
 319 */
 320static inline void
 321__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
 322{
 323        ip->i_flags |= flags;
 324}
 325
 326static inline void
 327xfs_iflags_set(xfs_inode_t *ip, unsigned short flags)
 328{
 329        spin_lock(&ip->i_flags_lock);
 330        __xfs_iflags_set(ip, flags);
 331        spin_unlock(&ip->i_flags_lock);
 332}
 333
 334static inline void
 335xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags)
 336{
 337        spin_lock(&ip->i_flags_lock);
 338        ip->i_flags &= ~flags;
 339        spin_unlock(&ip->i_flags_lock);
 340}
 341
 342static inline int
 343__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
 344{
 345        return (ip->i_flags & flags);
 346}
 347
 348static inline int
 349xfs_iflags_test(xfs_inode_t *ip, unsigned short flags)
 350{
 351        int ret;
 352        spin_lock(&ip->i_flags_lock);
 353        ret = __xfs_iflags_test(ip, flags);
 354        spin_unlock(&ip->i_flags_lock);
 355        return ret;
 356}
 357
 358static inline int
 359xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags)
 360{
 361        int ret;
 362
 363        spin_lock(&ip->i_flags_lock);
 364        ret = ip->i_flags & flags;
 365        if (ret)
 366                ip->i_flags &= ~flags;
 367        spin_unlock(&ip->i_flags_lock);
 368        return ret;
 369}
 370
 371static inline int
 372xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags)
 373{
 374        int ret;
 375
 376        spin_lock(&ip->i_flags_lock);
 377        ret = ip->i_flags & flags;
 378        if (!ret)
 379                ip->i_flags |= flags;
 380        spin_unlock(&ip->i_flags_lock);
 381        return ret;
 382}
 383
 384/*
 385 * Project quota id helpers (previously projid was 16bit only
 386 * and using two 16bit values to hold new 32bit projid was chosen
 387 * to retain compatibility with "old" filesystems).
 388 */
 389static inline prid_t
 390xfs_get_projid(struct xfs_inode *ip)
 391{
 392        return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo;
 393}
 394
 395static inline void
 396xfs_set_projid(struct xfs_inode *ip,
 397                prid_t projid)
 398{
 399        ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16);
 400        ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff);
 401}
 402
 403/*
 404 * In-core inode flags.
 405 */
 406#define XFS_IRECLAIM            (1 << 0) /* started reclaiming this inode */
 407#define XFS_ISTALE              (1 << 1) /* inode has been staled */
 408#define XFS_IRECLAIMABLE        (1 << 2) /* inode can be reclaimed */
 409#define XFS_INEW                (1 << 3) /* inode has just been allocated */
 410#define XFS_IFILESTREAM         (1 << 4) /* inode is in a filestream dir. */
 411#define XFS_ITRUNCATED          (1 << 5) /* truncated down so flush-on-close */
 412#define XFS_IDIRTY_RELEASE      (1 << 6) /* dirty release already seen */
 413#define __XFS_IFLOCK_BIT        7        /* inode is being flushed right now */
 414#define XFS_IFLOCK              (1 << __XFS_IFLOCK_BIT)
 415#define __XFS_IPINNED_BIT       8        /* wakeup key for zero pin count */
 416#define XFS_IPINNED             (1 << __XFS_IPINNED_BIT)
 417#define XFS_IDONTCACHE          (1 << 9) /* don't cache the inode long term */
 418
 419/*
 420 * Per-lifetime flags need to be reset when re-using a reclaimable inode during
 421 * inode lookup. This prevents unintended behaviour on the new inode from
 422 * ocurring.
 423 */
 424#define XFS_IRECLAIM_RESET_FLAGS        \
 425        (XFS_IRECLAIMABLE | XFS_IRECLAIM | \
 426         XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \
 427         XFS_IFILESTREAM);
 428
 429/*
 430 * Synchronize processes attempting to flush the in-core inode back to disk.
 431 */
 432
 433extern void __xfs_iflock(struct xfs_inode *ip);
 434
 435static inline int xfs_iflock_nowait(struct xfs_inode *ip)
 436{
 437        return !xfs_iflags_test_and_set(ip, XFS_IFLOCK);
 438}
 439
 440static inline void xfs_iflock(struct xfs_inode *ip)
 441{
 442        if (!xfs_iflock_nowait(ip))
 443                __xfs_iflock(ip);
 444}
 445
 446static inline void xfs_ifunlock(struct xfs_inode *ip)
 447{
 448        xfs_iflags_clear(ip, XFS_IFLOCK);
 449        smp_mb();
 450        wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT);
 451}
 452
 453static inline int xfs_isiflocked(struct xfs_inode *ip)
 454{
 455        return xfs_iflags_test(ip, XFS_IFLOCK);
 456}
 457
 458/*
 459 * Flags for inode locking.
 460 * Bit ranges:  1<<1  - 1<<16-1 -- iolock/ilock modes (bitfield)
 461 *              1<<16 - 1<<32-1 -- lockdep annotation (integers)
 462 */
 463#define XFS_IOLOCK_EXCL         (1<<0)
 464#define XFS_IOLOCK_SHARED       (1<<1)
 465#define XFS_ILOCK_EXCL          (1<<2)
 466#define XFS_ILOCK_SHARED        (1<<3)
 467
 468#define XFS_LOCK_MASK           (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \
 469                                | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED)
 470
 471#define XFS_LOCK_FLAGS \
 472        { XFS_IOLOCK_EXCL,      "IOLOCK_EXCL" }, \
 473        { XFS_IOLOCK_SHARED,    "IOLOCK_SHARED" }, \
 474        { XFS_ILOCK_EXCL,       "ILOCK_EXCL" }, \
 475        { XFS_ILOCK_SHARED,     "ILOCK_SHARED" }
 476
 477
 478/*
 479 * Flags for lockdep annotations.
 480 *
 481 * XFS_LOCK_PARENT - for directory operations that require locking a
 482 * parent directory inode and a child entry inode.  The parent gets locked
 483 * with this flag so it gets a lockdep subclass of 1 and the child entry
 484 * lock will have a lockdep subclass of 0.
 485 *
 486 * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary
 487 * inodes do not participate in the normal lock order, and thus have their
 488 * own subclasses.
 489 *
 490 * XFS_LOCK_INUMORDER - for locking several inodes at the some time
 491 * with xfs_lock_inodes().  This flag is used as the starting subclass
 492 * and each subsequent lock acquired will increment the subclass by one.
 493 * So the first lock acquired will have a lockdep subclass of 4, the
 494 * second lock will have a lockdep subclass of 5, and so on. It is
 495 * the responsibility of the class builder to shift this to the correct
 496 * portion of the lock_mode lockdep mask.
 497 */
 498#define XFS_LOCK_PARENT         1
 499#define XFS_LOCK_RTBITMAP       2
 500#define XFS_LOCK_RTSUM          3
 501#define XFS_LOCK_INUMORDER      4
 502
 503#define XFS_IOLOCK_SHIFT        16
 504#define XFS_IOLOCK_PARENT       (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT)
 505
 506#define XFS_ILOCK_SHIFT         24
 507#define XFS_ILOCK_PARENT        (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT)
 508#define XFS_ILOCK_RTBITMAP      (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT)
 509#define XFS_ILOCK_RTSUM         (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT)
 510
 511#define XFS_IOLOCK_DEP_MASK     0x00ff0000
 512#define XFS_ILOCK_DEP_MASK      0xff000000
 513#define XFS_LOCK_DEP_MASK       (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK)
 514
 515#define XFS_IOLOCK_DEP(flags)   (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT)
 516#define XFS_ILOCK_DEP(flags)    (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT)
 517
 518/*
 519 * For multiple groups support: if S_ISGID bit is set in the parent
 520 * directory, group of new file is set to that of the parent, and
 521 * new subdirectory gets S_ISGID bit from parent.
 522 */
 523#define XFS_INHERIT_GID(pip)    \
 524        (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \
 525         ((pip)->i_d.di_mode & S_ISGID))
 526
 527
 528/*
 529 * xfs_inode.c prototypes.
 530 */
 531void            xfs_ilock(xfs_inode_t *, uint);
 532int             xfs_ilock_nowait(xfs_inode_t *, uint);
 533void            xfs_iunlock(xfs_inode_t *, uint);
 534void            xfs_ilock_demote(xfs_inode_t *, uint);
 535int             xfs_isilocked(xfs_inode_t *, uint);
 536uint            xfs_ilock_map_shared(xfs_inode_t *);
 537void            xfs_iunlock_map_shared(xfs_inode_t *, uint);
 538int             xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t,
 539                           xfs_nlink_t, xfs_dev_t, prid_t, int,
 540                           struct xfs_buf **, xfs_inode_t **);
 541
 542uint            xfs_ip2xflags(struct xfs_inode *);
 543uint            xfs_dic2xflags(struct xfs_dinode *);
 544int             xfs_ifree(struct xfs_trans *, xfs_inode_t *,
 545                           struct xfs_bmap_free *);
 546int             xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *,
 547                                      int, xfs_fsize_t);
 548int             xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
 549
 550void            xfs_iext_realloc(xfs_inode_t *, int, int);
 551void            xfs_iunpin_wait(xfs_inode_t *);
 552int             xfs_iflush(struct xfs_inode *, struct xfs_buf **);
 553void            xfs_lock_inodes(xfs_inode_t **, int, uint);
 554void            xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint);
 555
 556xfs_extlen_t    xfs_get_extsz_hint(struct xfs_inode *ip);
 557
 558#define IHOLD(ip) \
 559do { \
 560        ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \
 561        ihold(VFS_I(ip)); \
 562        trace_xfs_ihold(ip, _THIS_IP_); \
 563} while (0)
 564
 565#define IRELE(ip) \
 566do { \
 567        trace_xfs_irele(ip, _THIS_IP_); \
 568        iput(VFS_I(ip)); \
 569} while (0)
 570
 571#endif /* __KERNEL__ */
 572
 573/*
 574 * Flags for xfs_iget()
 575 */
 576#define XFS_IGET_CREATE         0x1
 577#define XFS_IGET_UNTRUSTED      0x2
 578#define XFS_IGET_DONTCACHE      0x4
 579
 580int             xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
 581                               struct xfs_imap *, struct xfs_dinode **,
 582                               struct xfs_buf **, uint, uint);
 583int             xfs_iread(struct xfs_mount *, struct xfs_trans *,
 584                          struct xfs_inode *, uint);
 585void            xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
 586void            xfs_dinode_to_disk(struct xfs_dinode *,
 587                                   struct xfs_icdinode *);
 588void            xfs_idestroy_fork(struct xfs_inode *, int);
 589void            xfs_idata_realloc(struct xfs_inode *, int, int);
 590void            xfs_iroot_realloc(struct xfs_inode *, int, int);
 591int             xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int);
 592int             xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int);
 593
 594xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t);
 595void            xfs_iext_insert(xfs_inode_t *, xfs_extnum_t, xfs_extnum_t,
 596                                xfs_bmbt_irec_t *, int);
 597void            xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int);
 598void            xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int);
 599void            xfs_iext_remove(xfs_inode_t *, xfs_extnum_t, int, int);
 600void            xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int);
 601void            xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int);
 602void            xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int);
 603void            xfs_iext_realloc_direct(xfs_ifork_t *, int);
 604void            xfs_iext_direct_to_inline(xfs_ifork_t *, xfs_extnum_t);
 605void            xfs_iext_inline_to_direct(xfs_ifork_t *, int);
 606void            xfs_iext_destroy(xfs_ifork_t *);
 607xfs_bmbt_rec_host_t *xfs_iext_bno_to_ext(xfs_ifork_t *, xfs_fileoff_t, int *);
 608xfs_ext_irec_t  *xfs_iext_bno_to_irec(xfs_ifork_t *, xfs_fileoff_t, int *);
 609xfs_ext_irec_t  *xfs_iext_idx_to_irec(xfs_ifork_t *, xfs_extnum_t *, int *, int);
 610void            xfs_iext_irec_init(xfs_ifork_t *);
 611xfs_ext_irec_t *xfs_iext_irec_new(xfs_ifork_t *, int);
 612void            xfs_iext_irec_remove(xfs_ifork_t *, int);
 613void            xfs_iext_irec_compact(xfs_ifork_t *);
 614void            xfs_iext_irec_compact_pages(xfs_ifork_t *);
 615void            xfs_iext_irec_compact_full(xfs_ifork_t *);
 616void            xfs_iext_irec_update_extoffs(xfs_ifork_t *, int, int);
 617bool            xfs_can_free_eofblocks(struct xfs_inode *, bool);
 618
 619#define xfs_ipincount(ip)       ((unsigned int) atomic_read(&ip->i_pincount))
 620
 621#if defined(DEBUG)
 622void            xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
 623#else
 624#define xfs_inobp_check(mp, bp)
 625#endif /* DEBUG */
 626
 627extern struct kmem_zone *xfs_ifork_zone;
 628extern struct kmem_zone *xfs_inode_zone;
 629extern struct kmem_zone *xfs_ili_zone;
 630extern const struct xfs_buf_ops xfs_inode_buf_ops;
 631
 632#endif  /* __XFS_INODE_H__ */
 633
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.