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

9 10
/* kernel only EFI/EFD definitions */

L
Linus Torvalds 已提交
11 12 13 14 15 16 17 18 19
struct xfs_mount;
struct kmem_zone;

/*
 * Max number of extents in fast allocation path.
 */
#define	XFS_EFI_MAX_FAST_EXTENTS	16

/*
20
 * Define EFI flag bits. Manipulated by set/clear/test_bit operators.
L
Linus Torvalds 已提交
21
 */
22
#define	XFS_EFI_RECOVERED	1
L
Linus Torvalds 已提交
23 24

/*
25 26 27 28 29
 * This is the "extent free intention" log item.  It is used to log the fact
 * that some extents need to be free.  It is used in conjunction with the
 * "extent free done" log item described below.
 *
 * The EFI is reference counted so that it is not freed prior to both the EFI
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
 * and EFD being committed and unpinned. This ensures the EFI is inserted into
 * the AIL even in the event of out of order EFI/EFD processing. In other words,
 * an EFI is born with two references:
 *
 * 	1.) an EFI held reference to track EFI AIL insertion
 * 	2.) an EFD held reference to track EFD commit
 *
 * On allocation, both references are the responsibility of the caller. Once the
 * EFI is added to and dirtied in a transaction, ownership of reference one
 * transfers to the transaction. The reference is dropped once the EFI is
 * inserted to the AIL or in the event of failure along the way (e.g., commit
 * failure, log I/O error, etc.). Note that the caller remains responsible for
 * the EFD reference under all circumstances to this point. The caller has no
 * means to detect failure once the transaction is committed, however.
 * Therefore, an EFD is required after this point, even in the event of
 * unrelated failure.
 *
 * Once an EFD is allocated and dirtied in a transaction, reference two
 * transfers to the transaction. The EFD reference is dropped once it reaches
 * the unpin handler. Similar to the EFI, the reference also drops in the event
 * of commit failure or log I/O errors. Note that the EFD is not inserted in the
 * AIL, so at this point both the EFI and EFD are freed.
L
Linus Torvalds 已提交
52
 */
53
struct xfs_efi_log_item {
54
	struct xfs_log_item	efi_item;
55
	atomic_t		efi_refcount;
56 57
	atomic_t		efi_next_extent;
	unsigned long		efi_flags;	/* misc flags */
L
Linus Torvalds 已提交
58
	xfs_efi_log_format_t	efi_format;
59
};
L
Linus Torvalds 已提交
60 61 62 63 64 65

/*
 * This is the "extent free done" log item.  It is used to log
 * the fact that some extents earlier mentioned in an efi item
 * have been freed.
 */
66
struct xfs_efd_log_item {
67
	struct xfs_log_item	efd_item;
68
	struct xfs_efi_log_item *efd_efip;
L
Linus Torvalds 已提交
69 70
	uint			efd_next_extent;
	xfs_efd_log_format_t	efd_format;
71
};
L
Linus Torvalds 已提交
72 73 74 75 76 77 78 79 80

/*
 * Max number of extents in fast allocation path.
 */
#define	XFS_EFD_MAX_FAST_EXTENTS	16

extern struct kmem_zone	*xfs_efi_zone;
extern struct kmem_zone	*xfs_efd_zone;

81
void			xfs_efi_release(struct xfs_efi_log_item *);
82

83 84 85
int			xfs_efi_recover(struct xfs_mount *mp,
					struct xfs_efi_log_item *efip);

L
Linus Torvalds 已提交
86
#endif	/* __XFS_EXTFREE_ITEM_H__ */