[BACK]Return to xfs_log_priv.h CVS log [TXT][DIR] Up to [Development] / xfs-linux-nodel

File: [Development] / xfs-linux-nodel / xfs_log_priv.h (download)

Revision 1.4, Fri Jan 7 00:03:06 1994 UTC (23 years, 9 months ago) by miken
Branch: MAIN
Changes since 1.3: +26 -39 lines

1.  Fix iodone() complete routines to perform locking correctly.
2.  Correct some problems in the log_write() code w.r.t. the offset in the
	current in-core log.
3.  Add the notion of a start record for transactions.
4.  Every 512 byte block will have a pass number stamped in the first word
	of the block.  However, log record headers have their magic number
	in the first word with the pass number in the second word.
5. Add notion of splitting individual regions across multiple log record
	writes.

#ifndef	_XFS_LOG_PRIV_H
#define _XFS_LOG_PRIV_H
/*
 * Macros, structures, prototypes for internal log manager use.
 */



#define LOG_NUM_ICLOGS		2
#define LOG_CALLBACK_SIZE	10
#define LOG_HEADER_MAGIC_NUM	0xBADbabe
#define LOG_RECORD_ISIZE	1024
#define LOG_RECORD_BSIZE	(4*(LOG_RECORD_ISIZE))	/* eventually 32k */
#define LOG_HEADER_SIZE		512
#define LOG_BBSHIFT		12
#define LOG_BBSIZE		(1<<LOG_BBSHIFT)	/* 4096 */
#define LOG_BBMASK		(LOG_BBSIZE-1)
#define XLOGBB_TO_BB(x)		(((x) << LOG_BBSHIFT) >> BBSHIFT)

#define NBLOCKS(size)		((size)+LOG_BBSIZE-1 >> LOG_BBSHIFT)

#define ASSIGN_LSN(lsn,log)	{ ((uint *)&(lsn))[0] = (log)->l_cycle; \
				  ((uint *)&(lsn))[1] = (log)->l_currblock; }
#define log_panic(s)		{printf("%s\n", s); abort();}


/*
 * In core log state
 */
#define LOG_ACTIVE	1	/* Current IC log being written to */
#define LOG_WANT_SYNC	2	/* Want to sync this iclog; no more writes */
#define LOG_SYNCING	3	/* This IC log is syncing */
#define LOG_CALLBACK	4	/* Callback functions now */
#define LOG_DIRTY	5	/* Need to clean this IC log */
#define LOG_NOTUSED	6	/* This IC log not being used */

/*
 * Flags to log operation header
 *
 * The first write of a new transaction will be preceded with a start
 * record, LOG_START_TRANS.  Once a transaction is committed, a commit
 * record is written, LOG_COMMIT_TRANS.  If a single region can not fit into
 * the remainder of the current active in-core log, it is split up into
 * multiple regions.  Each partial region will be marked with a
 * LOG_CONTINUE_TRANS until the last one, which gets marked with LOG_END_TRANS.
 *
 */
#define LOG_START_TRANS		0x1	/* Start a new transaction */
#define LOG_COMMIT_TRANS	0x2	/* Commit this transaction */
#define LOG_CONTINUE_TRANS	0x4	/* Cont this trans into new region */
#define LOG_END_TRANS		0x8	/* End a continued transaction */

/*
 * Flags to log ticket
 */
#define LOG_TIC_INITED		0x1	/* has been initialized */
#define LOG_TIC_PERM_RESERV	0x2	/* permanent reservation */

typedef void * log_tid_t;

typedef struct log_ticket {
	struct log_ticket *t_next;	/*			      4/8 b */
	log_tid_t	  t_tid;	/* Transaction identifier	8 b */
	uint		  t_reservation;/* Reservation in bytes;	4 b */
	char		  t_clientid;	/* Who does this belong to;	1 b */
	char		  t_flags;	/* 				1 b */
} log_ticket_t;


typedef struct log_op_header {
	log_tid_t  oh_tid;	/* transaction id of operation	:  4 b */
	int	   oh_len;	/* bytes in data region		:  4 b */
	char	   oh_clientid;	/* who sent me this		:  1 b */
	char	   oh_flags;	/* 				:  1 b */
	ushort	   oh_res2;	/* 32 bit align			:  2 b */
} log_op_header_t;


typedef struct log_rec_header {
	uint	  h_magicno;	/* log record (LR) identifier		:  4 */
	uint	  h_cycle;	/* write cycle of log			:  4 */
	int	  h_version;	/* LR version				:  4 */
	xfs_lsn_t h_lsn;	/* lsn of this LR			:  8 */
	xfs_lsn_t h_sync_lsn;	/* lsn of last LR with buffers committed:  8 */
	int	  h_len;	/* len in bytes; should be 64-bit aligned: 4 */
	uint	  h_chksum;	/* may not be used; non-zero if used	:  4 */
	int	  h_prev_offset;/* offset in bytes to previous LR	:  4 */
	int	  h_num_logops;	/* number of log operations in this LR	:  4 */
	uint	  h_cycle_data[LOG_RECORD_BSIZE / BBSIZE];
} log_rec_header_t;


typedef struct log_in_core {
	union {
		log_rec_header_t hic_header;
		char		 hic_sector[LOG_HEADER_SIZE];
	} ic_h;
	char			ic_data[LOG_RECORD_BSIZE-LOG_HEADER_SIZE];
	struct log_in_core	*ic_next;
	buf_t	  		*ic_bp;
	struct log		*ic_log;	/* back ptr to log */
	int	  		ic_size;
	int	  		ic_offset;
	int	  		ic_refcnt;
	char	  		ic_state;
} log_in_core_t;


#define ic_header	ic_h.hic_header


/*
 * l_freelist	: the freelist of unused tickets.
 * l_iclog	: the current active IC write log.
 * l_iclog2	: the IC log being synced to disk or in inactive state.
 * l_dev	: device of log partition.
 */
typedef struct log {
	log_ticket_t	*l_freelist;	/* free list of tickets:	4b */
	log_in_core_t	*l_iclog;	/* head log queue:		4b */
	sema_t		l_flushsema;	/* iclog flushing semaphore	20b */
	lock_t		l_icloglock;	/* grab to change iclog state:	 b */
	dev_t		l_dev;		/* dev_t of log */
	int		l_logsize;	/* size in bytes of log */
	int		l_cycle;	/* Cycle number of log writes */
	int		l_currblock;	/* current logical block of log */
	int		l_logreserved;	/* log space reserved */
	xfs_lsn_t	l_sync_lsn;	/* lsn of last LR w/ buffers committed*/
} log_t;



#endif	/* _XFS_LOG_PRIV_H */