Commit 9329ba89 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: refactor recovered BUI log item playback



Move the code that processes the log items created from the recovered
log items into the per-item source code files and use dispatch functions
to call them.  No functional changes.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent c57ed2f5
Loading
Loading
Loading
Loading
+35 −9
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@
kmem_zone_t	*xfs_bui_zone;
kmem_zone_t	*xfs_bud_zone;

static const struct xfs_item_ops xfs_bui_item_ops;

static inline struct xfs_bui_log_item *BUI_ITEM(struct xfs_log_item *lip)
{
	return container_of(lip, struct xfs_bui_log_item, bui_item);
@@ -47,7 +49,7 @@ xfs_bui_item_free(
 * committed vs unpin operations in bulk insert operations. Hence the reference
 * count to ensure only the last caller frees the BUI.
 */
void
STATIC void
xfs_bui_release(
	struct xfs_bui_log_item	*buip)
{
@@ -126,13 +128,6 @@ xfs_bui_item_release(
	xfs_bui_release(BUI_ITEM(lip));
}

static const struct xfs_item_ops xfs_bui_item_ops = {
	.iop_size	= xfs_bui_item_size,
	.iop_format	= xfs_bui_item_format,
	.iop_unpin	= xfs_bui_item_unpin,
	.iop_release	= xfs_bui_item_release,
};

/*
 * Allocate and initialize an bui item with the given number of extents.
 */
@@ -425,7 +420,7 @@ const struct xfs_defer_op_type xfs_bmap_update_defer_type = {
 * Process a bmap update intent item that was recovered from the log.
 * We need to update some inode's bmbt.
 */
int
STATIC int
xfs_bui_recover(
	struct xfs_trans		*parent_tp,
	struct xfs_bui_log_item		*buip)
@@ -560,6 +555,37 @@ xfs_bui_recover(
	return error;
}

/* Recover the BUI if necessary. */
STATIC int
xfs_bui_item_recover(
	struct xfs_log_item		*lip,
	struct xfs_trans		*tp)
{
	struct xfs_ail			*ailp = lip->li_ailp;
	struct xfs_bui_log_item		*buip = BUI_ITEM(lip);
	int				error;

	/*
	 * Skip BUIs that we've already processed.
	 */
	if (test_bit(XFS_BUI_RECOVERED, &buip->bui_flags))
		return 0;

	spin_unlock(&ailp->ail_lock);
	error = xfs_bui_recover(tp, buip);
	spin_lock(&ailp->ail_lock);

	return error;
}

static const struct xfs_item_ops xfs_bui_item_ops = {
	.iop_size	= xfs_bui_item_size,
	.iop_format	= xfs_bui_item_format,
	.iop_unpin	= xfs_bui_item_unpin,
	.iop_release	= xfs_bui_item_release,
	.iop_recover	= xfs_bui_item_recover,
};

/*
 * Copy an BUI format buffer from the given buf, and into the destination
 * BUI format structure.  The BUI/BUD items were designed not to need any
+0 −3
Original line number Diff line number Diff line
@@ -74,7 +74,4 @@ struct xfs_bud_log_item {
extern struct kmem_zone	*xfs_bui_zone;
extern struct kmem_zone	*xfs_bud_zone;

void xfs_bui_release(struct xfs_bui_log_item *);
int xfs_bui_recover(struct xfs_trans *parent_tp, struct xfs_bui_log_item *buip);

#endif	/* __XFS_BMAP_ITEM_H__ */
+6 −61
Original line number Diff line number Diff line
@@ -2546,46 +2546,6 @@ xlog_recover_process_data(
	return 0;
}

/* Recover the BUI if necessary. */
STATIC int
xlog_recover_process_bui(
	struct xfs_trans		*parent_tp,
	struct xfs_ail			*ailp,
	struct xfs_log_item		*lip)
{
	struct xfs_bui_log_item		*buip;
	int				error;

	/*
	 * Skip BUIs that we've already processed.
	 */
	buip = container_of(lip, struct xfs_bui_log_item, bui_item);
	if (test_bit(XFS_BUI_RECOVERED, &buip->bui_flags))
		return 0;

	spin_unlock(&ailp->ail_lock);
	error = xfs_bui_recover(parent_tp, buip);
	spin_lock(&ailp->ail_lock);

	return error;
}

/* Release the BUI since we're cancelling everything. */
STATIC void
xlog_recover_cancel_bui(
	struct xfs_mount		*mp,
	struct xfs_ail			*ailp,
	struct xfs_log_item		*lip)
{
	struct xfs_bui_log_item		*buip;

	buip = container_of(lip, struct xfs_bui_log_item, bui_item);

	spin_unlock(&ailp->ail_lock);
	xfs_bui_release(buip);
	spin_lock(&ailp->ail_lock);
}

/* Is this log item a deferred action intent? */
static inline bool xlog_item_is_intent(struct xfs_log_item *lip)
{
@@ -2704,18 +2664,11 @@ xlog_recover_process_intents(

		/*
		 * NOTE: If your intent processing routine can create more
		 * deferred ops, you /must/ attach them to the dfops in this
		 * routine or else those subsequent intents will get
		 * deferred ops, you /must/ attach them to the transaction in
		 * this routine or else those subsequent intents will get
		 * replayed in the wrong order!
		 */
		switch (lip->li_type) {
		case XFS_LI_BUI:
			error = xlog_recover_process_bui(parent_tp, ailp, lip);
			break;
		default:
		error = lip->li_ops->iop_recover(lip, parent_tp);
			break;
		}
		if (error)
			goto out;
		lip = xfs_trans_ail_cursor_next(ailp, &cur);
@@ -2758,17 +2711,9 @@ xlog_recover_cancel_intents(
			break;
		}

		switch (lip->li_type) {
		case XFS_LI_BUI:
			xlog_recover_cancel_bui(log->l_mp, ailp, lip);
			break;
		default:
		spin_unlock(&ailp->ail_lock);
		lip->li_ops->iop_release(lip);
		spin_lock(&ailp->ail_lock);
			break;
		}

		lip = xfs_trans_ail_cursor_next(ailp, &cur);
	}