/*
 * Copyright (c) 2000-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 LIBXLOG_H
#define LIBXLOG_H

/*
 * define the userlevel xlog_t to be the subset of the kernel's
 * xlog_t that we actually need to get our work done, avoiding
 * the need to define any exotic kernel types in userland.
 */
struct xlog {
	xfs_lsn_t	l_tail_lsn;     /* lsn of 1st LR w/ unflush buffers */
	xfs_lsn_t	l_last_sync_lsn;/* lsn of last LR on disk */
	xfs_mount_t	*l_mp;	        /* mount point */
	struct xfs_buftarg *l_dev;	        /* dev_t of log */
	xfs_daddr_t	l_logBBstart;   /* start block of log */
	int		l_logBBsize;    /* size of log in 512 byte chunks */
	int		l_curr_cycle;   /* Cycle number of log writes */
	int		l_prev_cycle;   /* Cycle # b4 last block increment */
	int		l_curr_block;   /* current logical block of log */
	int		l_prev_block;   /* previous logical block of log */
	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 */
	atomic64_t	l_grant_reserve_head;
	atomic64_t	l_grant_write_head;
	uint		l_sectbb_log;   /* log2 of sector size in bbs */
	uint		l_sectbb_mask;  /* sector size (in BBs)
					 * alignment mask */
	int		l_sectBBsize;   /* size of log sector in 512 byte chunks */
};

#include "xfs_log_recover.h"

/*
 * macros mapping kernel code to user code
 *
 * XXX: this is duplicated stuff - should be shared with libxfs.
 */
#ifndef EFSCORRUPTED
#define EFSCORRUPTED			 990
#endif
#define STATIC				static
#define XFS_ERROR(e)			(e)
#ifdef DEBUG
#define XFS_ERROR_REPORT(e,l,mp)	fprintf(stderr, "ERROR: %s\n", e)
#else
#define XFS_ERROR_REPORT(e,l,mp)	((void) 0)
#endif
#define XFS_CORRUPTION_ERROR(e,l,mp,m)	((void) 0)
#define XFS_MOUNT_WAS_CLEAN		0x1
#define unlikely(x)			(x)
#define xfs_alert(mp,fmt,args...)	cmn_err(CE_ALERT,fmt, ## args)
#define xfs_warn(mp,fmt,args...)	cmn_err(CE_WARN,fmt, ## args)
#define xfs_hex_dump(d,n)		((void) 0)
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
#define round_down(x, y) ((x) & ~__round_mask(x, y))

extern void xlog_warn(char *fmt,...);
extern void xlog_exit(char *fmt,...);
extern void xlog_panic(char *fmt,...);

/* exports */
extern int	print_exit;
extern int	print_skip_uuid;
extern int	print_record_header;

/* libxfs parameters */
extern libxfs_init_t	x;


extern int xlog_is_dirty(struct xfs_mount *, struct xlog *, libxfs_init_t *,
			 int);
extern struct xfs_buf *xlog_get_bp(struct xlog *, int);
extern void	xlog_put_bp(struct xfs_buf *);
extern int	xlog_bread(struct xlog *log, xfs_daddr_t blk_no, int nbblks,
				xfs_buf_t *bp, char **offset);
extern int	xlog_bread_noalign(struct xlog *log, xfs_daddr_t blk_no,
				int nbblks, xfs_buf_t *bp);

extern int	xlog_find_zeroed(struct xlog *log, xfs_daddr_t *blk_no);
extern int	xlog_find_cycle_start(struct xlog *log, xfs_buf_t *bp,
				xfs_daddr_t first_blk, xfs_daddr_t *last_blk, 
				uint cycle);
extern int	xlog_find_tail(struct xlog *log, xfs_daddr_t *head_blk,
				xfs_daddr_t *tail_blk);

extern int	xlog_test_footer(struct xlog *log);
extern int	xlog_recover(struct xlog *log, int readonly);
extern void	xlog_recover_print_data(char *p, int len);
extern void	xlog_recover_print_logitem(xlog_recover_item_t *item);
extern void	xlog_recover_print_trans_head(xlog_recover_t *tr);
extern int	xlog_print_find_oldest(struct xlog *log, xfs_daddr_t *last_blk);

/* for transactional view */
extern void	xlog_recover_print_trans_head(xlog_recover_t *tr);
extern void	xlog_recover_print_trans(xlog_recover_t *trans,
				struct list_head *itemq, int print);
extern int	xlog_do_recovery_pass(struct xlog *log, xfs_daddr_t head_blk,
				xfs_daddr_t tail_blk, int pass);
extern int	xlog_recover_do_trans(struct xlog *log, xlog_recover_t *trans,
				int pass);
extern int	xlog_header_check_recover(xfs_mount_t *mp, 
				xlog_rec_header_t *head);
extern int	xlog_header_check_mount(xfs_mount_t *mp,
				xlog_rec_header_t *head);

#define xlog_assign_atomic_lsn(l,a,b) ((void) 0)
#define xlog_assign_grant_head(l,a,b) ((void) 0)
#endif	/* LIBXLOG_H */
