⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xfs_inode.h

📁 linux 内核源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -