📄 xfs_inode.h
字号:
/* * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it would be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */#ifndef __XFS_INODE_H__#define __XFS_INODE_H__struct xfs_dinode;struct xfs_dinode_core;/* * Fork identifiers. */#define XFS_DATA_FORK 0#define XFS_ATTR_FORK 1/* * The following xfs_ext_irec_t struct introduces a second (top) level * to the in-core extent allocation scheme. These structs are allocated * in a contiguous block, creating an indirection array where each entry * (irec) contains a pointer to a buffer of in-core extent records which * it manages. Each extent buffer is 4k in size, since 4k is the system * page size on Linux i386 and systems with larger page sizes don't seem * to gain much, if anything, by using their native page size as the * extent buffer size. Also, using 4k extent buffers everywhere provides * a consistent interface for CXFS across different platforms. * * There is currently no limit on the number of irec's (extent lists) * allowed, so heavily fragmented files may require an indirection array * which spans multiple system pages of memory. The number of extents * which would require this amount of contiguous memory is very large * and should not cause problems in the foreseeable future. However, * if the memory needed for the contiguous array ever becomes a problem, * it is possible that a third level of indirection may be required. */typedef struct xfs_ext_irec { xfs_bmbt_rec_host_t *er_extbuf; /* block of extent records */ xfs_extnum_t er_extoff; /* extent offset in file */ xfs_extnum_t er_extcount; /* number of extents in page/block */} xfs_ext_irec_t;/* * File incore extent information, present for each of data & attr forks. */#define XFS_IEXT_BUFSZ 4096#define XFS_LINEAR_EXTS (XFS_IEXT_BUFSZ / (uint)sizeof(xfs_bmbt_rec_t))#define XFS_INLINE_EXTS 2#define XFS_INLINE_DATA 32typedef struct xfs_ifork { int if_bytes; /* bytes in if_u1 */ int if_real_bytes; /* bytes allocated in if_u1 */ xfs_bmbt_block_t *if_broot; /* file's incore btree root */ short if_broot_bytes; /* bytes allocated for root */ unsigned char if_flags; /* per-fork flags */ unsigned char if_ext_max; /* max # of extent records */ xfs_extnum_t if_lastex; /* last if_extents used */ union { xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ xfs_ext_irec_t *if_ext_irec; /* irec map file exts */ char *if_data; /* inline file data */ } if_u1; union { xfs_bmbt_rec_host_t if_inline_ext[XFS_INLINE_EXTS]; /* very small file extents */ char if_inline_data[XFS_INLINE_DATA]; /* very small file data */ xfs_dev_t if_rdev; /* dev number if special */ uuid_t if_uuid; /* mount point value */ } if_u2;} xfs_ifork_t;/* * Flags for xfs_ichgtime(). */#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */#define XFS_ICHGTIME_ACC 0x2 /* data fork access timestamp */#define XFS_ICHGTIME_CHG 0x4 /* inode field change timestamp *//* * Per-fork incore inode flags. */#define XFS_IFINLINE 0x01 /* Inline data is read in */#define XFS_IFEXTENTS 0x02 /* All extent pointers are read in */#define XFS_IFBROOT 0x04 /* i_broot points to the bmap b-tree root */#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks *//* * Flags for xfs_itobp(), xfs_imap() and xfs_dilocate(). */#define XFS_IMAP_LOOKUP 0x1#define XFS_IMAP_BULKSTAT 0x2#ifdef __KERNEL__struct bhv_desc;struct cred;struct ktrace;struct xfs_buf;struct xfs_bmap_free;struct xfs_bmbt_irec;struct xfs_bmbt_block;struct xfs_inode;struct xfs_inode_log_item;struct xfs_mount;struct xfs_trans;struct xfs_dquot;#if defined(XFS_ILOCK_TRACE)#define XFS_ILOCK_KTRACE_SIZE 32extern ktrace_t *xfs_ilock_trace_buf;extern void xfs_ilock_trace(struct xfs_inode *, int, unsigned int, inst_t *);#else#define xfs_ilock_trace(i,n,f,ra)#endiftypedef struct dm_attrs_s { __uint32_t da_dmevmask; /* DMIG event mask */ __uint16_t da_dmstate; /* DMIG state info */ __uint16_t da_pad; /* DMIG extra padding */} dm_attrs_t;typedef struct xfs_iocore { void *io_obj; /* pointer to container * inode or dcxvn structure */ struct xfs_mount *io_mount; /* fs mount struct ptr */#ifdef DEBUG mrlock_t *io_lock; /* inode IO lock */ mrlock_t *io_iolock; /* inode IO lock */#endif /* I/O state */ xfs_fsize_t io_new_size; /* sz when write completes */ /* Miscellaneous state. */ unsigned int io_flags; /* IO related flags */ /* DMAPI state */ dm_attrs_t io_dmattrs;} xfs_iocore_t;#define io_dmevmask io_dmattrs.da_dmevmask#define io_dmstate io_dmattrs.da_dmstate#define XFS_IO_INODE(io) ((xfs_inode_t *) ((io)->io_obj))#define XFS_IO_DCXVN(io) ((dcxvn_t *) ((io)->io_obj))/* * Flags in the flags field */#define XFS_IOCORE_RT 0x1/* * xfs_iocore prototypes */extern void xfs_iocore_inode_init(struct xfs_inode *);extern void xfs_iocore_inode_reinit(struct xfs_inode *);/* * This is the xfs inode cluster structure. This structure is used by * xfs_iflush to find inodes that share a cluster and can be flushed to disk at * the same time. */typedef struct xfs_icluster { struct hlist_head icl_inodes; /* list of inodes on cluster */ xfs_daddr_t icl_blkno; /* starting block number of * the cluster */ struct xfs_buf *icl_buf; /* the inode buffer */ lock_t icl_lock; /* inode list lock */} xfs_icluster_t;/* * This is the xfs in-core inode structure. * Most of the on-disk inode is embedded in the i_d field. * * The extent pointers/inline file space, however, are managed * separately. The memory for this information is pointed to by * the if_u1 unions depending on the type of the data. * This is used to linearize the array of extents for fast in-core * access. This is used until the file's number of extents * surpasses XFS_MAX_INCORE_EXTENTS, at which point all extent pointers * are accessed through the buffer cache. * * Other state kept in the in-core inode is used for identification, * locking, transactional updating, etc of the inode. * * Generally, we do not want to hold the i_rlock while holding the * i_ilock. Hierarchy is i_iolock followed by i_rlock. * * xfs_iptr_t contains all the inode fields upto and including the * i_mnext and i_mprev fields, it is used as a marker in the inode * chain off the mount structure by xfs_sync calls. */typedef struct xfs_ictimestamp { __int32_t t_sec; /* timestamp seconds */ __int32_t t_nsec; /* timestamp nanoseconds */} xfs_ictimestamp_t;/* * NOTE: This structure must be kept identical to struct xfs_dinode_core * in xfs_dinode.h except for the endianess annotations. */typedef struct xfs_icdinode { __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ __uint16_t di_mode; /* mode and type of file */ __int8_t di_version; /* inode version */ __int8_t di_format; /* format of di_c data */ __uint16_t di_onlink; /* old number of links to file */ __uint32_t di_uid; /* owner's user id */ __uint32_t di_gid; /* owner's group id */ __uint32_t di_nlink; /* number of links to file */ __uint16_t di_projid; /* owner's project id */ __uint8_t di_pad[8]; /* unused, zeroed space */ __uint16_t di_flushiter; /* incremented on flush */ xfs_ictimestamp_t di_atime; /* time last accessed */ xfs_ictimestamp_t di_mtime; /* time last modified */ xfs_ictimestamp_t di_ctime; /* time created/inode modified */ xfs_fsize_t di_size; /* number of bytes in file */ xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */ xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ xfs_extnum_t di_nextents; /* number of extents in data fork */ xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ __int8_t di_aformat; /* format of attr fork's data */ __uint32_t di_dmevmask; /* DMIG event mask */ __uint16_t di_dmstate; /* DMIG state info */ __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint32_t di_gen; /* generation number */} xfs_icdinode_t;typedef struct { struct xfs_inode *ip_mnext; /* next inode in mount list */ struct xfs_inode *ip_mprev; /* ptr to prev inode */ struct xfs_mount *ip_mount; /* fs mount struct ptr */} xfs_iptr_t;typedef struct xfs_inode { /* Inode linking and identification information. */ struct xfs_inode *i_mnext; /* next inode in mount list */ struct xfs_inode *i_mprev; /* ptr to prev inode */ struct xfs_mount *i_mount; /* fs mount struct ptr */ struct list_head i_reclaim; /* reclaim list */ bhv_vnode_t *i_vnode; /* vnode backpointer */ struct xfs_dquot *i_udquot; /* user dquot */ struct xfs_dquot *i_gdquot; /* group dquot */ /* Inode location stuff */ xfs_ino_t i_ino; /* inode number (agno/agino)*/ xfs_daddr_t i_blkno; /* blkno of inode buffer */ ushort i_len; /* len of inode buffer */ ushort i_boffset; /* off of inode in buffer */ /* Extent information. */ xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ /* Transaction and locking information. */ struct xfs_trans *i_transp; /* ptr to owning transaction*/ struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ mrlock_t i_iolock; /* inode IO lock */ sema_t i_flock; /* inode flush lock */ atomic_t i_pincount; /* inode pin count */ wait_queue_head_t i_ipin_wait; /* inode pinning wait queue */ spinlock_t i_flags_lock; /* inode i_flags lock */#ifdef HAVE_REFCACHE struct xfs_inode **i_refcache; /* ptr to entry in ref cache */ struct xfs_inode *i_release; /* inode to unref */#endif /* I/O state */ xfs_iocore_t i_iocore; /* I/O core */ /* Miscellaneous state. */ unsigned short i_flags; /* see defined flags below */ unsigned char i_update_core; /* timestamps/size is dirty */ unsigned char i_update_size; /* di_size field is dirty */ unsigned int i_gen; /* generation count */ unsigned int i_delayed_blks; /* count of delay alloc blks */ xfs_icdinode_t i_d; /* most of ondisk inode */ xfs_icluster_t *i_cluster; /* cluster list header */ struct hlist_node i_cnode; /* cluster link node */ xfs_fsize_t i_size; /* in-memory size */ atomic_t i_iocount; /* outstanding I/O count */ /* Trace buffers per inode. */#ifdef XFS_VNODE_TRACE struct ktrace *i_trace; /* general inode trace */#endif#ifdef XFS_BMAP_TRACE struct ktrace *i_xtrace; /* inode extent list trace */#endif#ifdef XFS_BMBT_TRACE struct ktrace *i_btrace; /* inode bmap btree trace */#endif#ifdef XFS_RW_TRACE struct ktrace *i_rwtrace; /* inode read/write trace */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -