xfs_trans.h

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

H
1,043
字号
/* * Copyright (c) 2000-2002 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_TRANS_H__#define	__XFS_TRANS_H__/* * This is the structure written in the log at the head of * every transaction. It identifies the type and id of the * transaction, and contains the number of items logged by * the transaction so we know how many to expect during recovery. * * Do not change the below structure without redoing the code in * xlog_recover_add_to_trans() and xlog_recover_add_to_cont_trans(). */typedef struct xfs_trans_header {	uint		th_magic;		/* magic number */	uint		th_type;		/* transaction type */	__int32_t	th_tid;			/* transaction id (unused) */	uint		th_num_items;		/* num items logged by trans */} xfs_trans_header_t;#define	XFS_TRANS_HEADER_MAGIC	0x5452414e	/* TRAN *//* * Log item types. */#define	XFS_LI_5_3_BUF		0x1234	/* v1 bufs, 1-block inode buffers */#define	XFS_LI_5_3_INODE	0x1235	/* 1-block inode buffers */#define	XFS_LI_EFI		0x1236#define	XFS_LI_EFD		0x1237#define	XFS_LI_IUNLINK		0x1238#define	XFS_LI_6_1_INODE	0x1239	/* 4K non-aligned inode bufs */#define	XFS_LI_6_1_BUF		0x123a	/* v1, 4K inode buffers */#define	XFS_LI_INODE		0x123b	/* aligned ino chunks, var-size ibufs */#define	XFS_LI_BUF		0x123c	/* v2 bufs, variable sized inode bufs */#define	XFS_LI_DQUOT		0x123d#define	XFS_LI_QUOTAOFF		0x123e/* * Transaction types.  Used to distinguish types of buffers. */#define XFS_TRANS_SETATTR_NOT_SIZE	1#define XFS_TRANS_SETATTR_SIZE		2#define XFS_TRANS_INACTIVE		3#define XFS_TRANS_CREATE		4#define XFS_TRANS_CREATE_TRUNC		5#define XFS_TRANS_TRUNCATE_FILE		6#define XFS_TRANS_REMOVE		7#define XFS_TRANS_LINK			8#define XFS_TRANS_RENAME		9#define XFS_TRANS_MKDIR			10#define XFS_TRANS_RMDIR			11#define XFS_TRANS_SYMLINK		12#define XFS_TRANS_SET_DMATTRS		13#define XFS_TRANS_GROWFS		14#define XFS_TRANS_STRAT_WRITE		15#define XFS_TRANS_DIOSTRAT		16#define	XFS_TRANS_WRITE_SYNC		17#define	XFS_TRANS_WRITEID		18#define	XFS_TRANS_ADDAFORK		19#define	XFS_TRANS_ATTRINVAL		20#define	XFS_TRANS_ATRUNCATE		21#define	XFS_TRANS_ATTR_SET		22#define	XFS_TRANS_ATTR_RM		23#define	XFS_TRANS_ATTR_FLAG		24#define	XFS_TRANS_CLEAR_AGI_BUCKET	25#define XFS_TRANS_QM_SBCHANGE		26/* * Dummy entries since we use the transaction type to index into the * trans_type[] in xlog_recover_print_trans_head() */#define XFS_TRANS_DUMMY1		27#define XFS_TRANS_DUMMY2		28#define XFS_TRANS_QM_QUOTAOFF		29#define XFS_TRANS_QM_DQALLOC		30#define XFS_TRANS_QM_SETQLIM		31#define XFS_TRANS_QM_DQCLUSTER		32#define XFS_TRANS_QM_QINOCREATE		33#define XFS_TRANS_QM_QUOTAOFF_END	34#define XFS_TRANS_SB_UNIT		35#define XFS_TRANS_FSYNC_TS		36#define	XFS_TRANS_GROWFSRT_ALLOC	37#define	XFS_TRANS_GROWFSRT_ZERO		38#define	XFS_TRANS_GROWFSRT_FREE		39#define	XFS_TRANS_SWAPEXT		40/* new transaction types need to be reflected in xfs_logprint(8) */#ifdef __KERNEL__struct xfs_buf;struct xfs_buftarg;struct xfs_efd_log_item;struct xfs_efi_log_item;struct xfs_inode;struct xfs_item_ops;struct xfs_log_iovec;struct xfs_log_item;struct xfs_log_item_desc;struct xfs_mount;struct xfs_trans;struct xfs_dquot_acct;typedef struct xfs_ail_entry {	struct xfs_log_item	*ail_forw;	/* AIL forw pointer */	struct xfs_log_item	*ail_back;	/* AIL back pointer */} xfs_ail_entry_t;/* * This structure is passed as a parameter to xfs_trans_push_ail() * and is used to track the what LSN the waiting processes are * waiting to become unused. */typedef struct xfs_ail_ticket {	xfs_lsn_t		at_lsn;		/* lsn waitin for */	struct xfs_ail_ticket	*at_forw;	/* wait list ptr */	struct xfs_ail_ticket	*at_back;	/* wait list ptr */	sv_t			at_sema;	/* wait sema */} xfs_ail_ticket_t;typedef struct xfs_log_item {	xfs_ail_entry_t			li_ail;		/* AIL pointers */	xfs_lsn_t			li_lsn;		/* last on-disk lsn */	struct xfs_log_item_desc	*li_desc;	/* ptr to current desc*/	struct xfs_mount		*li_mountp;	/* ptr to fs mount */	uint				li_type;	/* item type */	uint				li_flags;	/* misc flags */	struct xfs_log_item		*li_bio_list;	/* buffer item list */	void				(*li_cb)(struct xfs_buf *,						 struct xfs_log_item *);							/* buffer item iodone */							/* callback func */	struct xfs_item_ops		*li_ops;	/* function list */} xfs_log_item_t;#define	XFS_LI_IN_AIL	0x1#define XFS_LI_ABORTED	0x2typedef struct xfs_item_ops {	uint (*iop_size)(xfs_log_item_t *);	void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *);	void (*iop_pin)(xfs_log_item_t *);	void (*iop_unpin)(xfs_log_item_t *, int);	void (*iop_unpin_remove)(xfs_log_item_t *, struct xfs_trans *);	uint (*iop_trylock)(xfs_log_item_t *);	void (*iop_unlock)(xfs_log_item_t *);	xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t);	void (*iop_push)(xfs_log_item_t *);	void (*iop_abort)(xfs_log_item_t *);	void (*iop_pushbuf)(xfs_log_item_t *);	void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t);} xfs_item_ops_t;#define IOP_SIZE(ip)		(*(ip)->li_ops->iop_size)(ip)#define IOP_FORMAT(ip,vp)	(*(ip)->li_ops->iop_format)(ip, vp)#define IOP_PIN(ip)		(*(ip)->li_ops->iop_pin)(ip)#define IOP_UNPIN(ip, flags)	(*(ip)->li_ops->iop_unpin)(ip, flags)#define IOP_UNPIN_REMOVE(ip,tp) (*(ip)->li_ops->iop_unpin_remove)(ip, tp)#define IOP_TRYLOCK(ip)		(*(ip)->li_ops->iop_trylock)(ip)#define IOP_UNLOCK(ip)		(*(ip)->li_ops->iop_unlock)(ip)#define IOP_COMMITTED(ip, lsn)	(*(ip)->li_ops->iop_committed)(ip, lsn)#define IOP_PUSH(ip)		(*(ip)->li_ops->iop_push)(ip)#define IOP_ABORT(ip)		(*(ip)->li_ops->iop_abort)(ip)#define IOP_PUSHBUF(ip)		(*(ip)->li_ops->iop_pushbuf)(ip)#define IOP_COMMITTING(ip, lsn) (*(ip)->li_ops->iop_committing)(ip, lsn)/* * Return values for the IOP_TRYLOCK() routines. */#define	XFS_ITEM_SUCCESS	0#define	XFS_ITEM_PINNED		1#define	XFS_ITEM_LOCKED		2#define	XFS_ITEM_FLUSHING	3#define XFS_ITEM_PUSHBUF	4#endif	/* __KERNEL__ *//* * This structure is used to track log items associated with * a transaction.  It points to the log item and keeps some * flags to track the state of the log item.  It also tracks * the amount of space needed to log the item it describes * once we get to commit processing (see xfs_trans_commit()). */typedef struct xfs_log_item_desc {	xfs_log_item_t	*lid_item;	ushort		lid_size;	unsigned char	lid_flags;	unsigned char	lid_index;} xfs_log_item_desc_t;#define XFS_LID_DIRTY		0x1#define XFS_LID_PINNED		0x2#define XFS_LID_BUF_STALE	0x8/* * This structure is used to maintain a chunk list of log_item_desc * structures. The free field is a bitmask indicating which descriptors * in this chunk's array are free.  The unused field is the first value * not used since this chunk was allocated. */#define	XFS_LIC_NUM_SLOTS	15typedef struct xfs_log_item_chunk {	struct xfs_log_item_chunk	*lic_next;	ushort				lic_free;	ushort				lic_unused;	xfs_log_item_desc_t		lic_descs[XFS_LIC_NUM_SLOTS];} xfs_log_item_chunk_t;#define	XFS_LIC_MAX_SLOT	(XFS_LIC_NUM_SLOTS - 1)#define	XFS_LIC_FREEMASK	((1 << XFS_LIC_NUM_SLOTS) - 1)/* * Initialize the given chunk.  Set the chunk's free descriptor mask * to indicate that all descriptors are free.  The caller gets to set * lic_unused to the right value (0 matches all free).  The * lic_descs.lid_index values are set up as each desc is allocated. */#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_INIT)void xfs_lic_init(xfs_log_item_chunk_t *cp);#define	XFS_LIC_INIT(cp)	xfs_lic_init(cp)#else#define	XFS_LIC_INIT(cp)	((cp)->lic_free = XFS_LIC_FREEMASK)#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_INIT_SLOT)void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot);#define	XFS_LIC_INIT_SLOT(cp,slot)	xfs_lic_init_slot(cp, slot)#else#define	XFS_LIC_INIT_SLOT(cp,slot)	\	((cp)->lic_descs[slot].lid_index = (unsigned char)(slot))#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_VACANCY)int xfs_lic_vacancy(xfs_log_item_chunk_t *cp);#define	XFS_LIC_VACANCY(cp)		xfs_lic_vacancy(cp)#else#define	XFS_LIC_VACANCY(cp)		(((cp)->lic_free) & XFS_LIC_FREEMASK)#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_ALL_FREE)void xfs_lic_all_free(xfs_log_item_chunk_t *cp);#define	XFS_LIC_ALL_FREE(cp)		xfs_lic_all_free(cp)#else#define	XFS_LIC_ALL_FREE(cp)		((cp)->lic_free = XFS_LIC_FREEMASK)#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_ARE_ALL_FREE)int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp);#define	XFS_LIC_ARE_ALL_FREE(cp)	xfs_lic_are_all_free(cp)#else#define	XFS_LIC_ARE_ALL_FREE(cp)	(((cp)->lic_free & XFS_LIC_FREEMASK) ==\					XFS_LIC_FREEMASK)#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_ISFREE)int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot);#define	XFS_LIC_ISFREE(cp,slot)	xfs_lic_isfree(cp,slot)#else#define	XFS_LIC_ISFREE(cp,slot)	((cp)->lic_free & (1 << (slot)))#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_CLAIM)void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot);#define	XFS_LIC_CLAIM(cp,slot)		xfs_lic_claim(cp,slot)#else#define	XFS_LIC_CLAIM(cp,slot)		((cp)->lic_free &= ~(1 << (slot)))#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_RELSE)void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot);#define	XFS_LIC_RELSE(cp,slot)		xfs_lic_relse(cp,slot)#else#define	XFS_LIC_RELSE(cp,slot)		((cp)->lic_free |= 1 << (slot))#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_SLOT)xfs_log_item_desc_t *xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot);#define	XFS_LIC_SLOT(cp,slot)		xfs_lic_slot(cp,slot)#else#define	XFS_LIC_SLOT(cp,slot)		(&((cp)->lic_descs[slot]))#endif#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_DESC_TO_SLOT)int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp);#define	XFS_LIC_DESC_TO_SLOT(dp)	xfs_lic_desc_to_slot(dp)#else#define	XFS_LIC_DESC_TO_SLOT(dp)	((uint)((dp)->lid_index))#endif/* * Calculate the address of a chunk given a descriptor pointer: * dp - dp->lid_index give the address of the start of the lic_descs array. * From this we subtract the offset of the lic_descs field in a chunk. * All of this yields the address of the chunk, which is * cast to a chunk pointer. */#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_LIC_DESC_TO_CHUNK)xfs_log_item_chunk_t *xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp);#define	XFS_LIC_DESC_TO_CHUNK(dp)	xfs_lic_desc_to_chunk(dp)#else#define	XFS_LIC_DESC_TO_CHUNK(dp)	((xfs_log_item_chunk_t*) \					(((xfs_caddr_t)((dp) - (dp)->lid_index)) -\					(xfs_caddr_t)(((xfs_log_item_chunk_t*) \					0)->lic_descs)))#endif#ifdef __KERNEL__/* * This structure is used to maintain a list of block ranges that have been * freed in the transaction.  The ranges are listed in the perag[] busy list * between when they're freed and the transaction is committed to disk. */typedef struct xfs_log_busy_slot {	xfs_agnumber_t		lbc_ag;	ushort			lbc_idx;	/* index in perag.busy[] */} xfs_log_busy_slot_t;#define XFS_LBC_NUM_SLOTS	31typedef struct xfs_log_busy_chunk {	struct xfs_log_busy_chunk	*lbc_next;	uint				lbc_free;	/* bitmask of free slots */	ushort				lbc_unused;	/* first unused */	xfs_log_busy_slot_t		lbc_busy[XFS_LBC_NUM_SLOTS];} xfs_log_busy_chunk_t;#define	XFS_LBC_MAX_SLOT	(XFS_LBC_NUM_SLOTS - 1)

⌨️ 快捷键说明

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