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
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 */
27 28
	int			lv_bytes;	/* accounted space in buffer */
	int			lv_buf_len;	/* aligned size of buffer */
29
	int			lv_size;	/* size of allocated lv */
30 31 32 33
};

#define XFS_LOG_VEC_ORDERED	(-1)

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

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

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

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

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

56 57 58 59 60 61 62 63 64 65
/*
 * 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 padding when
 * sizing the buffer.
 *
 * However, this padding does not get written into the log, and hence we have to
 * track the space used by the log vectors separately to prevent log space hangs
 * due to inaccurate accounting (i.e. a leak) of the used log space through the
 * CIL context ticket.
 */
66 67 68 69
static inline void
xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len)
{
	lv->lv_buf_len += round_up(len, sizeof(uint64_t));
70
	lv->lv_bytes += len;
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
	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;
}

86 87 88 89 90 91 92 93 94
/*
 * 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 已提交
95 96

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

/*
 * 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;
122
struct xlog_in_core;
123
struct xlog_ticket;
124 125
struct xfs_log_item;
struct xfs_item_ops;
126
struct xfs_trans;
127

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

168
struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
169 170
void	  xfs_log_ticket_put(struct xlog_ticket *ticket);

171
void	xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp,
172
				xfs_lsn_t *commit_lsn, bool regrant);
173
bool	xfs_log_item_in_current_chkpt(struct xfs_log_item *lip);
174

175
void	xfs_log_work_queue(struct xfs_mount *mp);
176
void	xfs_log_quiesce(struct xfs_mount *mp);
177
bool	xfs_log_check_lsn(struct xfs_mount *, xfs_lsn_t);
178

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