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

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

Revision 1.7, Wed Feb 2 03:29:32 1994 UTC (23 years, 8 months ago) by miken
Branch: MAIN
Changes since 1.6: +40 -22 lines

1.  Implement rolling log at end of physical log
2.  Fix problem where ticket code was not updating within the context of
	the state machine lock.
3.  Need to zero lsn in header when making ACTIVE.

#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_BSIZE	(4*1024)	/* eventually 32k */
#define LOG_RECORD_BSHIFT	12		/* 4096 == 1 << 12 */
#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_curr_cycle; \
				  ((uint *)&(lsn))[1] = (log)->l_curr_block; }
#define CYCLE_LSN(lsn)		(((uint *)&(lsn))[0])
#define BLOCK_LSN(lsn)		(((uint *)&(lsn))[1] >> 32)
#define log_panic(s)		{printf("%s\n", s); abort();}


/*
 * In core log state
 */
#define LOG_STATE_ACTIVE    1 /* Current IC log being written to */
#define LOG_STATE_WANT_SYNC 2 /* Want to sync this iclog; no more writes */
#define LOG_STATE_SYNCING   3 /* This IC log is syncing */
#define LOG_STATE_CALLBACK  4 /* Callback functions now */
#define LOG_STATE_DIRTY	    5 /* Dirty IC log, not ready for ACTIVE status */
#define LOG_STATE_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;/* block offset 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;


/*
 * - A log record header is 512 bytes.  There is plenty of room to grow the
 *	log_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 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];
	sema_t			ic_forcesema;
	struct log_in_core	*ic_next;
	buf_t	  		*ic_bp;
	struct log		*ic_log;
	xfs_log_callback_t	*ic_callback;
	int	  		ic_size;
	int	  		ic_offset;
	int	  		ic_refcnt;
	char	  		ic_state;
} log_in_core_t;


#define ic_header	ic_h.hic_header

/*
 * 
 */
typedef struct log {
	log_ticket_t	*l_freelist;  /* free list of tickets		  :  4*/
	log_in_core_t	*l_iclog;     /* head log queue			  :  4*/
	sema_t		l_flushsema;  /* iclog flushing semaphore	  : 20*/
	lock_t		l_icloglock;  /* grab to change iclog state	  :  4*/
	xfs_lsn_t	l_sync_lsn;   /* lsn of 1st LR w/ unflushed buffers: 8*/
	xfs_mount_t	*l_mp;	      /* mount point			   : 4*/
	dev_t		l_dev;	      /* dev_t of log			   : 4*/
	int		l_logstart;   /* start block of log		   : 4*/
	int		l_logsize;    /* size of log in bytes 		   : 4*/
	int		l_logBBsize;  /* size of log in 512 byte chunks    : 4*/
	int		l_curr_cycle; /* Cycle number of log writes	   : 4*/
	int		l_prev_cycle; /* Cycle # b4 last block increment   : 4*/
	int		l_curr_block; /* current logical block of log	   : 4*/
	int		l_prev_block; /* previous logical block of log	   : 4*/
	int		l_logreserved;/* log space reserved		   : 4*/
} log_t;



#endif	/* _XFS_LOG_PRIV_H */