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.
75 lines
2.8 KiB
75 lines
2.8 KiB
From 051dae5efb4fc7c1c47ccb72ff161241fb0815ee Mon Sep 17 00:00:00 2001 |
|
From: Brian Foster <bfoster@redhat.com> |
|
Date: Mon, 28 Jan 2019 16:05:16 -0600 |
|
Subject: [PATCH] xfs_repair: initialize non-leaf finobt blocks with correct magic |
|
|
|
The free inode btree construction code in xfs_repair has a bug where |
|
any non-leaf nodes outside of the leftmost block at the associated |
|
level in the tree are incorrectly initialized with the inobt magic |
|
value. Update the prop_ino_cursor() path responsible for growing the |
|
non-leaf portion of the inode btrees to use the btnum of the |
|
specific tree being generated rather than the hardcoded inode btree |
|
type. |
|
|
|
Signed-off-by: Brian Foster <bfoster@redhat.com> |
|
Reported-by: Lucas Stach <l.stach@pengutronix.de> |
|
Root-caused-by: Lucas Stach <l.stach@pengutronix.de> |
|
Reviewed-by: Eric Sandeen <sandeen@redhat.com> |
|
Reviewed-by: Dave Chinner <dchinner@redhat.com> |
|
Signed-off-by: Eric Sandeen <sandeen@sandeen.net> |
|
--- |
|
|
|
(backported for RHEL7) |
|
|
|
--- xfsprogs-4.5.0/repair/phase5.c 2016-02-28 17:39:26.000000000 -0600 |
|
+++ xfsprogs-4.5.0-mine/repair/phase5.c 2019-02-05 11:18:28.046228329 -0600 |
|
@@ -1003,7 +1003,7 @@ init_ino_cursor(xfs_mount_t *mp, xfs_agn |
|
|
|
static void |
|
prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, |
|
- xfs_agino_t startino, int level) |
|
+ __uint32_t magic, xfs_agino_t startino, int level) |
|
{ |
|
struct xfs_btree_block *bt_hdr; |
|
xfs_inobt_key_t *bt_key; |
|
@@ -1025,7 +1025,7 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agn |
|
* first path up the left side of the tree |
|
* where the agbno's are already set up |
|
*/ |
|
- prop_ino_cursor(mp, agno, btree_curs, startino, level); |
|
+ prop_ino_cursor(mp, agno, btree_curs, magic, startino, level); |
|
} |
|
|
|
if (be16_to_cpu(bt_hdr->bb_numrecs) == |
|
@@ -1062,11 +1062,11 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agn |
|
bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); |
|
memset(bt_hdr, 0, mp->m_sb.sb_blocksize); |
|
if (xfs_sb_version_hascrc(&mp->m_sb)) |
|
- xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, |
|
+ xfs_btree_init_block(mp, lptr->buf_p, magic, |
|
level, 0, agno, |
|
XFS_BTREE_CRC_BLOCKS); |
|
else |
|
- xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, |
|
+ xfs_btree_init_block(mp, lptr->buf_p, magic, |
|
level, 0, agno, 0); |
|
|
|
bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); |
|
@@ -1074,7 +1074,7 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agn |
|
/* |
|
* propagate extent record for first extent in new block up |
|
*/ |
|
- prop_ino_cursor(mp, agno, btree_curs, startino, level); |
|
+ prop_ino_cursor(mp, agno, btree_curs, magic, startino, level); |
|
} |
|
/* |
|
* add inode info to current block |
|
@@ -1236,7 +1236,7 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnu |
|
lptr->modulo--; |
|
|
|
if (lptr->num_recs_pb > 0) |
|
- prop_ino_cursor(mp, agno, btree_curs, |
|
+ prop_ino_cursor(mp, agno, btree_curs, magic, |
|
ino_rec->ino_startnum, 0); |
|
|
|
bt_rec = (xfs_inobt_rec_t *)
|
|
|