xfs_log_priv.h

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

H
565
字号
 * non-dummy transaction. The first dummy changes the h_tail_lsn to * the first transaction before the dummy. The second dummy causes * h_tail_lsn to point to the first dummy. Recovery starts at h_tail_lsn. * * These dummy transactions get committed when everything * is idle (after there has been some activity). * * There are 5 states used to control this. * *  IDLE -- no logging has been done on the file system or *		we are done covering previous transactions. *  NEED -- logging has occurred and we need a dummy transaction *		when the log becomes idle. *  DONE -- we were in the NEED state and have committed a dummy *		transaction. *  NEED2 -- we detected that a dummy transaction has gone to the *		on disk log with no other transactions. *  DONE2 -- we committed a dummy transaction when in the NEED2 state. * * There are two places where we switch states: * * 1.) In xfs_sync, when we detect an idle log and are in NEED or NEED2. *	We commit the dummy transaction and switch to DONE or DONE2, *	respectively. In all other states, we don't do anything. * * 2.) When we finish writing the on-disk log (xlog_state_clean_log). * *	No matter what state we are in, if this isn't the dummy *	transaction going out, the next state is NEED. *	So, if we aren't in the DONE or DONE2 states, the next state *	is NEED. We can't be finishing a write of the dummy record *	unless it was committed and the state switched to DONE or DONE2. * *	If we are in the DONE state and this was a write of the *		dummy transaction, we move to NEED2. * *	If we are in the DONE2 state and this was a write of the *		dummy transaction, we move to IDLE. * * * Writing only one dummy transaction can get appended to * one file space allocation. When this happens, the log recovery * code replays the space allocation and a file could be truncated. * This is why we have the NEED2 and DONE2 states before going idle. */#define XLOG_STATE_COVER_IDLE	0#define XLOG_STATE_COVER_NEED	1#define XLOG_STATE_COVER_DONE	2#define XLOG_STATE_COVER_NEED2	3#define XLOG_STATE_COVER_DONE2	4#define XLOG_COVER_OPS		5typedef struct xlog_ticket {	sv_t		   t_sema;	 /* sleep on this semaphore	 :20 */	struct xlog_ticket *t_next;	 /*			         : 4 */	struct xlog_ticket *t_prev;	 /*				 : 4 */	xlog_tid_t	   t_tid;	 /* transaction identifier	 : 4 */	int		   t_curr_res;	 /* current reservation in bytes : 4 */	int		   t_unit_res;	 /* unit reservation in bytes    : 4 */	__uint8_t	   t_ocnt;	 /* original count		 : 1 */	__uint8_t	   t_cnt;	 /* current count		 : 1 */	__uint8_t	   t_clientid;	 /* who does this belong to;	 : 1 */	__uint8_t	   t_flags;	 /* properties of reservation	 : 1 */} xlog_ticket_t;#endiftypedef struct xlog_op_header {	xlog_tid_t oh_tid;	/* transaction id of operation	:  4 b */	int	   oh_len;	/* bytes in data region		:  4 b */	__uint8_t  oh_clientid;	/* who sent me this		:  1 b */	__uint8_t  oh_flags;	/*				:  1 b */	ushort	   oh_res2;	/* 32 bit align			:  2 b */} xlog_op_header_t;/* valid values for h_fmt */#define XLOG_FMT_UNKNOWN  0#define XLOG_FMT_LINUX_LE 1#define XLOG_FMT_LINUX_BE 2#define XLOG_FMT_IRIX_BE  3/* our fmt */#if __BYTE_ORDER == __LITTLE_ENDIAN#define XLOG_FMT XLOG_FMT_LINUX_LE#else#if __BYTE_ORDER == __BIG_ENDIAN#define XLOG_FMT XLOG_FMT_LINUX_BE#else#error unknown byte order#endif#endiftypedef struct xlog_rec_header {	uint	  h_magicno;	/* log record (LR) identifier		:  4 */	uint	  h_cycle;	/* write cycle of log			:  4 */	int	  h_version;	/* LR version				:  4 */	int	  h_len;	/* len in bytes; should be 64-bit aligned: 4 */	xfs_lsn_t h_lsn;	/* lsn of this LR			:  8 */	xfs_lsn_t h_tail_lsn;	/* lsn of 1st LR w/ buffers not committed: 8 */	uint	  h_chksum;	/* may not be used; non-zero if used	:  4 */	int	  h_prev_block; /* block number to previous LR		:  4 */	int	  h_num_logops;	/* number of log operations in this LR	:  4 */	uint	  h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE];	/* new fields */	int       h_fmt;        /* format of log record                 :  4 */	uuid_t    h_fs_uuid;    /* uuid of FS                           : 16 */	int       h_size;	/* iclog size				:  4 */} xlog_rec_header_t;typedef struct xlog_rec_ext_header {	uint	  xh_cycle;	/* write cycle of log			: 4 */	uint	  xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /*	: 256 */} xlog_rec_ext_header_t;#ifdef __KERNEL__/* * - A log record header is 512 bytes.  There is plenty of room to grow the *	xlog_rec_header_t into the reserved space. * - ic_data follows, so a write to disk can start at the beginning of *	the iclog. * - ic_forcesema is used to implement synchronous forcing of the iclog to disk. * - ic_next is the pointer to the next iclog in the ring. * - ic_bp is a pointer to the buffer used to write this incore log to disk. * - ic_log is a pointer back to the global log structure. * - ic_callback is a linked list of callback function/argument pairs to be *	called after an iclog finishes writing. * - ic_size is the full size of the header plus data. * - ic_offset is the current number of bytes written to in this iclog. * - ic_refcnt is bumped when someone is writing to the log. * - ic_state is the state of the iclog. */typedef struct xlog_iclog_fields {	sv_t			ic_forcesema;	sv_t			ic_writesema;	struct xlog_in_core	*ic_next;	struct xlog_in_core	*ic_prev;	struct xfs_buf		*ic_bp;	struct log		*ic_log;	xfs_log_callback_t	*ic_callback;	xfs_log_callback_t	**ic_callback_tail;#ifdef XFS_LOG_TRACE	struct ktrace		*ic_trace;#endif	int			ic_size;	int			ic_offset;	int			ic_refcnt;	int			ic_roundoff;	int			ic_bwritecnt;	ushort_t		ic_state;	char			*ic_datap;	/* pointer to iclog data */} xlog_iclog_fields_t;typedef union xlog_in_core2 {	xlog_rec_header_t	hic_header;	xlog_rec_ext_header_t	hic_xheader;	char			hic_sector[XLOG_HEADER_SIZE];} xlog_in_core_2_t;typedef struct xlog_in_core {	xlog_iclog_fields_t	hic_fields;	xlog_in_core_2_t	*hic_data;} xlog_in_core_t;/* * Defines to save our code from this glop. */#define	ic_forcesema	hic_fields.ic_forcesema#define ic_writesema	hic_fields.ic_writesema#define	ic_next		hic_fields.ic_next#define	ic_prev		hic_fields.ic_prev#define	ic_bp		hic_fields.ic_bp#define	ic_log		hic_fields.ic_log#define	ic_callback	hic_fields.ic_callback#define	ic_callback_tail hic_fields.ic_callback_tail#define	ic_trace	hic_fields.ic_trace#define	ic_size		hic_fields.ic_size#define	ic_offset	hic_fields.ic_offset#define	ic_refcnt	hic_fields.ic_refcnt#define	ic_roundoff	hic_fields.ic_roundoff#define	ic_bwritecnt	hic_fields.ic_bwritecnt#define	ic_state	hic_fields.ic_state#define ic_datap	hic_fields.ic_datap#define ic_header	hic_data->hic_header/* * The reservation head lsn is not made up of a cycle number and block number. * Instead, it uses a cycle number and byte number.  Logs don't expect to * overflow 31 bits worth of byte offset, so using a byte number will mean * that round off problems won't occur when releasing partial reservations. */typedef struct log {	/* The following block of fields are changed while holding icloglock */	sema_t			l_flushsema;    /* iclog flushing semaphore */	int			l_flushcnt;	/* # of procs waiting on this						 * sema */	int			l_ticket_cnt;	/* free ticket count */	int			l_ticket_tcnt;	/* total ticket count */	int			l_covered_state;/* state of "covering disk						 * log entries" */	xlog_ticket_t		*l_freelist;    /* free list of tickets */	xlog_ticket_t		*l_unmount_free;/* kmem_free these addresses */	xlog_ticket_t		*l_tail;        /* free list of tickets */	xlog_in_core_t		*l_iclog;       /* head log queue	*/	lock_t			l_icloglock;    /* grab to change iclog state */	xfs_lsn_t		l_tail_lsn;     /* lsn of 1st LR with unflushed						 * buffers */	xfs_lsn_t		l_last_sync_lsn;/* lsn of last LR on disk */	struct xfs_mount	*l_mp;	        /* mount point */	struct xfs_buf		*l_xbuf;        /* extra buffer for log						 * wrapping */	struct xfs_buftarg	*l_targ;        /* buftarg of log */	xfs_daddr_t		l_logBBstart;   /* start block of log */	int			l_logsize;      /* size of log in bytes */	int			l_logBBsize;    /* size of log in BB chunks */	int			l_roundoff;	/* round off error of iclogs */	int			l_curr_cycle;   /* Cycle number of log writes */	int			l_prev_cycle;   /* Cycle number before last						 * block increment */	int			l_curr_block;   /* current logical log block */	int			l_prev_block;   /* previous logical log block */	int			l_iclog_size;	/* size of log in bytes */	int			l_iclog_size_log; /* log power size of log */	int			l_iclog_bufs;	/* number of iclog buffers */	/* The following field are used for debugging; need to hold icloglock */	char			*l_iclog_bak[XLOG_MAX_ICLOGS];	/* The following block of fields are changed while holding grant_lock */	lock_t			l_grant_lock;	xlog_ticket_t		*l_reserve_headq;	xlog_ticket_t		*l_write_headq;	int			l_grant_reserve_cycle;	int			l_grant_reserve_bytes;	int			l_grant_write_cycle;	int			l_grant_write_bytes;	/* The following fields don't need locking */#ifdef XFS_LOG_TRACE	struct ktrace		*l_trace;	struct ktrace		*l_grant_trace;#endif	uint			l_flags;	uint			l_quotaoffs_flag; /* XFS_DQ_*, for QUOTAOFFs */	struct xfs_buf_cancel	**l_buf_cancel_table;	int			l_iclog_hsize;  /* size of iclog header */	int			l_iclog_heads;  /* # of iclog header sectors */	uint			l_sectbb_log;   /* log2 of sector size in BBs */	uint			l_sectbb_mask;  /* sector size (in BBs)						 * alignment mask */} xlog_t;/* common routines */extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);extern int	 xlog_find_head(xlog_t *log, xfs_daddr_t *head_blk);extern int	 xlog_find_tail(xlog_t	*log,				xfs_daddr_t *head_blk,				xfs_daddr_t *tail_blk,				int readonly);extern int	 xlog_recover(xlog_t *log, int readonly);extern int	 xlog_recover_finish(xlog_t *log, int mfsi_flags);extern void	 xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog);extern void	 xlog_recover_process_iunlinks(xlog_t *log);extern struct xfs_buf *xlog_get_bp(xlog_t *, int);extern void	 xlog_put_bp(struct xfs_buf *);extern int	 xlog_bread(xlog_t *, xfs_daddr_t, int, struct xfs_buf *);extern xfs_caddr_t xlog_align(xlog_t *, xfs_daddr_t, int, struct xfs_buf *);/* iclog tracing */#define XLOG_TRACE_GRAB_FLUSH  1#define XLOG_TRACE_REL_FLUSH   2#define XLOG_TRACE_SLEEP_FLUSH 3#define XLOG_TRACE_WAKE_FLUSH  4#endif	/* __KERNEL__ */#endif	/* __XFS_LOG_PRIV_H__ */

⌨️ 快捷键说明

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