2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 - 2003 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-17 02:20:36 +04:00
* published by the Free Software Foundation .
*
2005-11-02 06:58:39 +03:00
* 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 .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* 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
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_LOG_H__
# define __XFS_LOG_H__
/* get lsn fields */
# define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
# define BLOCK_LSN(lsn) ((uint)(lsn))
2007-10-12 04:59:34 +04:00
2005-04-17 02:20:36 +04:00
/* this is used in a spot where we might otherwise double-endian-flip */
2007-10-12 04:59:34 +04:00
# define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0])
2005-04-17 02:20:36 +04:00
# ifdef __KERNEL__
/*
2006-03-29 02:55:14 +04:00
* By comparing each component , we don ' t have to worry about extra
2005-04-17 02:20:36 +04:00
* endian issues in treating two 32 bit numbers as one 64 bit number
*/
2006-01-08 12:04:09 +03:00
static inline xfs_lsn_t _lsn_cmp ( xfs_lsn_t lsn1 , xfs_lsn_t lsn2 )
2005-04-17 02:20:36 +04:00
{
if ( CYCLE_LSN ( lsn1 ) ! = CYCLE_LSN ( lsn2 ) )
return ( CYCLE_LSN ( lsn1 ) < CYCLE_LSN ( lsn2 ) ) ? - 999 : 999 ;
if ( BLOCK_LSN ( lsn1 ) ! = BLOCK_LSN ( lsn2 ) )
return ( BLOCK_LSN ( lsn1 ) < BLOCK_LSN ( lsn2 ) ) ? - 999 : 999 ;
return 0 ;
}
# define XFS_LSN_CMP(x,y) _lsn_cmp(x,y)
/*
* Macros , structures , prototypes for interface to the log manager .
*/
/*
* Flags to xfs_log_done ( )
*/
# define XFS_LOG_REL_PERM_RESERV 0x1
/*
* Flags to xfs_log_reserve ( )
*
* XFS_LOG_SLEEP : If space is not available , sleep ( default )
* XFS_LOG_NOSLEEP : If space is not available , return error
* XFS_LOG_PERM_RESERV : Permanent reservation . When writes are
* performed against this type of reservation , the reservation
* is not decreased . Long running transactions should use this .
*/
# define XFS_LOG_SLEEP 0x0
# define XFS_LOG_NOSLEEP 0x1
# define XFS_LOG_PERM_RESERV 0x2
/*
* Flags to xfs_log_force ( )
*
* XFS_LOG_SYNC : Synchronous force in - core log to disk
* XFS_LOG_FORCE : Start in - core log write now .
* XFS_LOG_URGE : Start write within some window of time .
*
* Note : Either XFS_LOG_FORCE or XFS_LOG_URGE must be set .
*/
# define XFS_LOG_SYNC 0x1
# define XFS_LOG_FORCE 0x2
# define XFS_LOG_URGE 0x4
# endif /* __KERNEL__ */
/* Log Clients */
# define XFS_TRANSACTION 0x69
# define XFS_VOLUME 0x2
# define XFS_LOG 0xaa
2005-09-02 10:42:05 +04:00
/* Region types for iovec's i_type */
# define XLOG_REG_TYPE_BFORMAT 1
# define XLOG_REG_TYPE_BCHUNK 2
# define XLOG_REG_TYPE_EFI_FORMAT 3
# define XLOG_REG_TYPE_EFD_FORMAT 4
# define XLOG_REG_TYPE_IFORMAT 5
# define XLOG_REG_TYPE_ICORE 6
# define XLOG_REG_TYPE_IEXT 7
# define XLOG_REG_TYPE_IBROOT 8
# define XLOG_REG_TYPE_ILOCAL 9
# define XLOG_REG_TYPE_IATTR_EXT 10
# define XLOG_REG_TYPE_IATTR_BROOT 11
# define XLOG_REG_TYPE_IATTR_LOCAL 12
# define XLOG_REG_TYPE_QFORMAT 13
# define XLOG_REG_TYPE_DQUOT 14
# define XLOG_REG_TYPE_QUOTAOFF 15
# define XLOG_REG_TYPE_LRHEADER 16
# define XLOG_REG_TYPE_UNMOUNT 17
# define XLOG_REG_TYPE_COMMIT 18
# define XLOG_REG_TYPE_TRANSHDR 19
# define XLOG_REG_TYPE_MAX 19
# define XLOG_VEC_SET_TYPE(vecp, t) ((vecp)->i_type = (t))
2005-04-17 02:20:36 +04:00
typedef struct xfs_log_iovec {
xfs_caddr_t i_addr ; /* beginning address of region */
int i_len ; /* length in bytes of region */
2006-01-11 13:02:47 +03:00
uint i_type ; /* type of region */
2005-04-17 02:20:36 +04:00
} xfs_log_iovec_t ;
typedef void * xfs_log_ticket_t ;
/*
* Structure used to pass callback function and the function ' s argument
* to the log manager .
*/
typedef struct xfs_log_callback {
struct xfs_log_callback * cb_next ;
void ( * cb_func ) ( void * , int ) ;
void * cb_arg ;
} xfs_log_callback_t ;
# ifdef __KERNEL__
/* Log manager interfaces */
struct xfs_mount ;
xfs_lsn_t xfs_log_done ( struct xfs_mount * mp ,
xfs_log_ticket_t ticket ,
void * * iclog ,
uint flags ) ;
2005-11-02 02:26:59 +03:00
int _xfs_log_force ( struct xfs_mount * mp ,
xfs_lsn_t lsn ,
uint flags ,
int * log_forced ) ;
# define xfs_log_force(mp, lsn, flags) \
_xfs_log_force ( mp , lsn , flags , NULL ) ;
2005-04-17 02:20:36 +04:00
int xfs_log_mount ( struct xfs_mount * mp ,
struct xfs_buftarg * log_target ,
xfs_daddr_t start_block ,
int num_bblocks ) ;
int xfs_log_mount_finish ( struct xfs_mount * mp , int ) ;
void xfs_log_move_tail ( struct xfs_mount * mp ,
xfs_lsn_t tail_lsn ) ;
int xfs_log_notify ( struct xfs_mount * mp ,
void * iclog ,
xfs_log_callback_t * callback_entry ) ;
int xfs_log_release_iclog ( struct xfs_mount * mp ,
void * iclog_hndl ) ;
int xfs_log_reserve ( struct xfs_mount * mp ,
int length ,
int count ,
xfs_log_ticket_t * ticket ,
__uint8_t clientid ,
2005-09-02 10:42:05 +04:00
uint flags ,
uint t_type ) ;
2005-04-17 02:20:36 +04:00
int xfs_log_write ( struct xfs_mount * mp ,
xfs_log_iovec_t region [ ] ,
int nentries ,
xfs_log_ticket_t ticket ,
xfs_lsn_t * start_lsn ) ;
int xfs_log_unmount ( struct xfs_mount * mp ) ;
int xfs_log_unmount_write ( struct xfs_mount * mp ) ;
void xfs_log_unmount_dealloc ( struct xfs_mount * mp ) ;
int xfs_log_force_umount ( struct xfs_mount * mp , int logerror ) ;
int xfs_log_need_covered ( struct xfs_mount * mp ) ;
void xlog_iodone ( struct xfs_buf * ) ;
# endif
extern int xlog_debug ; /* set to 1 to enable real log */
# endif /* __XFS_LOG_H__ */