xref: /openbmc/linux/fs/xfs/xfs_log.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  * Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
3*1da177e4SLinus Torvalds  *
4*1da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify it
5*1da177e4SLinus Torvalds  * under the terms of version 2 of the GNU General Public License as
6*1da177e4SLinus Torvalds  * published by the Free Software Foundation.
7*1da177e4SLinus Torvalds  *
8*1da177e4SLinus Torvalds  * This program is distributed in the hope that it would be useful, but
9*1da177e4SLinus Torvalds  * WITHOUT ANY WARRANTY; without even the implied warranty of
10*1da177e4SLinus Torvalds  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11*1da177e4SLinus Torvalds  *
12*1da177e4SLinus Torvalds  * Further, this software is distributed without any warranty that it is
13*1da177e4SLinus Torvalds  * free of the rightful claim of any third person regarding infringement
14*1da177e4SLinus Torvalds  * or the like.  Any license provided herein, whether implied or
15*1da177e4SLinus Torvalds  * otherwise, applies only to this software file.  Patent licenses, if
16*1da177e4SLinus Torvalds  * any, provided herein do not apply to combinations of this program with
17*1da177e4SLinus Torvalds  * other software, or any other product whatsoever.
18*1da177e4SLinus Torvalds  *
19*1da177e4SLinus Torvalds  * You should have received a copy of the GNU General Public License along
20*1da177e4SLinus Torvalds  * with this program; if not, write the Free Software Foundation, Inc., 59
21*1da177e4SLinus Torvalds  * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22*1da177e4SLinus Torvalds  *
23*1da177e4SLinus Torvalds  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24*1da177e4SLinus Torvalds  * Mountain View, CA  94043, or:
25*1da177e4SLinus Torvalds  *
26*1da177e4SLinus Torvalds  * http://www.sgi.com
27*1da177e4SLinus Torvalds  *
28*1da177e4SLinus Torvalds  * For further information regarding this notice, see:
29*1da177e4SLinus Torvalds  *
30*1da177e4SLinus Torvalds  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31*1da177e4SLinus Torvalds  */
32*1da177e4SLinus Torvalds #ifndef	__XFS_LOG_H__
33*1da177e4SLinus Torvalds #define __XFS_LOG_H__
34*1da177e4SLinus Torvalds 
35*1da177e4SLinus Torvalds /* get lsn fields */
36*1da177e4SLinus Torvalds 
37*1da177e4SLinus Torvalds #define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
38*1da177e4SLinus Torvalds #define BLOCK_LSN(lsn) ((uint)(lsn))
39*1da177e4SLinus Torvalds /* this is used in a spot where we might otherwise double-endian-flip */
40*1da177e4SLinus Torvalds #define CYCLE_LSN_DISK(lsn) (((uint *)&(lsn))[0])
41*1da177e4SLinus Torvalds 
42*1da177e4SLinus Torvalds #ifdef __KERNEL__
43*1da177e4SLinus Torvalds /*
44*1da177e4SLinus Torvalds  * By comparing each compnent, we don't have to worry about extra
45*1da177e4SLinus Torvalds  * endian issues in treating two 32 bit numbers as one 64 bit number
46*1da177e4SLinus Torvalds  */
47*1da177e4SLinus Torvalds static
48*1da177e4SLinus Torvalds #if defined(__GNUC__) && (__GNUC__ == 2) && ( (__GNUC_MINOR__ == 95) || (__GNUC_MINOR__ == 96))
49*1da177e4SLinus Torvalds __attribute__((unused))	/* gcc 2.95, 2.96 miscompile this when inlined */
50*1da177e4SLinus Torvalds #else
51*1da177e4SLinus Torvalds __inline__
52*1da177e4SLinus Torvalds #endif
53*1da177e4SLinus Torvalds xfs_lsn_t	_lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2)
54*1da177e4SLinus Torvalds {
55*1da177e4SLinus Torvalds 	if (CYCLE_LSN(lsn1) != CYCLE_LSN(lsn2))
56*1da177e4SLinus Torvalds 		return (CYCLE_LSN(lsn1)<CYCLE_LSN(lsn2))? -999 : 999;
57*1da177e4SLinus Torvalds 
58*1da177e4SLinus Torvalds 	if (BLOCK_LSN(lsn1) != BLOCK_LSN(lsn2))
59*1da177e4SLinus Torvalds 		return (BLOCK_LSN(lsn1)<BLOCK_LSN(lsn2))? -999 : 999;
60*1da177e4SLinus Torvalds 
61*1da177e4SLinus Torvalds 	return 0;
62*1da177e4SLinus Torvalds }
63*1da177e4SLinus Torvalds 
64*1da177e4SLinus Torvalds #define	XFS_LSN_CMP(x,y) _lsn_cmp(x,y)
65*1da177e4SLinus Torvalds 
66*1da177e4SLinus Torvalds /*
67*1da177e4SLinus Torvalds  * Macros, structures, prototypes for interface to the log manager.
68*1da177e4SLinus Torvalds  */
69*1da177e4SLinus Torvalds 
70*1da177e4SLinus Torvalds /*
71*1da177e4SLinus Torvalds  * Flags to xfs_log_mount
72*1da177e4SLinus Torvalds  */
73*1da177e4SLinus Torvalds #define XFS_LOG_RECOVER		0x1
74*1da177e4SLinus Torvalds 
75*1da177e4SLinus Torvalds /*
76*1da177e4SLinus Torvalds  * Flags to xfs_log_done()
77*1da177e4SLinus Torvalds  */
78*1da177e4SLinus Torvalds #define XFS_LOG_REL_PERM_RESERV	0x1
79*1da177e4SLinus Torvalds 
80*1da177e4SLinus Torvalds 
81*1da177e4SLinus Torvalds /*
82*1da177e4SLinus Torvalds  * Flags to xfs_log_reserve()
83*1da177e4SLinus Torvalds  *
84*1da177e4SLinus Torvalds  *	XFS_LOG_SLEEP:	 If space is not available, sleep (default)
85*1da177e4SLinus Torvalds  *	XFS_LOG_NOSLEEP: If space is not available, return error
86*1da177e4SLinus Torvalds  *	XFS_LOG_PERM_RESERV: Permanent reservation.  When writes are
87*1da177e4SLinus Torvalds  *		performed against this type of reservation, the reservation
88*1da177e4SLinus Torvalds  *		is not decreased.  Long running transactions should use this.
89*1da177e4SLinus Torvalds  */
90*1da177e4SLinus Torvalds #define XFS_LOG_SLEEP		0x0
91*1da177e4SLinus Torvalds #define XFS_LOG_NOSLEEP		0x1
92*1da177e4SLinus Torvalds #define XFS_LOG_PERM_RESERV	0x2
93*1da177e4SLinus Torvalds #define XFS_LOG_RESV_ALL	(XFS_LOG_NOSLEEP|XFS_LOG_PERM_RESERV)
94*1da177e4SLinus Torvalds 
95*1da177e4SLinus Torvalds 
96*1da177e4SLinus Torvalds /*
97*1da177e4SLinus Torvalds  * Flags to xfs_log_force()
98*1da177e4SLinus Torvalds  *
99*1da177e4SLinus Torvalds  *	XFS_LOG_SYNC:	Synchronous force in-core log to disk
100*1da177e4SLinus Torvalds  *	XFS_LOG_FORCE:	Start in-core log write now.
101*1da177e4SLinus Torvalds  *	XFS_LOG_URGE:	Start write within some window of time.
102*1da177e4SLinus Torvalds  *
103*1da177e4SLinus Torvalds  * Note: Either XFS_LOG_FORCE or XFS_LOG_URGE must be set.
104*1da177e4SLinus Torvalds  */
105*1da177e4SLinus Torvalds #define XFS_LOG_SYNC		0x1
106*1da177e4SLinus Torvalds #define XFS_LOG_FORCE		0x2
107*1da177e4SLinus Torvalds #define XFS_LOG_URGE		0x4
108*1da177e4SLinus Torvalds 
109*1da177e4SLinus Torvalds #endif	/* __KERNEL__ */
110*1da177e4SLinus Torvalds 
111*1da177e4SLinus Torvalds 
112*1da177e4SLinus Torvalds /* Log Clients */
113*1da177e4SLinus Torvalds #define XFS_TRANSACTION		0x69
114*1da177e4SLinus Torvalds #define XFS_VOLUME		0x2
115*1da177e4SLinus Torvalds #define XFS_LOG			0xaa
116*1da177e4SLinus Torvalds 
117*1da177e4SLinus Torvalds typedef struct xfs_log_iovec {
118*1da177e4SLinus Torvalds 	xfs_caddr_t		i_addr;		/* beginning address of region */
119*1da177e4SLinus Torvalds 	int		i_len;		/* length in bytes of region */
120*1da177e4SLinus Torvalds } xfs_log_iovec_t;
121*1da177e4SLinus Torvalds 
122*1da177e4SLinus Torvalds typedef void* xfs_log_ticket_t;
123*1da177e4SLinus Torvalds 
124*1da177e4SLinus Torvalds /*
125*1da177e4SLinus Torvalds  * Structure used to pass callback function and the function's argument
126*1da177e4SLinus Torvalds  * to the log manager.
127*1da177e4SLinus Torvalds  */
128*1da177e4SLinus Torvalds typedef struct xfs_log_callback {
129*1da177e4SLinus Torvalds 	struct xfs_log_callback	*cb_next;
130*1da177e4SLinus Torvalds 	void			(*cb_func)(void *, int);
131*1da177e4SLinus Torvalds 	void			*cb_arg;
132*1da177e4SLinus Torvalds } xfs_log_callback_t;
133*1da177e4SLinus Torvalds 
134*1da177e4SLinus Torvalds 
135*1da177e4SLinus Torvalds #ifdef __KERNEL__
136*1da177e4SLinus Torvalds /* Log manager interfaces */
137*1da177e4SLinus Torvalds struct xfs_mount;
138*1da177e4SLinus Torvalds xfs_lsn_t xfs_log_done(struct xfs_mount *mp,
139*1da177e4SLinus Torvalds 		       xfs_log_ticket_t ticket,
140*1da177e4SLinus Torvalds 		       void		**iclog,
141*1da177e4SLinus Torvalds 		       uint		flags);
142*1da177e4SLinus Torvalds int	  xfs_log_force(struct xfs_mount *mp,
143*1da177e4SLinus Torvalds 			xfs_lsn_t	 lsn,
144*1da177e4SLinus Torvalds 			uint		 flags);
145*1da177e4SLinus Torvalds int	  xfs_log_mount(struct xfs_mount	*mp,
146*1da177e4SLinus Torvalds 			struct xfs_buftarg	*log_target,
147*1da177e4SLinus Torvalds 			xfs_daddr_t		start_block,
148*1da177e4SLinus Torvalds 			int		 	num_bblocks);
149*1da177e4SLinus Torvalds int	  xfs_log_mount_finish(struct xfs_mount *mp, int);
150*1da177e4SLinus Torvalds void	  xfs_log_move_tail(struct xfs_mount	*mp,
151*1da177e4SLinus Torvalds 			    xfs_lsn_t		tail_lsn);
152*1da177e4SLinus Torvalds int	  xfs_log_notify(struct xfs_mount	*mp,
153*1da177e4SLinus Torvalds 			 void			*iclog,
154*1da177e4SLinus Torvalds 			 xfs_log_callback_t	*callback_entry);
155*1da177e4SLinus Torvalds int	  xfs_log_release_iclog(struct xfs_mount *mp,
156*1da177e4SLinus Torvalds 			 void			 *iclog_hndl);
157*1da177e4SLinus Torvalds int	  xfs_log_reserve(struct xfs_mount *mp,
158*1da177e4SLinus Torvalds 			  int		   length,
159*1da177e4SLinus Torvalds 			  int		   count,
160*1da177e4SLinus Torvalds 			  xfs_log_ticket_t *ticket,
161*1da177e4SLinus Torvalds 			  __uint8_t	   clientid,
162*1da177e4SLinus Torvalds 			  uint		   flags);
163*1da177e4SLinus Torvalds int	  xfs_log_write(struct xfs_mount *mp,
164*1da177e4SLinus Torvalds 			xfs_log_iovec_t  region[],
165*1da177e4SLinus Torvalds 			int		 nentries,
166*1da177e4SLinus Torvalds 			xfs_log_ticket_t ticket,
167*1da177e4SLinus Torvalds 			xfs_lsn_t	 *start_lsn);
168*1da177e4SLinus Torvalds int	  xfs_log_unmount(struct xfs_mount *mp);
169*1da177e4SLinus Torvalds int	  xfs_log_unmount_write(struct xfs_mount *mp);
170*1da177e4SLinus Torvalds void      xfs_log_unmount_dealloc(struct xfs_mount *mp);
171*1da177e4SLinus Torvalds int	  xfs_log_force_umount(struct xfs_mount *mp, int logerror);
172*1da177e4SLinus Torvalds int	  xfs_log_need_covered(struct xfs_mount *mp);
173*1da177e4SLinus Torvalds 
174*1da177e4SLinus Torvalds void	  xlog_iodone(struct xfs_buf *);
175*1da177e4SLinus Torvalds 
176*1da177e4SLinus Torvalds #endif
177*1da177e4SLinus Torvalds 
178*1da177e4SLinus Torvalds 
179*1da177e4SLinus Torvalds extern int xlog_debug;		/* set to 1 to enable real log */
180*1da177e4SLinus Torvalds 
181*1da177e4SLinus Torvalds 
182*1da177e4SLinus Torvalds #endif	/* __XFS_LOG_H__ */
183