Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0450948 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Alex Elder
Browse files

xfs: refactor xlog_recover_commit_trans



Merge the call to xlog_recover_reorder_trans and the loop over the
recovery items from xlog_recover_do_trans into xlog_recover_commit_trans,
and keep the switch statement over the log item types as a separate helper.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
parent d5689eaa
Loading
Loading
Loading
Loading
+53 −64
Original line number Diff line number Diff line
@@ -2674,100 +2674,89 @@ xlog_recover_do_efd_trans(
}

/*
 * Perform the transaction
 * Free up any resources allocated by the transaction
 *
 * If the transaction modifies a buffer or inode, do it now.  Otherwise,
 * EFIs and EFDs get queued up by adding entries into the AIL for them.
 * Remember that EFIs, EFDs, and IUNLINKs are handled later.
 */
STATIC int
xlog_recover_do_trans(
	xlog_t			*log,
	xlog_recover_t		*trans,
	int			pass)
STATIC void
xlog_recover_free_trans(
	struct xlog_recover	*trans)
{
	int			error = 0;
	xlog_recover_item_t	*item;
	xlog_recover_item_t	*item, *n;
	int			i;

	error = xlog_recover_reorder_trans(log, trans, pass);
	if (error)
		return error;
	list_for_each_entry_safe(item, n, &trans->r_itemq, ri_list) {
		/* Free the regions in the item. */
		list_del(&item->ri_list);
		for (i = 0; i < item->ri_cnt; i++)
			kmem_free(item->ri_buf[i].i_addr);
		/* Free the item itself */
		kmem_free(item->ri_buf);
		kmem_free(item);
	}
	/* Free the transaction recover structure */
	kmem_free(trans);
}

	list_for_each_entry(item, &trans->r_itemq, ri_list) {
STATIC int
xlog_recover_commit_item(
	struct log		*log,
	struct xlog_recover	*trans,
	xlog_recover_item_t	*item,
	int			pass)
{
	trace_xfs_log_recover_item_recover(log, trans, item, pass);

	switch (ITEM_TYPE(item)) {
	case XFS_LI_BUF:
			error = xlog_recover_do_buffer_trans(log, item, pass);
			break;
		return xlog_recover_do_buffer_trans(log, item, pass);
	case XFS_LI_INODE:
			error = xlog_recover_do_inode_trans(log, item, pass);
			break;
		return xlog_recover_do_inode_trans(log, item, pass);
	case XFS_LI_EFI:
			error = xlog_recover_do_efi_trans(log, item,
							  trans->r_lsn, pass);
			break;
		return xlog_recover_do_efi_trans(log, item, trans->r_lsn, pass);
	case XFS_LI_EFD:
		xlog_recover_do_efd_trans(log, item, pass);
			error = 0;
			break;
		return 0;
	case XFS_LI_DQUOT:
			error = xlog_recover_do_dquot_trans(log, item, pass);
			break;
		return xlog_recover_do_dquot_trans(log, item, pass);
	case XFS_LI_QUOTAOFF:
			error = xlog_recover_do_quotaoff_trans(log, item,
							       pass);
			break;
		return xlog_recover_do_quotaoff_trans(log, item, pass);
	default:
		xlog_warn(
	"XFS: invalid item type (%d) xlog_recover_do_trans", ITEM_TYPE(item));
		ASSERT(0);
			error = XFS_ERROR(EIO);
			break;
		}

		if (error)
			return error;
		return XFS_ERROR(EIO);
	}

	return 0;
}

/*
 * Free up any resources allocated by the transaction
 * Perform the transaction.
 *
 * Remember that EFIs, EFDs, and IUNLINKs are handled later.
 * If the transaction modifies a buffer or inode, do it now.  Otherwise,
 * EFIs and EFDs get queued up by adding entries into the AIL for them.
 */
STATIC void
xlog_recover_free_trans(
	xlog_recover_t		*trans)
{
	xlog_recover_item_t	*item, *n;
	int			i;

	list_for_each_entry_safe(item, n, &trans->r_itemq, ri_list) {
		/* Free the regions in the item. */
		list_del(&item->ri_list);
		for (i = 0; i < item->ri_cnt; i++)
			kmem_free(item->ri_buf[i].i_addr);
		/* Free the item itself */
		kmem_free(item->ri_buf);
		kmem_free(item);
	}
	/* Free the transaction recover structure */
	kmem_free(trans);
}

STATIC int
xlog_recover_commit_trans(
	xlog_t			*log,
	xlog_recover_t		*trans,
	struct log		*log,
	struct xlog_recover	*trans,
	int			pass)
{
	int			error;
	int			error = 0;
	xlog_recover_item_t	*item;

	hlist_del(&trans->r_list);
	if ((error = xlog_recover_do_trans(log, trans, pass)))

	error = xlog_recover_reorder_trans(log, trans, pass);
	if (error)
		return error;
	xlog_recover_free_trans(trans);			/* no error */

	list_for_each_entry(item, &trans->r_itemq, ri_list) {
		error = xlog_recover_commit_item(log, trans, item, pass);
		if (error)
			return error;
	}

	xlog_recover_free_trans(trans);
	return 0;
}