From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 02/19] xfs: refactor log recovery item sorting into a generic dispatch structure
Date: Tue, 21 Apr 2020 19:06:15 -0700 [thread overview]
Message-ID: <158752117554.2140829.4901314701479350791.stgit@magnolia> (raw)
In-Reply-To: <158752116283.2140829.12265815455525398097.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Create a generic dispatch structure to delegate recovery of different
log item types into various code modules. This will enable us to move
code specific to a particular log item type out of xfs_log_recover.c and
into the log item source.
The first operation we virtualize is the log item sorting.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/xfs/libxfs/xfs_log_recover.h | 39 +++++++++++++++++
fs/xfs/xfs_buf_item.c | 20 ++++++++-
fs/xfs/xfs_dquot_item.c | 10 ++++
fs/xfs/xfs_icreate_item.c | 6 +++
fs/xfs/xfs_inode_item.c | 6 +++
fs/xfs/xfs_log_recover.c | 88 +++++++++++++++++++++++++++------------
6 files changed, 139 insertions(+), 30 deletions(-)
diff --git a/fs/xfs/libxfs/xfs_log_recover.h b/fs/xfs/libxfs/xfs_log_recover.h
index 3bf671637a91..60a6afb93049 100644
--- a/fs/xfs/libxfs/xfs_log_recover.h
+++ b/fs/xfs/libxfs/xfs_log_recover.h
@@ -6,6 +6,43 @@
#ifndef __XFS_LOG_RECOVER_H__
#define __XFS_LOG_RECOVER_H__
+/*
+ * Each log item type (XFS_LI_*) gets its own xlog_recover_item_type to
+ * define how recovery should work for that type of log item.
+ */
+struct xlog_recover_item;
+
+/* Sorting hat for log items as they're read in. */
+enum xlog_recover_reorder {
+ XLOG_REORDER_UNKNOWN,
+ XLOG_REORDER_BUFFER_LIST,
+ XLOG_REORDER_CANCEL_LIST,
+ XLOG_REORDER_INODE_BUFFER_LIST,
+ XLOG_REORDER_INODE_LIST,
+};
+
+typedef enum xlog_recover_reorder (*xlog_recover_reorder_fn)(
+ struct xlog_recover_item *item);
+
+struct xlog_recover_item_type {
+ /*
+ * These two items decide how to sort recovered log items during
+ * recovery. If reorder_fn is non-NULL it will be called; otherwise,
+ * reorder will be used to decide. See the comment above
+ * xlog_recover_reorder_trans for more details about what the values
+ * mean.
+ */
+ enum xlog_recover_reorder reorder;
+ xlog_recover_reorder_fn reorder_fn;
+};
+
+extern const struct xlog_recover_item_type xlog_icreate_item_type;
+extern const struct xlog_recover_item_type xlog_buf_item_type;
+extern const struct xlog_recover_item_type xlog_inode_item_type;
+extern const struct xlog_recover_item_type xlog_dquot_item_type;
+extern const struct xlog_recover_item_type xlog_quotaoff_item_type;
+extern const struct xlog_recover_item_type xlog_intent_item_type;
+
/*
* Macros, structures, prototypes for internal log manager use.
*/
@@ -24,10 +61,10 @@
*/
typedef struct xlog_recover_item {
struct list_head ri_list;
- int ri_type;
int ri_cnt; /* count of regions found */
int ri_total; /* total regions */
xfs_log_iovec_t *ri_buf; /* ptr to regions buffer */
+ const struct xlog_recover_item_type *ri_type;
} xlog_recover_item_t;
struct xlog_recover {
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 1545657c3ca0..bf7480e18889 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -16,7 +16,8 @@
#include "xfs_trans_priv.h"
#include "xfs_trace.h"
#include "xfs_log.h"
-
+#include "xfs_log_priv.h"
+#include "xfs_log_recover.h"
kmem_zone_t *xfs_buf_item_zone;
@@ -1287,3 +1288,20 @@ xfs_buf_resubmit_failed_buffers(
return ret;
}
+
+STATIC enum xlog_recover_reorder
+xlog_buf_reorder_fn(
+ struct xlog_recover_item *item)
+{
+ struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
+
+ if (buf_f->blf_flags & XFS_BLF_CANCEL)
+ return XLOG_REORDER_CANCEL_LIST;
+ if (buf_f->blf_flags & XFS_BLF_INODE_BUF)
+ return XLOG_REORDER_INODE_BUFFER_LIST;
+ return XLOG_REORDER_BUFFER_LIST;
+}
+
+const struct xlog_recover_item_type xlog_buf_item_type = {
+ .reorder_fn = xlog_buf_reorder_fn,
+};
diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c
index baad1748d0d1..2558586b4d45 100644
--- a/fs/xfs/xfs_dquot_item.c
+++ b/fs/xfs/xfs_dquot_item.c
@@ -17,6 +17,8 @@
#include "xfs_trans_priv.h"
#include "xfs_qm.h"
#include "xfs_log.h"
+#include "xfs_log_priv.h"
+#include "xfs_log_recover.h"
static inline struct xfs_dq_logitem *DQUOT_ITEM(struct xfs_log_item *lip)
{
@@ -383,3 +385,11 @@ xfs_qm_qoff_logitem_init(
qf->qql_flags = flags;
return qf;
}
+
+const struct xlog_recover_item_type xlog_dquot_item_type = {
+ .reorder = XLOG_REORDER_INODE_LIST,
+};
+
+const struct xlog_recover_item_type xlog_quotaoff_item_type = {
+ .reorder = XLOG_REORDER_INODE_LIST,
+};
diff --git a/fs/xfs/xfs_icreate_item.c b/fs/xfs/xfs_icreate_item.c
index 490fee22b878..0a1ed4dc1c3d 100644
--- a/fs/xfs/xfs_icreate_item.c
+++ b/fs/xfs/xfs_icreate_item.c
@@ -11,6 +11,8 @@
#include "xfs_trans_priv.h"
#include "xfs_icreate_item.h"
#include "xfs_log.h"
+#include "xfs_log_priv.h"
+#include "xfs_log_recover.h"
kmem_zone_t *xfs_icreate_zone; /* inode create item zone */
@@ -107,3 +109,7 @@ xfs_icreate_log(
tp->t_flags |= XFS_TRANS_DIRTY;
set_bit(XFS_LI_DIRTY, &icp->ic_item.li_flags);
}
+
+const struct xlog_recover_item_type xlog_icreate_item_type = {
+ .reorder = XLOG_REORDER_BUFFER_LIST,
+};
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
index f779cca2346f..b04e9c5330b7 100644
--- a/fs/xfs/xfs_inode_item.c
+++ b/fs/xfs/xfs_inode_item.c
@@ -18,6 +18,8 @@
#include "xfs_buf_item.h"
#include "xfs_log.h"
#include "xfs_error.h"
+#include "xfs_log_priv.h"
+#include "xfs_log_recover.h"
#include <linux/iversion.h>
@@ -843,3 +845,7 @@ xfs_inode_item_format_convert(
in_f->ilf_boffset = in_f32->ilf_boffset;
return 0;
}
+
+const struct xlog_recover_item_type xlog_inode_item_type = {
+ .reorder = XLOG_REORDER_INODE_LIST,
+};
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 5f803083ddc3..e7a9f899f657 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -1779,6 +1779,12 @@ xlog_clear_stale_blocks(
return 0;
}
+/* Log intent item dispatching. */
+
+const struct xlog_recover_item_type xlog_intent_item_type = {
+ .reorder = XLOG_REORDER_INODE_LIST,
+};
+
/******************************************************************************
*
* Log recover routines
@@ -1786,6 +1792,39 @@ xlog_clear_stale_blocks(
******************************************************************************
*/
+static const struct xlog_recover_item_type *
+xlog_item_for_type(
+ unsigned short type)
+{
+ switch (type) {
+ case XFS_LI_ICREATE:
+ return &xlog_icreate_item_type;
+ case XFS_LI_BUF:
+ return &xlog_buf_item_type;
+ case XFS_LI_EFD:
+ case XFS_LI_EFI:
+ case XFS_LI_RUI:
+ case XFS_LI_RUD:
+ case XFS_LI_CUI:
+ case XFS_LI_CUD:
+ case XFS_LI_BUI:
+ case XFS_LI_BUD:
+ return &xlog_intent_item_type;
+ case XFS_LI_INODE:
+ return &xlog_inode_item_type;
+ case XFS_LI_DQUOT:
+ return &xlog_dquot_item_type;
+ case XFS_LI_QUOTAOFF:
+ return &xlog_quotaoff_item_type;
+ case XFS_LI_IUNLINK:
+ /* Not implemented? */
+ return NULL;
+ default:
+ /* Unknown type, go away. */
+ return NULL;
+ }
+}
+
/*
* Sort the log items in the transaction.
*
@@ -1851,41 +1890,34 @@ xlog_recover_reorder_trans(
list_splice_init(&trans->r_itemq, &sort_list);
list_for_each_entry_safe(item, n, &sort_list, ri_list) {
- xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr;
+ enum xlog_recover_reorder fate = XLOG_REORDER_UNKNOWN;
+
+ item->ri_type = xlog_item_for_type(ITEM_TYPE(item));
+ if (item->ri_type) {
+ if (item->ri_type->reorder_fn)
+ fate = item->ri_type->reorder_fn(item);
+ else
+ fate = item->ri_type->reorder;
+ }
- switch (ITEM_TYPE(item)) {
- case XFS_LI_ICREATE:
+ switch (fate) {
+ case XLOG_REORDER_BUFFER_LIST:
list_move_tail(&item->ri_list, &buffer_list);
break;
- case XFS_LI_BUF:
- if (buf_f->blf_flags & XFS_BLF_CANCEL) {
- trace_xfs_log_recover_item_reorder_head(log,
- trans, item, pass);
- list_move(&item->ri_list, &cancel_list);
- break;
- }
- if (buf_f->blf_flags & XFS_BLF_INODE_BUF) {
- list_move(&item->ri_list, &inode_buffer_list);
- break;
- }
- list_move_tail(&item->ri_list, &buffer_list);
+ case XLOG_REORDER_CANCEL_LIST:
+ trace_xfs_log_recover_item_reorder_head(log,
+ trans, item, pass);
+ list_move(&item->ri_list, &cancel_list);
break;
- case XFS_LI_INODE:
- case XFS_LI_DQUOT:
- case XFS_LI_QUOTAOFF:
- case XFS_LI_EFD:
- case XFS_LI_EFI:
- case XFS_LI_RUI:
- case XFS_LI_RUD:
- case XFS_LI_CUI:
- case XFS_LI_CUD:
- case XFS_LI_BUI:
- case XFS_LI_BUD:
+ case XLOG_REORDER_INODE_BUFFER_LIST:
+ list_move(&item->ri_list, &inode_buffer_list);
+ break;
+ case XLOG_REORDER_INODE_LIST:
trace_xfs_log_recover_item_reorder_tail(log,
- trans, item, pass);
+ trans, item, pass);
list_move_tail(&item->ri_list, &inode_list);
break;
- default:
+ case XLOG_REORDER_UNKNOWN:
xfs_warn(log->l_mp,
"%s: unrecognized type of log operation (%d)",
__func__, ITEM_TYPE(item));
next prev parent reply other threads:[~2020-04-22 2:06 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-22 2:06 [PATCH 00/19] xfs: refactor log recovery Darrick J. Wong
2020-04-22 2:06 ` [PATCH 01/19] xfs: complain when we don't recognize the log item type Darrick J. Wong
2020-04-22 16:17 ` Brian Foster
2020-04-25 17:42 ` Christoph Hellwig
2020-04-27 17:55 ` Darrick J. Wong
2020-04-22 2:06 ` Darrick J. Wong [this message]
2020-04-25 18:13 ` [PATCH 02/19] xfs: refactor log recovery item sorting into a generic dispatch structure Christoph Hellwig
2020-04-27 22:04 ` Darrick J. Wong
2020-04-28 5:11 ` Christoph Hellwig
2020-04-28 20:46 ` Darrick J. Wong
2020-04-22 2:06 ` [PATCH 03/19] xfs: refactor log recovery item dispatch for pass2 readhead functions Darrick J. Wong
2020-04-25 18:19 ` Christoph Hellwig
2020-04-28 20:54 ` Darrick J. Wong
2020-04-29 6:07 ` Christoph Hellwig
2020-04-22 2:06 ` [PATCH 04/19] xfs: refactor log recovery item dispatch for pass1 commit functions Darrick J. Wong
2020-04-25 18:20 ` Christoph Hellwig
2020-04-22 2:06 ` [PATCH 05/19] xfs: refactor log recovery buffer item dispatch for pass2 " Darrick J. Wong
2020-04-22 2:06 ` [PATCH 06/19] xfs: refactor log recovery inode " Darrick J. Wong
2020-04-22 2:06 ` [PATCH 07/19] xfs: refactor log recovery intent " Darrick J. Wong
2020-04-25 18:24 ` Christoph Hellwig
2020-04-28 22:42 ` Darrick J. Wong
2020-04-22 2:06 ` [PATCH 08/19] xfs: refactor log recovery dquot " Darrick J. Wong
2020-04-22 2:07 ` [PATCH 09/19] xfs: refactor log recovery icreate " Darrick J. Wong
2020-04-22 2:07 ` [PATCH 10/19] xfs: refactor log recovery quotaoff " Darrick J. Wong
2020-04-22 2:07 ` [PATCH 11/19] xfs: refactor EFI log item recovery dispatch Darrick J. Wong
2020-04-25 18:28 ` Christoph Hellwig
2020-04-28 22:41 ` Darrick J. Wong
2020-04-28 23:45 ` Darrick J. Wong
2020-04-29 7:09 ` Christoph Hellwig
2020-04-29 7:18 ` Christoph Hellwig
2020-04-29 14:20 ` Darrick J. Wong
2020-04-22 2:07 ` [PATCH 12/19] xfs: refactor RUI " Darrick J. Wong
2020-04-25 18:28 ` Christoph Hellwig
2020-04-28 22:40 ` Darrick J. Wong
2020-04-22 2:07 ` [PATCH 13/19] xfs: refactor CUI " Darrick J. Wong
2020-04-22 2:07 ` [PATCH 14/19] xfs: refactor BUI " Darrick J. Wong
2020-04-22 2:07 ` [PATCH 15/19] xfs: refactor releasing finished intents during log recovery Darrick J. Wong
2020-04-25 18:34 ` Christoph Hellwig
2020-04-28 22:40 ` Darrick J. Wong
2020-04-22 2:07 ` [PATCH 16/19] xfs: refactor adding recovered intent items to the log Darrick J. Wong
2020-04-25 18:34 ` Christoph Hellwig
2020-04-22 2:07 ` [PATCH 17/19] xfs: hoist the ail unlock/lock cycle when cancelling intents during recovery Darrick J. Wong
2020-04-25 18:35 ` Christoph Hellwig
2020-04-22 2:07 ` [PATCH 18/19] xfs: remove xlog_item_is_intent Darrick J. Wong
2020-04-22 2:08 ` [PATCH 19/19] xfs: move xlog_recover_intent_pass2 up in the file Darrick J. Wong
2020-04-25 18:36 ` Christoph Hellwig
2020-04-28 22:38 ` Darrick J. Wong
2020-04-22 16:18 ` [PATCH 00/19] xfs: refactor log recovery Brian Foster
2020-04-28 6:12 ` Christoph Hellwig
2020-04-28 12:43 ` Brian Foster
2020-04-28 22:34 ` Darrick J. Wong
2020-04-29 6:09 ` Christoph Hellwig
2020-04-29 11:52 ` Brian Foster
2020-04-29 14:22 ` Darrick J. Wong
2020-04-28 6:22 ` Christoph Hellwig
2020-04-28 22:28 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=158752117554.2140829.4901314701479350791.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).