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

📄 xfs_trans.h

📁 linux 内核源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (c) 2000-2002,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_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_EFI		0x1236#define	XFS_LI_EFD		0x1237#define	XFS_LI_IUNLINK		0x1238#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#define	XFS_TRANS_SB_COUNT		41#define	XFS_TRANS_TYPE_MAX		41/* 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;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_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_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. */#define	XFS_LIC_INIT(cp)	xfs_lic_init(cp)static inline void xfs_lic_init(xfs_log_item_chunk_t *cp){	cp->lic_free = XFS_LIC_FREEMASK;}#define	XFS_LIC_INIT_SLOT(cp,slot)	xfs_lic_init_slot(cp, slot)static inline void xfs_lic_init_slot(xfs_log_item_chunk_t *cp, int slot){	cp->lic_descs[slot].lid_index = (unsigned char)(slot);}#define	XFS_LIC_VACANCY(cp)		xfs_lic_vacancy(cp)static inline int xfs_lic_vacancy(xfs_log_item_chunk_t *cp){	return cp->lic_free & XFS_LIC_FREEMASK;}#define	XFS_LIC_ALL_FREE(cp)		xfs_lic_all_free(cp)static inline void xfs_lic_all_free(xfs_log_item_chunk_t *cp){	cp->lic_free = XFS_LIC_FREEMASK;}#define	XFS_LIC_ARE_ALL_FREE(cp)	xfs_lic_are_all_free(cp)static inline int xfs_lic_are_all_free(xfs_log_item_chunk_t *cp){	return ((cp->lic_free & XFS_LIC_FREEMASK) == XFS_LIC_FREEMASK);}#define	XFS_LIC_ISFREE(cp,slot)	xfs_lic_isfree(cp,slot)static inline int xfs_lic_isfree(xfs_log_item_chunk_t *cp, int slot){	return (cp->lic_free & (1 << slot));}#define	XFS_LIC_CLAIM(cp,slot)		xfs_lic_claim(cp,slot)static inline void xfs_lic_claim(xfs_log_item_chunk_t *cp, int slot){	cp->lic_free &= ~(1 << slot);}#define	XFS_LIC_RELSE(cp,slot)		xfs_lic_relse(cp,slot)static inline void xfs_lic_relse(xfs_log_item_chunk_t *cp, int slot){	cp->lic_free |= 1 << slot;}#define	XFS_LIC_SLOT(cp,slot)		xfs_lic_slot(cp,slot)static inline xfs_log_item_desc_t *xfs_lic_slot(xfs_log_item_chunk_t *cp, int slot){	return &(cp->lic_descs[slot]);}#define	XFS_LIC_DESC_TO_SLOT(dp)	xfs_lic_desc_to_slot(dp)static inline int xfs_lic_desc_to_slot(xfs_log_item_desc_t *dp){	return (uint)dp->lid_index;}/* * 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. */#define	XFS_LIC_DESC_TO_CHUNK(dp)	xfs_lic_desc_to_chunk(dp)static inline xfs_log_item_chunk_t *xfs_lic_desc_to_chunk(xfs_log_item_desc_t *dp){	return (xfs_log_item_chunk_t*) \		(((xfs_caddr_t)((dp) - (dp)->lid_index)) - \		(xfs_caddr_t)(((xfs_log_item_chunk_t*)0)->lic_descs));}#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;	/* free slots bitmask */	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)#define	XFS_LBC_FREEMASK	((1U << XFS_LBC_NUM_SLOTS) - 1)#define	XFS_LBC_INIT(cp)	((cp)->lbc_free = XFS_LBC_FREEMASK)#define	XFS_LBC_CLAIM(cp, slot)	((cp)->lbc_free &= ~(1 << (slot)))#define	XFS_LBC_SLOT(cp, slot)	(&((cp)->lbc_busy[(slot)]))#define	XFS_LBC_VACANCY(cp)	(((cp)->lbc_free) & XFS_LBC_FREEMASK)#define	XFS_LBC_ISFREE(cp, slot) ((cp)->lbc_free & (1 << (slot)))/* * This is the type of function which can be given to xfs_trans_callback() * to be called upon the transaction's commit to disk. */typedef void (*xfs_trans_callback_t)(struct xfs_trans *, void *);/* * This is the structure maintained for every active transaction. */typedef struct xfs_trans {	unsigned int		t_magic;	/* magic number */	xfs_log_callback_t	t_logcb;	/* log callback struct */	unsigned int		t_type;		/* transaction type */

⌨️ 快捷键说明

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