xfs_trans_priv.h 4.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3
 * Copyright (c) 2000,2002,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 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
 */
#ifndef __XFS_TRANS_PRIV_H__
#define	__XFS_TRANS_PRIV_H__

struct xfs_log_item;
struct xfs_log_item_desc;
struct xfs_mount;
struct xfs_trans;

/*
 * From xfs_trans_item.c
 */
struct xfs_log_item_desc	*xfs_trans_add_item(struct xfs_trans *,
					    struct xfs_log_item *);
void				xfs_trans_free_item(struct xfs_trans *,
					    struct xfs_log_item_desc *);
struct xfs_log_item_desc	*xfs_trans_find_item(struct xfs_trans *,
					     struct xfs_log_item *);
struct xfs_log_item_desc	*xfs_trans_first_item(struct xfs_trans *);
struct xfs_log_item_desc	*xfs_trans_next_item(struct xfs_trans *,
					     struct xfs_log_item_desc *);
void				xfs_trans_free_items(struct xfs_trans *, int);
void				xfs_trans_unlock_items(struct xfs_trans *,
							xfs_lsn_t);
void				xfs_trans_free_busy(xfs_trans_t *tp);
xfs_log_busy_slot_t		*xfs_trans_add_busy(xfs_trans_t *tp,
						    xfs_agnumber_t ag,
						    xfs_extlen_t idx);

/*
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 * AIL traversal cursor.
 *
 * Rather than using a generation number for detecting changes in the ail, use
 * a cursor that is protected by the ail lock. The aild cursor exists in the
 * struct xfs_ail, but other traversals can declare it on the stack and link it
 * to the ail list.
 *
 * When an object is deleted from or moved int the AIL, the cursor list is
 * searched to see if the object is a designated cursor item. If it is, it is
 * deleted from the cursor so that the next time the cursor is used traversal
 * will return to the start.
 *
 * This means a traversal colliding with a removal will cause a restart of the
 * list scan, rather than any insertion or deletion anywhere in the list. The
 * low bit of the item pointer is set if the cursor has been invalidated so
 * that we can tell the difference between invalidation and reaching the end
 * of the list to trigger traversal restarts.
L
Linus Torvalds 已提交
64
 */
65 66 67 68
struct xfs_ail_cursor {
	struct xfs_ail_cursor	*next;
	struct xfs_log_item	*item;
};
L
Linus Torvalds 已提交
69

70
/*
71 72 73
 * Private AIL structures.
 *
 * Eventually we need to drive the locking in here as well.
74
 */
D
David Chinner 已提交
75 76 77 78 79 80
struct xfs_ail {
	struct xfs_mount	*xa_mount;
	struct list_head	xa_ail;
	uint			xa_gen;
	struct task_struct	*xa_task;
	xfs_lsn_t		xa_target;
81
	struct xfs_ail_cursor	xa_cursors;
82
	spinlock_t		xa_lock;
D
David Chinner 已提交
83 84
};

85 86 87 88 89 90 91 92 93 94
/*
 * From xfs_trans_ail.c
 */
void			xfs_trans_update_ail(struct xfs_mount *mp,
				     struct xfs_log_item *lip, xfs_lsn_t lsn)
				     __releases(mp->m_ail_lock);
void			xfs_trans_delete_ail(struct xfs_mount *mp,
				     struct xfs_log_item *lip)
				     __releases(mp->m_ail_lock);

95 96 97 98 99 100
xfs_lsn_t		xfs_trans_ail_tail(struct xfs_ail *ailp);

struct xfs_log_item	*xfs_trans_ail_cursor_first(struct xfs_ail *ailp,
					struct xfs_ail_cursor *cur,
					xfs_lsn_t lsn);
struct xfs_log_item	*xfs_trans_ail_cursor_next(struct xfs_ail *ailp,
101
					struct xfs_ail_cursor *cur);
102
void			xfs_trans_ail_cursor_done(struct xfs_ail *ailp,
103 104
					struct xfs_ail_cursor *cur);

D
David Chinner 已提交
105 106 107 108
long	xfsaild_push(struct xfs_ail *, xfs_lsn_t *);
void	xfsaild_wakeup(struct xfs_ail *, xfs_lsn_t);
int	xfsaild_start(struct xfs_ail *);
void	xfsaild_stop(struct xfs_ail *);
109

110 111 112 113 114 115 116 117
#if BITS_PER_LONG != 64
static inline void
xfs_trans_ail_copy_lsn(
	struct xfs_ail	*ailp,
	xfs_lsn_t	*dst,
	xfs_lsn_t	*src)
{
	ASSERT(sizeof(xfs_lsn_t) == 8);	/* don't lock if it shrinks */
118
	spin_lock(&ailp->xa_lock);
119
	*dst = *src;
120
	spin_unlock(&ailp->xa_lock);
121 122 123 124 125 126 127 128 129 130 131 132
}
#else
static inline void
xfs_trans_ail_copy_lsn(
	struct xfs_ail	*ailp,
	xfs_lsn_t	*dst,
	xfs_lsn_t	*src)
{
	ASSERT(sizeof(xfs_lsn_t) == 8);
	*dst = *src;
}
#endif
L
Linus Torvalds 已提交
133
#endif	/* __XFS_TRANS_PRIV_H__ */