xfs_inode.h

来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 559 行 · 第 1/2 页

H
559
字号
/* * Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 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. * * Further, this software is distributed without any warranty that it is * free of the rightful claim of any third person regarding infringement * or the like.  Any license provided herein, whether implied or * otherwise, applies only to this software file.  Patent licenses, if * any, provided herein do not apply to combinations of this program with * other software, or any other product whatsoever. * * You should have received a copy of the GNU General Public License along * with this program; if not, write the Free Software Foundation, Inc., 59 * Temple Place - Suite 330, Boston MA 02111-1307, USA. * * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, * Mountain View, CA  94043, or: * * http://www.sgi.com * * For further information regarding this notice, see: * * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ */#ifndef	__XFS_INODE_H__#define	__XFS_INODE_H__/* * File incore extent information, present for each of data & attr forks. */#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_t	*if_extents;	/* linear map file exts */		char		*if_data;	/* inline file data */	} if_u1;	union {		xfs_bmbt_rec_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	0x0001	/* Inline data is read in */#define	XFS_IFEXTENTS	0x0002	/* All extent pointers are read in */#define	XFS_IFBROOT	0x0004	/* i_broot points to the bmap b-tree root *//* * Flags for xfs_imap() and xfs_dilocate(). */#define	XFS_IMAP_LOOKUP		0x1/* * Maximum number of extent pointers in if_u1.if_extents. */#define	XFS_MAX_INCORE_EXTENTS	32768#ifdef __KERNEL__struct bhv_desc;struct cred;struct ktrace;struct vnode;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)#endif/* * This structure is used to communicate which extents of a file * were holes when a write started from xfs_write_file() to * xfs_strat_read().  This is necessary so that we can know which * blocks need to be zeroed when they are read in in xfs_strat_read() * if they weren\'t allocated when the buffer given to xfs_strat_read() * was mapped. * * We keep a list of these attached to the inode.  The list is * protected by the inode lock and the fact that the io lock is * held exclusively by writers. */typedef struct xfs_gap {	struct xfs_gap	*xg_next;	xfs_fileoff_t	xg_offset_fsb;	xfs_extlen_t	xg_count_fsb;} xfs_gap_t;typedef 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 type used in the xfs inode hash table. * An array of these is allocated for each mounted * file system to hash the inodes for that file system. */typedef struct xfs_ihash {	struct xfs_inode	*ih_next;	rwlock_t		ih_lock;	uint			ih_version;} xfs_ihash_t;/* * Inode hashing and hash bucket locking. */#define XFS_BUCKETS(mp) (37*(mp)->m_sb.sb_agcount-1)#define XFS_IHASH(mp,ino) ((mp)->m_ihash + (((uint)(ino)) % (mp)->m_ihsize))/* * This is the xfs inode cluster hash.  This hash 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_chashlist {	struct xfs_chashlist	*chl_next;	struct xfs_inode	*chl_ip;	xfs_daddr_t		chl_blkno;	/* starting block number of						 * the cluster */	struct xfs_buf		*chl_buf;	/* the inode buffer */} xfs_chashlist_t;typedef struct xfs_chash {	xfs_chashlist_t		*ch_list;	lock_t			ch_lock;} xfs_chash_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 {	struct xfs_ihash	*ip_hash;	/* pointer to hash header */	struct xfs_inode	*ip_next;	/* inode hash link forw */	struct xfs_inode	*ip_mnext;	/* next inode in mount list */	struct xfs_inode	*ip_mprev;	/* ptr to prev inode */	struct xfs_inode	**ip_prevp;	/* ptr to prev i_next */	struct xfs_mount	*ip_mount;	/* fs mount struct ptr */} xfs_iptr_t;typedef struct xfs_inode {	/* Inode linking and identification information. */	struct xfs_ihash	*i_hash;	/* pointer to hash header */	struct xfs_inode	*i_next;	/* inode hash link forw */	struct xfs_inode	*i_mnext;	/* next inode in mount list */	struct xfs_inode	*i_mprev;	/* ptr to prev inode */	struct xfs_inode	**i_prevp;	/* ptr to prev i_next */	struct xfs_mount	*i_mount;	/* fs mount struct ptr */	struct list_head	i_reclaim;	/* reclaim list */	struct bhv_desc		i_bhv_desc;	/* inode behavior descriptor*/	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 */#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 */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?