📄 xfs_trans.h
字号:
/* * 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 + -