summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
authorChristoph Hellwig2010-12-01 23:06:23 +0100
committerAlex Elder2010-12-16 23:05:26 +0100
commitd0450948641b2090b5d467ba638bbebd40b20b21 (patch)
treec91ea11d5c6e95901ba5c87e02abf44c8fd2a225 /fs/xfs/xfs_log_recover.c
parentxfs: use struct list_head for the buf cancel table (diff)
downloadkernel-qcow2-linux-d0450948641b2090b5d467ba638bbebd40b20b21.tar.gz
kernel-qcow2-linux-d0450948641b2090b5d467ba638bbebd40b20b21.tar.xz
kernel-qcow2-linux-d0450948641b2090b5d467ba638bbebd40b20b21.zip
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>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c117
1 files changed, 53 insertions, 64 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 960afd41315e..26e18052a648 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -2674,71 +2674,13 @@ xlog_recover_do_efd_trans(
}
/*
- * 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
*
* Remember that EFIs, EFDs, and IUNLINKs are handled later.
*/
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_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:
+ 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(
- 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;
}