xfs_log.h 4.3 KB
Newer Older
D
Dave Chinner 已提交
1
// SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2
/*
3 4
 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
 * All Rights Reserved.
L
Linus Torvalds 已提交
5 6 7 8
 */
#ifndef	__XFS_LOG_H__
#define __XFS_LOG_H__

9 10
struct xfs_cil_ctx;

11 12 13 14 15 16
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 */
17 18
	int			lv_bytes;	/* accounted space in buffer */
	int			lv_buf_len;	/* aligned size of buffer */
19
	int			lv_size;	/* size of allocated lv */
20 21 22 23
};

#define XFS_LOG_VEC_ORDERED	(-1)

C
Christoph Hellwig 已提交
24
static inline void *
25 26
xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
		uint type)
C
Christoph Hellwig 已提交
27 28 29
{
	struct xfs_log_iovec *vec = *vecp;

30 31 32 33 34 35 36
	if (vec) {
		ASSERT(vec - lv->lv_iovecp < lv->lv_niovecs);
		vec++;
	} else {
		vec = &lv->lv_iovecp[0];
	}

C
Christoph Hellwig 已提交
37
	vec->i_type = type;
38 39 40
	vec->i_addr = lv->lv_buf + lv->lv_buf_len;

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

42
	*vecp = vec;
C
Christoph Hellwig 已提交
43 44 45
	return vec->i_addr;
}

46 47 48 49 50 51 52 53 54 55
/*
 * 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.
 */
56 57 58 59
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));
60
	lv->lv_bytes += len;
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
	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;
}

L
Linus Torvalds 已提交
76
/*
77
 * By comparing each component, we don't have to worry about extra
L
Linus Torvalds 已提交
78 79
 * endian issues in treating two 32 bit numbers as one 64 bit number
 */
A
Andrew Morton 已提交
80
static inline xfs_lsn_t	_lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2)
L
Linus Torvalds 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
{
	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;
102
struct xlog_in_core;
103
struct xlog_ticket;
104 105
struct xfs_log_item;
struct xfs_item_ops;
106
struct xfs_trans;
107

L
Linus Torvalds 已提交
108
xfs_lsn_t xfs_log_done(struct xfs_mount *mp,
109 110
		       struct xlog_ticket *ticket,
		       struct xlog_in_core **iclog,
111
		       bool regrant);
112
int	  xfs_log_force(struct xfs_mount *mp, uint flags);
113 114
int	  xfs_log_force_lsn(struct xfs_mount *mp, xfs_lsn_t lsn, uint flags,
		int *log_forced);
L
Linus Torvalds 已提交
115 116 117 118
int	  xfs_log_mount(struct xfs_mount	*mp,
			struct xfs_buftarg	*log_target,
			xfs_daddr_t		start_block,
			int		 	num_bblocks);
C
Christoph Hellwig 已提交
119
int	  xfs_log_mount_finish(struct xfs_mount *mp);
120
void	xfs_log_mount_cancel(struct xfs_mount *);
121
xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp);
122
xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp);
123
void	  xfs_log_space_wake(struct xfs_mount *mp);
124
void	  xfs_log_release_iclog(struct xlog_in_core *iclog);
L
Linus Torvalds 已提交
125 126 127
int	  xfs_log_reserve(struct xfs_mount *mp,
			  int		   length,
			  int		   count,
128
			  struct xlog_ticket **ticket,
129
			  uint8_t		   clientid,
130
			  bool		   permanent);
131
int	  xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic);
132
void      xfs_log_unmount(struct xfs_mount *mp);
L
Linus Torvalds 已提交
133 134
int	  xfs_log_force_umount(struct xfs_mount *mp, int logerror);

135
struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket);
136 137
void	  xfs_log_ticket_put(struct xlog_ticket *ticket);

138
void	xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp,
139
				xfs_lsn_t *commit_lsn, bool regrant);
140
void	xlog_cil_process_committed(struct list_head *list);
141
bool	xfs_log_item_in_current_chkpt(struct xfs_log_item *lip);
142

143
void	xfs_log_work_queue(struct xfs_mount *mp);
144
void	xfs_log_quiesce(struct xfs_mount *mp);
145
bool	xfs_log_check_lsn(struct xfs_mount *, xfs_lsn_t);
146
bool	xfs_log_in_recovery(struct xfs_mount *);
147

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