dect
/
linux-2.6
Archived
13
0
Fork 0

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: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
This commit is contained in:
Christoph Hellwig 2010-12-01 22:06:23 +00:00 committed by Alex Elder
parent d5689eaa0a
commit d045094864
1 changed files with 54 additions and 65 deletions

View File

@ -2673,64 +2673,6 @@ xlog_recover_do_efd_trans(
spin_unlock(&ailp->xa_lock);
}
/*
* Perform 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.
*/
STATIC int
xlog_recover_do_trans(
xlog_t *log,
xlog_recover_t *trans,
int pass)
{
int error = 0;
xlog_recover_item_t *item;
error = xlog_recover_reorder_trans(log, trans, pass);
if (error)
return error;
list_for_each_entry(item, &trans->r_itemq, ri_list) {
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;
case XFS_LI_INODE:
error = xlog_recover_do_inode_trans(log, item, pass);
break;
case XFS_LI_EFI:
error = xlog_recover_do_efi_trans(log, item,
trans->r_lsn, pass);
break;
case XFS_LI_EFD:
xlog_recover_do_efd_trans(log, item, pass);
error = 0;
break;
case XFS_LI_DQUOT:
error = xlog_recover_do_dquot_trans(log, item, pass);
break;
case XFS_LI_QUOTAOFF:
error = xlog_recover_do_quotaoff_trans(log, item,
pass);
break;
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 0;
}
/*
* Free up any resources allocated by the transaction
*
@ -2738,7 +2680,7 @@ xlog_recover_do_trans(
*/
STATIC void
xlog_recover_free_trans(
xlog_recover_t *trans)
struct xlog_recover *trans)
{
xlog_recover_item_t *item, *n;
int i;
@ -2757,17 +2699,64 @@ xlog_recover_free_trans(
}
STATIC int
xlog_recover_commit_trans(
xlog_t *log,
xlog_recover_t *trans,
xlog_recover_commit_item(
struct log *log,
struct xlog_recover *trans,
xlog_recover_item_t *item,
int pass)
{
int error;
trace_xfs_log_recover_item_recover(log, trans, item, pass);
switch (ITEM_TYPE(item)) {
case XFS_LI_BUF:
return xlog_recover_do_buffer_trans(log, item, pass);
case XFS_LI_INODE:
return xlog_recover_do_inode_trans(log, item, pass);
case XFS_LI_EFI:
return xlog_recover_do_efi_trans(log, item, trans->r_lsn, pass);
case XFS_LI_EFD:
xlog_recover_do_efd_trans(log, item, pass);
return 0;
case XFS_LI_DQUOT:
return xlog_recover_do_dquot_trans(log, item, pass);
case XFS_LI_QUOTAOFF:
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);
return XFS_ERROR(EIO);
}
}
/*
* Perform 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.
*/
STATIC int
xlog_recover_commit_trans(
struct log *log,
struct xlog_recover *trans,
int pass)
{
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;
}