From: Dave Chinner <david@fromorbit.com>
To: xfs@oss.sgi.com
Subject: [PATCH 15/19] xfs: factor out dir2 data block reading
Date: Tue, 9 Oct 2012 14:51:06 +1100 [thread overview]
Message-ID: <1349754670-32009-16-git-send-email-david@fromorbit.com> (raw)
In-Reply-To: <1349754670-32009-1-git-send-email-david@fromorbit.com>
From: Dave Chinner <dchinner@redhat.com>
And add a verifier callback function while there.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
fs/xfs/xfs_dir2_block.c | 3 +--
fs/xfs/xfs_dir2_data.c | 32 ++++++++++++++++++++++++++++++++
fs/xfs/xfs_dir2_leaf.c | 38 +++++++++++++++++---------------------
fs/xfs/xfs_dir2_node.c | 8 ++++----
fs/xfs/xfs_dir2_priv.h | 2 ++
5 files changed, 56 insertions(+), 27 deletions(-)
diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c
index 599fefe..54bf4ca 100644
--- a/fs/xfs/xfs_dir2_block.c
+++ b/fs/xfs/xfs_dir2_block.c
@@ -970,8 +970,7 @@ xfs_dir2_leaf_to_block(
* Read the data block if we don't already have it, give up if it fails.
*/
if (!dbp) {
- error = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, &dbp,
- XFS_DATA_FORK, NULL);
+ error = xfs_dir2_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp);
if (error)
return error;
}
diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c
index c45107d..ba46e32 100644
--- a/fs/xfs/xfs_dir2_data.c
+++ b/fs/xfs/xfs_dir2_data.c
@@ -185,6 +185,38 @@ __xfs_dir2_data_check(
return 0;
}
+static void
+xfs_dir2_data_verify(
+ struct xfs_buf *bp)
+{
+ struct xfs_mount *mp = bp->b_target->bt_mount;
+ struct xfs_dir2_data_hdr *hdr = bp->b_addr;
+ int block_ok = 0;
+
+ block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC);
+ block_ok |= __xfs_dir2_data_check(NULL, bp);
+
+ if (!block_ok) {
+ XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr);
+ xfs_buf_ioerror(bp, EFSCORRUPTED);
+ }
+
+ bp->b_iodone = NULL;
+ xfs_buf_ioend(bp, 0);
+}
+
+int
+xfs_dir2_data_read(
+ struct xfs_trans *tp,
+ struct xfs_inode *dp,
+ xfs_dablk_t bno,
+ xfs_daddr_t mapped_bno,
+ struct xfs_buf **bpp)
+{
+ return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp,
+ XFS_DATA_FORK, xfs_dir2_data_verify);
+}
+
/*
* Given a data block and an unused entry from that block,
* return the bestfree entry if any that corresponds to it.
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c
index 6c1359d..0fdf765 100644
--- a/fs/xfs/xfs_dir2_leaf.c
+++ b/fs/xfs/xfs_dir2_leaf.c
@@ -493,14 +493,14 @@ xfs_dir2_leaf_addname(
hdr = dbp->b_addr;
bestsp[use_block] = hdr->bestfree[0].length;
grown = 1;
- }
- /*
- * Already had space in some data block.
- * Just read that one in.
- */
- else {
- error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, use_block),
- -1, &dbp, XFS_DATA_FORK, NULL);
+ } else {
+ /*
+ * Already had space in some data block.
+ * Just read that one in.
+ */
+ error = xfs_dir2_data_read(tp, dp,
+ xfs_dir2_db_to_da(mp, use_block),
+ -1, &dbp);
if (error) {
xfs_trans_brelse(tp, lbp);
return error;
@@ -508,7 +508,6 @@ xfs_dir2_leaf_addname(
hdr = dbp->b_addr;
grown = 0;
}
- xfs_dir2_data_check(dp, dbp);
/*
* Point to the biggest freespace in our data block.
*/
@@ -891,10 +890,9 @@ xfs_dir2_leaf_readbuf(
* Read the directory block starting at the first mapping.
*/
mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff);
- error = xfs_da_read_buf(NULL, dp, map->br_startoff,
+ error = xfs_dir2_data_read(NULL, dp, map->br_startoff,
map->br_blockcount >= mp->m_dirblkfsbs ?
- XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1,
- &bp, XFS_DATA_FORK, NULL);
+ XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp);
/*
* Should just skip over the data block instead of giving up.
@@ -1408,14 +1406,13 @@ xfs_dir2_leaf_lookup_int(
if (newdb != curdb) {
if (dbp)
xfs_trans_brelse(tp, dbp);
- error = xfs_da_read_buf(tp, dp,
- xfs_dir2_db_to_da(mp, newdb),
- -1, &dbp, XFS_DATA_FORK, NULL);
+ error = xfs_dir2_data_read(tp, dp,
+ xfs_dir2_db_to_da(mp, newdb),
+ -1, &dbp);
if (error) {
xfs_trans_brelse(tp, lbp);
return error;
}
- xfs_dir2_data_check(dp, dbp);
curdb = newdb;
}
/*
@@ -1450,9 +1447,9 @@ xfs_dir2_leaf_lookup_int(
ASSERT(cidb != -1);
if (cidb != curdb) {
xfs_trans_brelse(tp, dbp);
- error = xfs_da_read_buf(tp, dp,
- xfs_dir2_db_to_da(mp, cidb),
- -1, &dbp, XFS_DATA_FORK, NULL);
+ error = xfs_dir2_data_read(tp, dp,
+ xfs_dir2_db_to_da(mp, cidb),
+ -1, &dbp);
if (error) {
xfs_trans_brelse(tp, lbp);
return error;
@@ -1737,8 +1734,7 @@ xfs_dir2_leaf_trim_data(
/*
* Read the offending data block. We need its buffer.
*/
- error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp,
- XFS_DATA_FORK, NULL);
+ error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp);
if (error)
return error;
diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c
index e9b0bce..e585c71 100644
--- a/fs/xfs/xfs_dir2_node.c
+++ b/fs/xfs/xfs_dir2_node.c
@@ -583,9 +583,9 @@ xfs_dir2_leafn_lookup_for_entry(
ASSERT(state->extravalid);
curbp = state->extrablk.bp;
} else {
- error = xfs_da_read_buf(tp, dp,
+ error = xfs_dir2_data_read(tp, dp,
xfs_dir2_db_to_da(mp, newdb),
- -1, &curbp, XFS_DATA_FORK, NULL);
+ -1, &curbp);
if (error)
return error;
}
@@ -1692,8 +1692,8 @@ xfs_dir2_node_addname_int(
/*
* Read the data block in.
*/
- error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno),
- -1, &dbp, XFS_DATA_FORK, NULL);
+ error = xfs_dir2_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno),
+ -1, &dbp);
if (error)
return error;
hdr = dbp->b_addr;
diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h
index 35f87d4..9c238e8 100644
--- a/fs/xfs/xfs_dir2_priv.h
+++ b/fs/xfs/xfs_dir2_priv.h
@@ -46,6 +46,8 @@ extern int xfs_dir2_leaf_to_block(struct xfs_da_args *args,
#define xfs_dir2_data_check(dp,bp)
#endif
extern bool __xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_buf *bp);
+extern int xfs_dir2_data_read(struct xfs_trans *tp, struct xfs_inode *dp,
+ xfs_dablk_t bno, xfs_daddr_t mapped_bno, struct xfs_buf **bpp);
extern struct xfs_dir2_data_free *
xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr,
--
1.7.10
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2012-10-09 3:50 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-09 3:50 [PATCH 00/19] xfs: buffer read verifier infrastructure Dave Chinner
2012-10-09 3:50 ` [PATCH 01/19] xfs: growfs: don't read garbage for new secondary superblocks Dave Chinner
2012-10-11 21:34 ` Christoph Hellwig
2012-10-09 3:50 ` [PATCH 02/19] xfs: make buffer read verication an IO completion function Dave Chinner
2012-10-11 21:36 ` Christoph Hellwig
2012-10-09 3:50 ` [PATCH 03/19] xfs: uncached buffer reads need to return an error Dave Chinner
2012-10-11 21:38 ` Christoph Hellwig
2012-10-11 22:11 ` Dave Chinner
2012-10-12 2:28 ` Dave Chinner
2012-10-09 3:50 ` [PATCH 04/19] xfs: verify superblocks as they are read from disk Dave Chinner
2012-10-11 21:41 ` Christoph Hellwig
2012-10-11 22:28 ` Dave Chinner
2012-10-09 3:50 ` [PATCH 05/19] xfs: verify AGF blocks " Dave Chinner
2012-10-11 21:42 ` Christoph Hellwig
2012-10-09 3:50 ` [PATCH 06/19] xfs: verify AGI " Dave Chinner
2012-10-11 21:43 ` Christoph Hellwig
2012-10-09 3:50 ` [PATCH 07/19] xfs: verify AGFL " Dave Chinner
2012-10-11 21:44 ` Christoph Hellwig
2012-10-11 21:52 ` Dave Chinner
2012-10-09 3:50 ` [PATCH 08/19] xfs: verify inode buffers " Dave Chinner
2012-10-11 21:45 ` Christoph Hellwig
2012-10-11 21:55 ` Dave Chinner
2012-10-09 3:51 ` [PATCH 09/19] xfs: verify btree blocks " Dave Chinner
2012-10-09 3:51 ` [PATCH 10/19] xfs: verify dquot " Dave Chinner
2012-10-11 21:48 ` Christoph Hellwig
2012-10-11 22:08 ` Dave Chinner
2012-10-09 3:51 ` [PATCH 11/19] xfs: add verifier callback to directorry read code Dave Chinner
2012-10-11 21:48 ` Christoph Hellwig
2012-10-09 3:51 ` [PATCH 12/19] xfs: factor dir2 block read operations Dave Chinner
2012-10-09 3:51 ` [PATCH 13/19] xfs: verify dir2 block format buffers Dave Chinner
2012-10-09 3:51 ` [PATCH 14/19] xfs: factor dir2 free block reading Dave Chinner
2012-10-09 3:51 ` Dave Chinner [this message]
2012-10-09 3:51 ` [PATCH 16/19] xfs: factor dir2 leaf read Dave Chinner
2012-10-09 3:51 ` [PATCH 17/19] xfs: factor and verify attr leaf reads Dave Chinner
2012-10-09 3:51 ` [PATCH 18/19] xfs: add xfs_da_node verification Dave Chinner
2012-10-09 3:51 ` [PATCH 19/19] xfs: Add verifiers to dir2 data readahead Dave Chinner
2012-10-11 12:09 ` [PATCH 00/19] xfs: buffer read verifier infrastructure Mark Tinguely
2012-10-11 21:42 ` Dave Chinner
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=1349754670-32009-16-git-send-email-david@fromorbit.com \
--to=david@fromorbit.com \
--cc=xfs@oss.sgi.com \
/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