From: Darrick J. Wong Date: Thu, 28 Jun 2018 20:09:21 +0000 (-0500) Subject: xfs_repair: clear extent size hints when clearing inode core X-Git-Tag: v4.18.0-rc0~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a65177d51b3fd82ac3c3515fe2b7f0fb66e2ddd5;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: clear extent size hints when clearing inode core In kernel 4.18 we become more strict about what can be in the extent size hint fields, even for freed inodes. Therefore, if repair decides to clear out an inode core, zero the hint fields and clear the flags so that the kernel won't trip over the cleared inode if and when it tries to read the chunk. Signed-off-by: Darrick J. Wong Reviewed-by: Eric Sandeen Signed-off-by: Eric Sandeen --- diff --git a/repair/dinode.c b/repair/dinode.c index 49d5d058a..72e09cc99 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -194,6 +194,11 @@ clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t *dinoc, xfs_ino_t ino_num) dinoc->di_anextents = 0; } + if (be32_to_cpu(dinoc->di_extsize) != 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_extsize = 0; + } + if (dinoc->di_version > 1 && be32_to_cpu(dinoc->di_nlink) != 0) { __dirty_no_modify_ret(dirty); @@ -237,6 +242,11 @@ clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t *dinoc, xfs_ino_t ino_num) dinoc->di_changecount = 0; } + if (be32_to_cpu(dinoc->di_cowextsize) != 0) { + __dirty_no_modify_ret(dirty); + dinoc->di_cowextsize = 0; + } + return dirty; }