Commit 84a3c157 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: move xfs_extent_free_defer_add to xfs_extfree_item.c



Move the code that adds the incore xfs_extent_free_item deferred work
data to a transaction to live with the EFI log item code.  This means
that the allocator code no longer has to know about the inner workings
of the EFI log items.

As a consequence, we can get rid of the _{get,put}_group helpers.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 7272f77c
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include "xfs_ag_resv.h"
#include "xfs_bmap.h"
#include "xfs_health.h"
#include "xfs_extfree_item.h"

struct kmem_cache	*xfs_extfree_item_cache;

@@ -2552,16 +2553,7 @@ xfs_defer_extent_free(
		xefi->xefi_owner = XFS_RMAP_OWN_NULL;
	}

	trace_xfs_extent_free_defer(mp, xefi);

	xfs_extent_free_get_group(mp, xefi);

	if (xefi->xefi_agresv == XFS_AG_RESV_AGFL)
		*dfpp = xfs_defer_add(tp, &xefi->xefi_list,
				&xfs_agfl_free_defer_type);
	else
		*dfpp = xfs_defer_add(tp, &xefi->xefi_list,
				&xfs_extent_free_defer_type);
	xfs_extent_free_defer_add(tp, xefi, dfpp);
	return 0;
}

+0 −3
Original line number Diff line number Diff line
@@ -256,9 +256,6 @@ struct xfs_extent_free_item {
	enum xfs_ag_resv_type	xefi_agresv;
};

void xfs_extent_free_get_group(struct xfs_mount *mp,
		struct xfs_extent_free_item *xefi);

#define XFS_EFI_SKIP_DISCARD	(1U << 0) /* don't issue discard */
#define XFS_EFI_ATTR_FORK	(1U << 1) /* freeing attr fork block */
#define XFS_EFI_BMBT_BLOCK	(1U << 2) /* freeing bmap btree block */
+17 −14
Original line number Diff line number Diff line
@@ -436,21 +436,24 @@ xfs_extent_free_create_done(
	return &efdp->efd_item;
}

/* Take a passive ref to the AG containing the space we're freeing. */
/* Add this deferred EFI to the transaction. */
void
xfs_extent_free_get_group(
	struct xfs_mount		*mp,
	struct xfs_extent_free_item	*xefi)
xfs_extent_free_defer_add(
	struct xfs_trans		*tp,
	struct xfs_extent_free_item	*xefi,
	struct xfs_defer_pending	**dfpp)
{
	xefi->xefi_pag = xfs_perag_intent_get(mp, xefi->xefi_startblock);
}
	struct xfs_mount		*mp = tp->t_mountp;

/* Release a passive AG ref after some freeing work. */
static inline void
xfs_extent_free_put_group(
	struct xfs_extent_free_item	*xefi)
{
	xfs_perag_intent_put(xefi->xefi_pag);
	trace_xfs_extent_free_defer(mp, xefi);

	xefi->xefi_pag = xfs_perag_intent_get(mp, xefi->xefi_startblock);
	if (xefi->xefi_agresv == XFS_AG_RESV_AGFL)
		*dfpp = xfs_defer_add(tp, &xefi->xefi_list,
				&xfs_agfl_free_defer_type);
	else
		*dfpp = xfs_defer_add(tp, &xefi->xefi_list,
				&xfs_extent_free_defer_type);
}

/* Cancel a free extent. */
@@ -460,7 +463,7 @@ xfs_extent_free_cancel_item(
{
	struct xfs_extent_free_item	*xefi = xefi_entry(item);

	xfs_extent_free_put_group(xefi);
	xfs_perag_intent_put(xefi->xefi_pag);
	kmem_cache_free(xfs_extfree_item_cache, xefi);
}

@@ -575,7 +578,7 @@ xfs_efi_recover_work(
	xefi->xefi_blockcount = extp->ext_len;
	xefi->xefi_agresv = XFS_AG_RESV_NONE;
	xefi->xefi_owner = XFS_RMAP_OWN_UNKNOWN;
	xfs_extent_free_get_group(mp, xefi);
	xefi->xefi_pag = xfs_perag_intent_get(mp, extp->ext_start);

	xfs_defer_add_item(dfp, &xefi->xefi_list);
}
+6 −0
Original line number Diff line number Diff line
@@ -88,4 +88,10 @@ xfs_efd_log_item_sizeof(
extern struct kmem_cache	*xfs_efi_cache;
extern struct kmem_cache	*xfs_efd_cache;

struct xfs_extent_free_item;

void xfs_extent_free_defer_add(struct xfs_trans *tp,
		struct xfs_extent_free_item *xefi,
		struct xfs_defer_pending **dfpp);

#endif	/* __XFS_EXTFREE_ITEM_H__ */