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 + -
显示快捷键?