xfs_log.h 5.6 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3
 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
 * All Rights Reserved.
L
Linus Torvalds 已提交
4
 *
5 6
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
L
Linus Torvalds 已提交
7 8
 * published by the Free Software Foundation.
 *
9 10 11 12
 * 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.
L
Linus Torvalds 已提交
13
 *
14 15 16
 * 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
L
Linus Torvalds 已提交
17 18 19 20 21 22 23
 */
#ifndef	__XFS_LOG_H__
#define __XFS_LOG_H__

/* get lsn fields */
#define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
#define BLOCK_LSN(lsn) ((uint)(lsn))
24

L
Linus Torvalds 已提交
25
/* this is used in a spot where we might otherwise double-endian-flip */
26
#define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0])
L
Linus Torvalds 已提交
27 28 29

#ifdef __KERNEL__
/*
30
 * By comparing each component, we don't have to worry about extra
L
Linus Torvalds 已提交
31 32
 * endian issues in treating two 32 bit numbers as one 64 bit number
 */
A
Andrew Morton 已提交
33
static inline xfs_lsn_t	_lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2)
L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
{
	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_force()
 *
 *	XFS_LOG_SYNC:	Synchronous force in-core log to disk
 */
#define XFS_LOG_SYNC		0x1

#endif	/* __KERNEL__ */


/* Log Clients */
#define XFS_TRANSACTION		0x69
#define XFS_VOLUME		0x2
#define XFS_LOG			0xaa

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

/* 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
D
Dave Chinner 已提交
91 92
#define XLOG_REG_TYPE_ICREATE		20
#define XLOG_REG_TYPE_MAX		20
93

L
Linus Torvalds 已提交
94
typedef struct xfs_log_iovec {
95
	void		*i_addr;	/* beginning address of region */
L
Linus Torvalds 已提交
96
	int		i_len;		/* length in bytes of region */
97
	uint		i_type;		/* type of region */
L
Linus Torvalds 已提交
98 99
} xfs_log_iovec_t;

100 101 102 103
struct xfs_log_vec {
	struct xfs_log_vec	*lv_next;	/* next lv in build list */
	int			lv_niovecs;	/* number of iovecs in lv */
	struct xfs_log_iovec	*lv_iovecp;	/* iovec array */
104 105 106
	struct xfs_log_item	*lv_item;	/* owner */
	char			*lv_buf;	/* formatted buffer */
	int			lv_buf_len;	/* size of formatted buffer */
107 108
};

109 110
#define XFS_LOG_VEC_ORDERED	(-1)

L
Linus Torvalds 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124
/*
 * 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;
125
struct xlog_in_core;
126
struct xlog_ticket;
127 128
struct xfs_log_item;
struct xfs_item_ops;
129
struct xfs_trans;
130 131 132 133

void	xfs_log_item_init(struct xfs_mount	*mp,
			struct xfs_log_item	*item,
			int			type,
C
Christoph Hellwig 已提交
134
			const struct xfs_item_ops *ops);
135

L
Linus Torvalds 已提交
136
xfs_lsn_t xfs_log_done(struct xfs_mount *mp,
137 138
		       struct xlog_ticket *ticket,
		       struct xlog_in_core **iclog,
L
Linus Torvalds 已提交
139
		       uint		flags);
140 141 142
int	  _xfs_log_force(struct xfs_mount *mp,
			 uint		flags,
			 int		*log_forced);
143 144
void	  xfs_log_force(struct xfs_mount	*mp,
			uint			flags);
145 146 147 148 149 150 151
int	  _xfs_log_force_lsn(struct xfs_mount *mp,
			     xfs_lsn_t		lsn,
			     uint		flags,
			     int		*log_forced);
void	  xfs_log_force_lsn(struct xfs_mount	*mp,
			    xfs_lsn_t		lsn,
			    uint		flags);
L
Linus Torvalds 已提交
152 153 154 155
int	  xfs_log_mount(struct xfs_mount	*mp,
			struct xfs_buftarg	*log_target,
			xfs_daddr_t		start_block,
			int		 	num_bblocks);
C
Christoph Hellwig 已提交
156
int	  xfs_log_mount_finish(struct xfs_mount *mp);
157
xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);
158
xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp);
159
void	  xfs_log_space_wake(struct xfs_mount *mp);
L
Linus Torvalds 已提交
160
int	  xfs_log_notify(struct xfs_mount	*mp,
161
			 struct xlog_in_core	*iclog,
L
Linus Torvalds 已提交
162 163
			 xfs_log_callback_t	*callback_entry);
int	  xfs_log_release_iclog(struct xfs_mount *mp,
164
			 struct xlog_in_core	 *iclog);
L
Linus Torvalds 已提交
165 166 167
int	  xfs_log_reserve(struct xfs_mount *mp,
			  int		   length,
			  int		   count,
168
			  struct xlog_ticket **ticket,
L
Linus Torvalds 已提交
169
			  __uint8_t	   clientid,
170
			  bool		   permanent,
171
			  uint		   t_type);
172
int	  xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
L
Linus Torvalds 已提交
173
int	  xfs_log_unmount_write(struct xfs_mount *mp);
174
void      xfs_log_unmount(struct xfs_mount *mp);
L
Linus Torvalds 已提交
175 176 177 178 179
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 *);

180
struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
181 182
void	  xfs_log_ticket_put(struct xlog_ticket *ticket);

183
int	xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp,
184
				xfs_lsn_t *commit_lsn, int flags);
185
bool	xfs_log_item_in_current_chkpt(struct xfs_log_item *lip);
186

187 188
void	xfs_log_work_queue(struct xfs_mount *mp);
void	xfs_log_worker(struct work_struct *work);
189
void	xfs_log_quiesce(struct xfs_mount *mp);
190

L
Linus Torvalds 已提交
191 192
#endif
#endif	/* __XFS_LOG_H__ */