xfs
[Top] [All Lists]

[PATCH 077/102] xfs: prevent needless mount warning causing test failure

To: xfs@xxxxxxxxxxx
Subject: [PATCH 077/102] xfs: prevent needless mount warning causing test failures
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Thu, 23 Aug 2012 15:02:35 +1000
In-reply-to: <1345698180-13612-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1345698180-13612-1-git-send-email-david@xxxxxxxxxxxxx>
From: Dave Chinner <dchinner@xxxxxxxxxx>

Upstream commit: 81158e0cecdf53b1f6d88a514c6c20e0ee18ec7b

Often mounting small filesystem with small logs will emit a warning
such as:

XFS (vdb): Invalid block length (0x2000) for buffer

during log recovery. This causes tests to randomly fail because this
output causes the clean filesystem checks on test completion to
think the filesystem is inconsistent.

The cause of the error is simply that log recovery is asking for a
buffer size that is larger than the log when zeroing the tail. This
is because the buffer size is rounded up, and if the right head and
tail conditions exist then the buffer size can be larger than the log.
Limit the variable size xlog_get_bp() callers to requesting buffers
smaller than the log.

Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
Signed-off-by: Ben Myers <bpm@xxxxxxx>
---
 fs/xfs/xfs_log_recover.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 687bc9f..82f7d18 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -439,6 +439,8 @@ xlog_find_verify_cycle(
         * a log sector, or we're out of luck.
         */
        bufblks = 1 << ffs(nbblks);
+       while (bufblks > log->l_logBBsize)
+               bufblks >>= 1;
        while (!(bp = xlog_get_bp(log, bufblks))) {
                bufblks >>= 1;
                if (bufblks < log->l_sectBBsize)
@@ -1224,6 +1226,8 @@ xlog_write_log_records(
         * log sector, or we're out of luck.
         */
        bufblks = 1 << ffs(blocks);
+       while (bufblks > log->l_logBBsize)
+               bufblks >>= 1;
        while (!(bp = xlog_get_bp(log, bufblks))) {
                bufblks >>= 1;
                if (bufblks < sectbb)
-- 
1.7.10

<Prev in Thread] Current Thread [Next in Thread>