xfs: RT bitmap and summary buffers are not typed
authorDave Chinner <dchinner@redhat.com>
Tue, 9 Feb 2016 05:41:31 +0000 (16:41 +1100)
committerDave Chinner <david@fromorbit.com>
Tue, 9 Feb 2016 05:41:31 +0000 (16:41 +1100)
When logging buffers, we attach a type to them that follows the
buffer all the way into the log and is used to identify the buffer
contents in log recovery. Both the realtime summary buffers and the
bitmap buffers do not have types defined or set, so when we try to
log them we see assert failure:

XFS: Assertion failed: (bip->bli_flags & XFS_BLI_STALE) || (xfs_blft_from_flags(&bip->__bli_format) > XFS_BLFT_UNKNOWN_BUF && xfs_blft_from_flags(&bip->__bli_format) < XFS_BLFT_MAX_BUF), file: fs/xfs/xfs_buf_item.c, line: 294

Fix this by adding buffer log format types for these buffers, and
add identification support into log recovery for them. Only build the log
recovery support if CONFIG_XFS_RT=y - we can't get into log recovery for real
time filesystems if support is not built into the kernel, and this avoids
potential build problems.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Tested-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_log_format.h
fs/xfs/libxfs/xfs_rtbitmap.c
fs/xfs/xfs_log_recover.c

index 2653146904153178d474172bcacfec55e7742907..1be26ecdbebfa87b5f287416fe5c9664f564e119 100644 (file)
@@ -495,6 +495,8 @@ enum xfs_blft {
        XFS_BLFT_ATTR_LEAF_BUF,
        XFS_BLFT_ATTR_RMT_BUF,
        XFS_BLFT_SB_BUF,
+       XFS_BLFT_RTBITMAP_BUF,
+       XFS_BLFT_RTSUMMARY_BUF,
        XFS_BLFT_MAX_BUF = (1 << XFS_BLFT_BITS),
 };
 
index 9b59ffa1fc198d4934a575af40716837bc54c11b..377a2e6552f326d2dc9f10b5bbe21dcabbb46ae8 100644 (file)
@@ -71,6 +71,9 @@ xfs_rtbuf_get(
                                   mp->m_bsize, 0, &bp, NULL);
        if (error)
                return error;
+
+       xfs_trans_buf_set_type(tp, bp, issum ? XFS_BLFT_RTSUMMARY_BUF
+                                            : XFS_BLFT_RTBITMAP_BUF);
        *bpp = bp;
        return 0;
 }
index da37beb76f6e67faf90a658d55f49a06c6fc4152..afdd326df923c37f71647d5f323f6c24a0ad725a 100644 (file)
@@ -2473,6 +2473,13 @@ xlog_recover_validate_buf_type(
                }
                bp->b_ops = &xfs_sb_buf_ops;
                break;
+#ifdef CONFIG_XFS_RT
+       case XFS_BLFT_RTBITMAP_BUF:
+       case XFS_BLFT_RTSUMMARY_BUF:
+               /* no verification of RT buffers is done */
+               bp->b_ops = NULL;
+               break;
+#endif /* CONFIG_XFS_RT */
        default:
                xfs_warn(mp, "Unknown buffer type %d!",
                         xfs_blft_from_flags(buf_f));