xfs_log.h 5.3 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
 */
#ifndef	__XFS_LOG_H__
#define __XFS_LOG_H__

21 22 23 24 25 26 27
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 */
	struct xfs_log_item	*lv_item;	/* owner */
	char			*lv_buf;	/* formatted buffer */
	int			lv_buf_len;	/* size of formatted buffer */
28
	int			lv_size;	/* size of allocated lv */
29 30 31 32
};

#define XFS_LOG_VEC_ORDERED	(-1)

C
Christoph Hellwig 已提交
33
static inline void *
34 35
xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
		uint type)
C
Christoph Hellwig 已提交
36 37 38
{
	struct xfs_log_iovec *vec = *vecp;

39 40 41 42 43 44 45
	if (vec) {
		ASSERT(vec - lv->lv_iovecp < lv->lv_niovecs);
		vec++;
	} else {
		vec = &lv->lv_iovecp[0];
	}

C
Christoph Hellwig 已提交
46
	vec->i_type = type;
47 48 49
	vec->i_addr = lv->lv_buf + lv->lv_buf_len;

	ASSERT(IS_ALIGNED((unsigned long)vec->i_addr, sizeof(uint64_t)));
C
Christoph Hellwig 已提交
50

51
	*vecp = vec;
C
Christoph Hellwig 已提交
52 53 54
	return vec->i_addr;
}

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
static inline void
xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len)
{
	/*
	 * We need to make sure the next buffer is naturally aligned for the
	 * biggest basic data type we put into it.  We already accounted for
	 * this when sizing the buffer.
	 */
	lv->lv_buf_len += round_up(len, sizeof(uint64_t));
	vec->i_len = len;
}

static inline void *
xlog_copy_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
		uint type, void *data, int len)
{
	void *buf;

	buf = xlog_prepare_iovec(lv, vecp, type);
	memcpy(buf, data, len);
	xlog_finish_iovec(lv, *vecp, len);
	return buf;
}

79 80 81 82 83 84 85 86 87
/*
 * 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;
L
Linus Torvalds 已提交
88 89

/*
90
 * By comparing each component, we don't have to worry about extra
L
Linus Torvalds 已提交
91 92
 * endian issues in treating two 32 bit numbers as one 64 bit number
 */
A
Andrew Morton 已提交
93
static inline xfs_lsn_t	_lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2)
L
Linus Torvalds 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
{
	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

/* Log manager interfaces */
struct xfs_mount;
124
struct xlog_in_core;
125
struct xlog_ticket;
126 127
struct xfs_log_item;
struct xfs_item_ops;
128
struct xfs_trans;
129
struct xfs_log_callback;
130

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

175
struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
176 177
void	  xfs_log_ticket_put(struct xlog_ticket *ticket);

178
void	xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp,
179
				xfs_lsn_t *commit_lsn, int flags);
180
bool	xfs_log_item_in_current_chkpt(struct xfs_log_item *lip);
181

182 183
void	xfs_log_work_queue(struct xfs_mount *mp);
void	xfs_log_worker(struct work_struct *work);
184
void	xfs_log_quiesce(struct xfs_mount *mp);
185

L
Linus Torvalds 已提交
186
#endif	/* __XFS_LOG_H__ */