]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: properly handle free inodes in extent hint validators libxfs-4.18-sync
authorEric Sandeen <sandeen@redhat.com>
Fri, 27 Jul 2018 22:03:50 +0000 (17:03 -0500)
committerEric Sandeen <sandeen@redhat.com>
Fri, 27 Jul 2018 22:03:50 +0000 (17:03 -0500)
Source kernel commit: d4a34e16555708bab5b67e679a95f055d8ef9882

When inodes are freed in xfs_ifree(), di_flags is cleared (so extent size
hints are removed) but the actual extent size fields are left intact.
This causes the extent hint validators to fail on freed inodes which once
had extent size hints.

This can be observed (for example) by running xfs/229 twice on a
non-crc xfs filesystem, or presumably on V5 with ikeep.

Fixes: 7d71a67 ("xfs: verify extent size hint is valid in inode verifier")
Fixes: 02a0fda ("xfs: verify COW extent size hint is valid in inode verifier")
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_inode_buf.c

index 5025f6a1e75d9ae7d0a2c67a30c3774b58cbb3dd..03ab18bb1f6098a6c12f2e68d8d2a980ec61af96 100644 (file)
@@ -727,7 +727,8 @@ xfs_inode_validate_extsize(
        if ((hint_flag || inherit_flag) && extsize == 0)
                return __this_address;
 
-       if (!(hint_flag || inherit_flag) && extsize != 0)
+       /* free inodes get flags set to zero but extsize remains */
+       if (mode && !(hint_flag || inherit_flag) && extsize != 0)
                return __this_address;
 
        if (extsize_bytes % blocksize_bytes)
@@ -773,7 +774,8 @@ xfs_inode_validate_cowextsize(
        if (hint_flag && cowextsize == 0)
                return __this_address;
 
-       if (!hint_flag && cowextsize != 0)
+       /* free inodes get flags set to zero but cowextsize remains */
+       if (mode && !hint_flag && cowextsize != 0)
                return __this_address;
 
        if (hint_flag && rt_flag)