From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 03/19] xfs: refactor log recovery item dispatch for pass2 readhead functions
Date: Tue, 21 Apr 2020 19:06:21 -0700 [thread overview]
Message-ID: <158752118180.2140829.13805128567366066982.stgit@magnolia> (raw)
In-Reply-To: <158752116283.2140829.12265815455525398097.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Move the pass2 readhead code into the per-item source code files and use
the dispatch function to call them.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/xfs/libxfs/xfs_log_recover.h | 19 ++++++
fs/xfs/xfs_buf_item.c | 18 +++++
fs/xfs/xfs_dquot_item.c | 39 ++++++++++++
fs/xfs/xfs_inode_item.c | 28 ++++++++
fs/xfs/xfs_log_recover.c | 129 +--------------------------------------
5 files changed, 108 insertions(+), 125 deletions(-)
diff --git a/fs/xfs/libxfs/xfs_log_recover.h b/fs/xfs/libxfs/xfs_log_recover.h
index 60a6afb93049..010fc22e5fdf 100644
--- a/fs/xfs/libxfs/xfs_log_recover.h
+++ b/fs/xfs/libxfs/xfs_log_recover.h
@@ -23,6 +23,8 @@ enum xlog_recover_reorder {
typedef enum xlog_recover_reorder (*xlog_recover_reorder_fn)(
struct xlog_recover_item *item);
+typedef void (*xlog_recover_ra_pass2_fn)(struct xlog *log,
+ struct xlog_recover_item *item);
struct xlog_recover_item_type {
/*
@@ -34,6 +36,9 @@ struct xlog_recover_item_type {
*/
enum xlog_recover_reorder reorder;
xlog_recover_reorder_fn reorder_fn;
+
+ /* Start readahead for pass2, if provided. */
+ xlog_recover_ra_pass2_fn ra_pass2_fn;
};
extern const struct xlog_recover_item_type xlog_icreate_item_type;
@@ -88,4 +93,18 @@ struct xlog_recover {
#define XLOG_RECOVER_PASS1 1
#define XLOG_RECOVER_PASS2 2
+/*
+ * This structure is used during recovery to record the buf log items which
+ * have been canceled and should not be replayed.
+ */
+struct xfs_buf_cancel {
+ xfs_daddr_t bc_blkno;
+ uint bc_len;
+ int bc_refcount;
+ struct list_head bc_list;
+};
+
+struct xfs_buf_cancel *xlog_peek_buffer_cancelled(struct xlog *log,
+ xfs_daddr_t blkno, uint len, unsigned short flags);
+
#endif /* __XFS_LOG_RECOVER_H__ */
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index bf7480e18889..1ad514cc501c 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -1302,6 +1302,24 @@ xlog_buf_reorder_fn(
return XLOG_REORDER_BUFFER_LIST;
}
+STATIC void
+xlog_recover_buffer_ra_pass2(
+ struct xlog *log,
+ struct xlog_recover_item *item)
+{
+ struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
+ struct xfs_mount *mp = log->l_mp;
+
+ if (xlog_peek_buffer_cancelled(log, buf_f->blf_blkno,
+ buf_f->blf_len, buf_f->blf_flags)) {
+ return;
+ }
+
+ xfs_buf_readahead(mp->m_ddev_targp, buf_f->blf_blkno,
+ buf_f->blf_len, NULL);
+}
+
const struct xlog_recover_item_type xlog_buf_item_type = {
.reorder_fn = xlog_buf_reorder_fn,
+ .ra_pass2_fn = xlog_recover_buffer_ra_pass2,
};
diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c
index 2558586b4d45..d4c794abf900 100644
--- a/fs/xfs/xfs_dquot_item.c
+++ b/fs/xfs/xfs_dquot_item.c
@@ -386,8 +386,47 @@ xfs_qm_qoff_logitem_init(
return qf;
}
+STATIC void
+xlog_recover_dquot_ra_pass2(
+ struct xlog *log,
+ struct xlog_recover_item *item)
+{
+ struct xfs_mount *mp = log->l_mp;
+ struct xfs_disk_dquot *recddq;
+ struct xfs_dq_logformat *dq_f;
+ uint type;
+ int len;
+
+
+ if (mp->m_qflags == 0)
+ return;
+
+ recddq = item->ri_buf[1].i_addr;
+ if (recddq == NULL)
+ return;
+ if (item->ri_buf[1].i_len < sizeof(struct xfs_disk_dquot))
+ return;
+
+ type = recddq->d_flags & (XFS_DQ_USER | XFS_DQ_PROJ | XFS_DQ_GROUP);
+ ASSERT(type);
+ if (log->l_quotaoffs_flag & type)
+ return;
+
+ dq_f = item->ri_buf[0].i_addr;
+ ASSERT(dq_f);
+ ASSERT(dq_f->qlf_len == 1);
+
+ len = XFS_FSB_TO_BB(mp, dq_f->qlf_len);
+ if (xlog_peek_buffer_cancelled(log, dq_f->qlf_blkno, len, 0))
+ return;
+
+ xfs_buf_readahead(mp->m_ddev_targp, dq_f->qlf_blkno, len,
+ &xfs_dquot_buf_ra_ops);
+}
+
const struct xlog_recover_item_type xlog_dquot_item_type = {
.reorder = XLOG_REORDER_INODE_LIST,
+ .ra_pass2_fn = xlog_recover_dquot_ra_pass2,
};
const struct xlog_recover_item_type xlog_quotaoff_item_type = {
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
index b04e9c5330b7..bb0fe064aa1b 100644
--- a/fs/xfs/xfs_inode_item.c
+++ b/fs/xfs/xfs_inode_item.c
@@ -846,6 +846,34 @@ xfs_inode_item_format_convert(
return 0;
}
+STATIC void
+xlog_recover_inode_ra_pass2(
+ struct xlog *log,
+ struct xlog_recover_item *item)
+{
+ struct xfs_inode_log_format ilf_buf;
+ struct xfs_inode_log_format *ilfp;
+ struct xfs_mount *mp = log->l_mp;
+ int error;
+
+ if (item->ri_buf[0].i_len == sizeof(struct xfs_inode_log_format)) {
+ ilfp = item->ri_buf[0].i_addr;
+ } else {
+ ilfp = &ilf_buf;
+ memset(ilfp, 0, sizeof(*ilfp));
+ error = xfs_inode_item_format_convert(&item->ri_buf[0], ilfp);
+ if (error)
+ return;
+ }
+
+ if (xlog_peek_buffer_cancelled(log, ilfp->ilf_blkno, ilfp->ilf_len, 0))
+ return;
+
+ xfs_buf_readahead(mp->m_ddev_targp, ilfp->ilf_blkno,
+ ilfp->ilf_len, &xfs_inode_buf_ra_ops);
+}
+
const struct xlog_recover_item_type xlog_inode_item_type = {
.reorder = XLOG_REORDER_INODE_LIST,
+ .ra_pass2_fn = xlog_recover_inode_ra_pass2,
};
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index e7a9f899f657..9ee8eb9b93a2 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -55,17 +55,6 @@ STATIC int
xlog_do_recovery_pass(
struct xlog *, xfs_daddr_t, xfs_daddr_t, int, xfs_daddr_t *);
-/*
- * This structure is used during recovery to record the buf log items which
- * have been canceled and should not be replayed.
- */
-struct xfs_buf_cancel {
- xfs_daddr_t bc_blkno;
- uint bc_len;
- int bc_refcount;
- struct list_head bc_list;
-};
-
/*
* Sector aligned buffer routines for buffer create/read/write/access
*/
@@ -2009,12 +1998,12 @@ xlog_recover_buffer_pass1(
* entry in the buffer cancel record table. If it is, return the cancel
* buffer structure to the caller.
*/
-STATIC struct xfs_buf_cancel *
+struct xfs_buf_cancel *
xlog_peek_buffer_cancelled(
struct xlog *log,
xfs_daddr_t blkno,
uint len,
- unsigned short flags)
+ unsigned short flags)
{
struct list_head *bucket;
struct xfs_buf_cancel *bcp;
@@ -3900,117 +3889,6 @@ xlog_recover_do_icreate_pass2(
length, be32_to_cpu(icl->icl_gen));
}
-STATIC void
-xlog_recover_buffer_ra_pass2(
- struct xlog *log,
- struct xlog_recover_item *item)
-{
- struct xfs_buf_log_format *buf_f = item->ri_buf[0].i_addr;
- struct xfs_mount *mp = log->l_mp;
-
- if (xlog_peek_buffer_cancelled(log, buf_f->blf_blkno,
- buf_f->blf_len, buf_f->blf_flags)) {
- return;
- }
-
- xfs_buf_readahead(mp->m_ddev_targp, buf_f->blf_blkno,
- buf_f->blf_len, NULL);
-}
-
-STATIC void
-xlog_recover_inode_ra_pass2(
- struct xlog *log,
- struct xlog_recover_item *item)
-{
- struct xfs_inode_log_format ilf_buf;
- struct xfs_inode_log_format *ilfp;
- struct xfs_mount *mp = log->l_mp;
- int error;
-
- if (item->ri_buf[0].i_len == sizeof(struct xfs_inode_log_format)) {
- ilfp = item->ri_buf[0].i_addr;
- } else {
- ilfp = &ilf_buf;
- memset(ilfp, 0, sizeof(*ilfp));
- error = xfs_inode_item_format_convert(&item->ri_buf[0], ilfp);
- if (error)
- return;
- }
-
- if (xlog_peek_buffer_cancelled(log, ilfp->ilf_blkno, ilfp->ilf_len, 0))
- return;
-
- xfs_buf_readahead(mp->m_ddev_targp, ilfp->ilf_blkno,
- ilfp->ilf_len, &xfs_inode_buf_ra_ops);
-}
-
-STATIC void
-xlog_recover_dquot_ra_pass2(
- struct xlog *log,
- struct xlog_recover_item *item)
-{
- struct xfs_mount *mp = log->l_mp;
- struct xfs_disk_dquot *recddq;
- struct xfs_dq_logformat *dq_f;
- uint type;
- int len;
-
-
- if (mp->m_qflags == 0)
- return;
-
- recddq = item->ri_buf[1].i_addr;
- if (recddq == NULL)
- return;
- if (item->ri_buf[1].i_len < sizeof(struct xfs_disk_dquot))
- return;
-
- type = recddq->d_flags & (XFS_DQ_USER | XFS_DQ_PROJ | XFS_DQ_GROUP);
- ASSERT(type);
- if (log->l_quotaoffs_flag & type)
- return;
-
- dq_f = item->ri_buf[0].i_addr;
- ASSERT(dq_f);
- ASSERT(dq_f->qlf_len == 1);
-
- len = XFS_FSB_TO_BB(mp, dq_f->qlf_len);
- if (xlog_peek_buffer_cancelled(log, dq_f->qlf_blkno, len, 0))
- return;
-
- xfs_buf_readahead(mp->m_ddev_targp, dq_f->qlf_blkno, len,
- &xfs_dquot_buf_ra_ops);
-}
-
-STATIC void
-xlog_recover_ra_pass2(
- struct xlog *log,
- struct xlog_recover_item *item)
-{
- switch (ITEM_TYPE(item)) {
- case XFS_LI_BUF:
- xlog_recover_buffer_ra_pass2(log, item);
- break;
- case XFS_LI_INODE:
- xlog_recover_inode_ra_pass2(log, item);
- break;
- case XFS_LI_DQUOT:
- xlog_recover_dquot_ra_pass2(log, item);
- break;
- case XFS_LI_EFI:
- case XFS_LI_EFD:
- case XFS_LI_QUOTAOFF:
- case XFS_LI_RUI:
- case XFS_LI_RUD:
- case XFS_LI_CUI:
- case XFS_LI_CUD:
- case XFS_LI_BUI:
- case XFS_LI_BUD:
- default:
- break;
- }
-}
-
STATIC int
xlog_recover_commit_pass1(
struct xlog *log,
@@ -4147,7 +4025,8 @@ xlog_recover_commit_trans(
error = xlog_recover_commit_pass1(log, trans, item);
break;
case XLOG_RECOVER_PASS2:
- xlog_recover_ra_pass2(log, item);
+ if (item->ri_type && item->ri_type->ra_pass2_fn)
+ item->ri_type->ra_pass2_fn(log, item);
list_move_tail(&item->ri_list, &ra_list);
items_queued++;
if (items_queued >= XLOG_RECOVER_COMMIT_QUEUE_MAX) {
next prev parent reply other threads:[~2020-04-22 2:08 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 ` [PATCH 02/19] xfs: refactor log recovery item sorting into a generic dispatch structure Darrick J. Wong
2020-04-25 18:13 ` 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 ` Darrick J. Wong [this message]
2020-04-25 18:19 ` [PATCH 03/19] xfs: refactor log recovery item dispatch for pass2 readhead functions 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=158752118180.2140829.13805128567366066982.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).