From 2e1bf6c51f662158d9824743f56a57b46cba2a49 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Wed, 1 Aug 2018 17:06:44 -0500 Subject: [PATCH] xfs_repair: notify user if free inodes contain errors xfs_repair checks allocated but unused (free) inodes in on-disk clusters, and up until now silently repairs any errors, and as a result does not alter exit status if errors are found. The in-kernel verifiers will be noisy about these errors and instruct the user to run repair, so it's best if repair is explicit about any fixes it makes. This shamelessly re-uses xfs_dinode_verify for this purpose. Signed-off-by: Eric Sandeen Reviewed-by: Carlos Maiolino Reviewed-by: Darrick J. Wong Signed-off-by: Eric Sandeen --- libxfs/libxfs_api_defs.h | 1 + repair/dinode.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index a1a95a483..d368eab3e 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -122,6 +122,7 @@ #define xfs_symlink_hdr_ok libxfs_symlink_hdr_ok #define xfs_verify_cksum libxfs_verify_cksum +#define xfs_dinode_verify libxfs_dinode_verify #define xfs_alloc_ag_max_usable libxfs_alloc_ag_max_usable #define xfs_allocbt_maxrecs libxfs_allocbt_maxrecs diff --git a/repair/dinode.c b/repair/dinode.c index e3b0cdc9c..dc912cbd8 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -2548,12 +2548,20 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), */ if (was_free) { /* - * easy case, inode free -- inode and map agree, clear + * easy case, inode free -- inode and map agree, check * it just in case to ensure that format, etc. are * set correctly */ - if (!no_modify) - *dirty += clear_dinode(mp, dino, lino); + if (libxfs_dinode_verify(mp, lino, dino) != NULL) { + do_warn( + _("free inode %" PRIu64 " contains errors, "), lino); + if (!no_modify) { + *dirty += clear_dinode(mp, dino, lino); + do_warn(_("corrected\n")); + } else { + do_warn(_("would correct\n")); + } + } *used = is_free; return 0; } -- 2.50.1