You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.1 KiB
58 lines
2.1 KiB
From 533d1d229a881d5a58a232377c409a3dd7a5cd6f Mon Sep 17 00:00:00 2001 |
|
From: Eric Sandeen <sandeen@redhat.com> |
|
Date: Thu, 20 Jul 2017 10:51:46 -0500 |
|
Subject: [PATCH] xfs_db: properly set inode type |
|
|
|
When we set the type to "inode" the verifier validates multiple |
|
inodes in the current fs block, so setting the buffer size to |
|
that of just one inode is not sufficient and it'll emit spurious |
|
verifier errors for all but the first, as we read off the end: |
|
|
|
xfs_db> daddr 99 |
|
xfs_db> type inode |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
Metadata corruption detected at xfs_inode block 0x63/0x200 |
|
|
|
Use the special set_cur_inode() function for this purpose |
|
as is done in inode_f(). |
|
|
|
Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
|
Reviewed-by: Bill O'Donnell <billodo@redhat.com> |
|
[sandeen: remove nag/warning printf for now] |
|
Signed-off-by: Eric Sandeen <sandeen@sandeen.net> |
|
--- |
|
db/io.c | 16 ++++++++++++++++ |
|
1 file changed, 16 insertions(+) |
|
|
|
Index: xfsprogs-rhel7.5/db/io.c |
|
=================================================================== |
|
--- xfsprogs-rhel7.5.orig/db/io.c |
|
+++ xfsprogs-rhel7.5/db/io.c |
|
@@ -567,6 +567,22 @@ set_iocur_type( |
|
{ |
|
struct xfs_buf *bp = iocur_top->bp; |
|
|
|
+ /* Inodes are special; verifier checks all inodes in the chunk */ |
|
+ if (type->typnm == TYP_INODE) { |
|
+ xfs_daddr_t b = iocur_top->bb; |
|
+ xfs_ino_t ino; |
|
+ |
|
+ /* |
|
+ * Note that this will back up to the beginning of the inode |
|
+ * which contains the current disk location; daddr may change. |
|
+ */ |
|
+ ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b), |
|
+ ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) % |
|
+ (mp->m_sb.sb_agblocks << mp->m_sb.sb_inopblog)); |
|
+ set_cur_inode(ino); |
|
+ return; |
|
+ } |
|
+ |
|
/* adjust buffer size for types with fields & hence fsize() */ |
|
if (type->fields) { |
|
int bb_count; /* type's size in basic blocks */
|
|
|