brintos

brintos / linux-shallow public Read only

0
0
Text · 3.0 KiB · 41b7c43 Raw
98 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2000,2005 Silicon Graphics, Inc.4 * All Rights Reserved.5 */6#ifndef	__XFS_EXTFREE_ITEM_H__7#define	__XFS_EXTFREE_ITEM_H__8 9/* kernel only EFI/EFD definitions */10 11struct xfs_mount;12struct kmem_cache;13 14/*15 * Max number of extents in fast allocation path.16 */17#define	XFS_EFI_MAX_FAST_EXTENTS	1618 19/*20 * This is the "extent free intention" log item.  It is used to log the fact21 * that some extents need to be free.  It is used in conjunction with the22 * "extent free done" log item described below.23 *24 * The EFI is reference counted so that it is not freed prior to both the EFI25 * and EFD being committed and unpinned. This ensures the EFI is inserted into26 * the AIL even in the event of out of order EFI/EFD processing. In other words,27 * an EFI is born with two references:28 *29 * 	1.) an EFI held reference to track EFI AIL insertion30 * 	2.) an EFD held reference to track EFD commit31 *32 * On allocation, both references are the responsibility of the caller. Once the33 * EFI is added to and dirtied in a transaction, ownership of reference one34 * transfers to the transaction. The reference is dropped once the EFI is35 * inserted to the AIL or in the event of failure along the way (e.g., commit36 * failure, log I/O error, etc.). Note that the caller remains responsible for37 * the EFD reference under all circumstances to this point. The caller has no38 * means to detect failure once the transaction is committed, however.39 * Therefore, an EFD is required after this point, even in the event of40 * unrelated failure.41 *42 * Once an EFD is allocated and dirtied in a transaction, reference two43 * transfers to the transaction. The EFD reference is dropped once it reaches44 * the unpin handler. Similar to the EFI, the reference also drops in the event45 * of commit failure or log I/O errors. Note that the EFD is not inserted in the46 * AIL, so at this point both the EFI and EFD are freed.47 */48struct xfs_efi_log_item {49	struct xfs_log_item	efi_item;50	atomic_t		efi_refcount;51	atomic_t		efi_next_extent;52	xfs_efi_log_format_t	efi_format;53};54 55static inline size_t56xfs_efi_log_item_sizeof(57	unsigned int		nr)58{59	return offsetof(struct xfs_efi_log_item, efi_format) +60			xfs_efi_log_format_sizeof(nr);61}62 63/*64 * This is the "extent free done" log item.  It is used to log65 * the fact that some extents earlier mentioned in an efi item66 * have been freed.67 */68struct xfs_efd_log_item {69	struct xfs_log_item	efd_item;70	struct xfs_efi_log_item *efd_efip;71	uint			efd_next_extent;72	xfs_efd_log_format_t	efd_format;73};74 75static inline size_t76xfs_efd_log_item_sizeof(77	unsigned int		nr)78{79	return offsetof(struct xfs_efd_log_item, efd_format) +80			xfs_efd_log_format_sizeof(nr);81}82 83/*84 * Max number of extents in fast allocation path.85 */86#define	XFS_EFD_MAX_FAST_EXTENTS	1687 88extern struct kmem_cache	*xfs_efi_cache;89extern struct kmem_cache	*xfs_efd_cache;90 91struct xfs_extent_free_item;92 93void xfs_extent_free_defer_add(struct xfs_trans *tp,94		struct xfs_extent_free_item *xefi,95		struct xfs_defer_pending **dfpp);96 97#endif	/* __XFS_EXTFREE_ITEM_H__ */98