mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 23:21:31 +00:00
5e4b5386a2
Release of the EFI either occurs based on the reference count or the extent count. The extent count used is either the count tracked in the EFI or EFD, depending on the particular situation. In either case, the count is initialized to the final value and thus always matches the current efi_next_extent value once the EFI is completely constructed. For example, the EFI extent count is increased as the extents are logged in xfs_bmap_finish() and the full free list is always completely processed. Therefore, the count is guaranteed to be complete once the EFI transaction is committed. The EFD uses the efd_nextents counter to release the EFI. This counter is initialized to the count of the EFI when the EFD is created. Thus the EFD, as currently used, has no concept of partial EFI release based on extent count. Given that the EFI extent count is always released in whole, use of the extent count for reference counting is unnecessary. Remove this level of the API and release the EFI based on the core reference count. The efi_next_extent counter remains because it is still used to track the slot to log the next extent to free. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
83 lines
2.6 KiB
C
83 lines
2.6 KiB
C
/*
|
|
* Copyright (c) 2000,2005 Silicon Graphics, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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
|
|
*/
|
|
#ifndef __XFS_EXTFREE_ITEM_H__
|
|
#define __XFS_EXTFREE_ITEM_H__
|
|
|
|
/* kernel only EFI/EFD definitions */
|
|
|
|
struct xfs_mount;
|
|
struct kmem_zone;
|
|
|
|
/*
|
|
* Max number of extents in fast allocation path.
|
|
*/
|
|
#define XFS_EFI_MAX_FAST_EXTENTS 16
|
|
|
|
/*
|
|
* Define EFI flag bits. Manipulated by set/clear/test_bit operators.
|
|
*/
|
|
#define XFS_EFI_RECOVERED 1
|
|
|
|
/*
|
|
* 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
|
|
* and EFD being committed and unpinned. This ensures that when the last
|
|
* reference goes away the EFI will always be in the AIL as it has been
|
|
* unpinned, regardless of whether the EFD is processed before or after the EFI.
|
|
*/
|
|
typedef struct xfs_efi_log_item {
|
|
xfs_log_item_t efi_item;
|
|
atomic_t efi_refcount;
|
|
atomic_t efi_next_extent;
|
|
unsigned long efi_flags; /* misc flags */
|
|
xfs_efi_log_format_t efi_format;
|
|
} xfs_efi_log_item_t;
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
typedef struct xfs_efd_log_item {
|
|
xfs_log_item_t efd_item;
|
|
xfs_efi_log_item_t *efd_efip;
|
|
uint efd_next_extent;
|
|
xfs_efd_log_format_t efd_format;
|
|
} xfs_efd_log_item_t;
|
|
|
|
/*
|
|
* 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;
|
|
|
|
xfs_efi_log_item_t *xfs_efi_init(struct xfs_mount *, uint);
|
|
xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *,
|
|
uint);
|
|
int xfs_efi_copy_format(xfs_log_iovec_t *buf,
|
|
xfs_efi_log_format_t *dst_efi_fmt);
|
|
void xfs_efi_item_free(xfs_efi_log_item_t *);
|
|
void xfs_efi_release(struct xfs_efi_log_item *);
|
|
|
|
#endif /* __XFS_EXTFREE_ITEM_H__ */
|