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

📄 xfs_log_priv.h

📁 linux 内核源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* Ticket reservation region accounting */ #define XLOG_TIC_LEN_MAX	15/* * Reservation region * As would be stored in xfs_log_iovec but without the i_addr which * we don't care about. */typedef struct xlog_res {	uint	r_len;	/* region length		:4 */	uint	r_type;	/* region's transaction type	:4 */} xlog_res_t;typedef struct xlog_ticket {	sv_t		   t_sema;	 /* sleep on this semaphore      : 20 */ 	struct xlog_ticket *t_next;	 /*			         :4|8 */	struct xlog_ticket *t_prev;	 /*				 :4|8 */	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  */	char		   t_ocnt;	 /* original count		 : 1  */	char		   t_cnt;	 /* current count		 : 1  */	char		   t_clientid;	 /* who does this belong to;	 : 1  */	char		   t_flags;	 /* properties of reservation	 : 1  */	uint		   t_trans_type; /* transaction type             : 4  */        /* reservation array fields */	uint		   t_res_num;                    /* num in array : 4 */	uint		   t_res_num_ophdrs;		 /* num op hdrs  : 4 */	uint		   t_res_arr_sum;		 /* array sum    : 4 */	uint		   t_res_o_flow;		 /* sum overflow : 4 */	xlog_res_t	   t_res_arr[XLOG_TIC_LEN_MAX];  /* array of res : 8 * 15 */ } 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 */#ifdef XFS_NATIVE_HOST#define XLOG_FMT XLOG_FMT_LINUX_BE#else#define XLOG_FMT XLOG_FMT_LINUX_LE#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_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_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_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;#define XLOG_FORCED_SHUTDOWN(log)	((log)->l_flags & XLOG_IO_ERROR)/* common routines */extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);extern int	 xlog_find_tail(xlog_t	*log,				xfs_daddr_t *head_blk,				xfs_daddr_t *tail_blk);extern int	 xlog_recover(xlog_t *log);extern int	 xlog_recover_finish(xlog_t *log, int mfsi_flags);extern void	 xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int);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 *);/* 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/* * Unmount record type is used as a pseudo transaction type for the ticket. * It's value must be outside the range of XFS_TRANS_* values. */#define XLOG_UNMOUNT_REC_TYPE	(-1U)#endif	/* __KERNEL__ */#endif	/* __XFS_LOG_PRIV_H__ */

⌨️ 快捷键说明

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