From 23639f779bd336c806273d78dfcd5ffe9ea03672 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Mon, 23 Nov 2015 15:24:24 +1100 Subject: [PATCH] repair: print XFS_WANT_CORRUPTED info with -vvv In the kernel, the XFS_WANT_CORRUPTED_* macros print the caller information via XFS_ERROR_REPORT, but in userspace this is silenced, because i.e. xfs_repair's job is to find and fix corruption, not to complain loudly about it. However, there are times when we would like to know if we've hit an unexpected corruption point. To that end, make "xfs_repair -vvv" enable noisiness from these macros, so that they will print the function and line of the caller. Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- include/xfs_mount.h | 1 + libxfs/libxfs_priv.h | 23 +++++++++++++++++++---- man/man8/xfs_repair.8 | 2 +- repair/xfs_repair.c | 4 ++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 5ec68663f..67f3b05cd 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -143,6 +143,7 @@ typedef struct xfs_perag { #define LIBXFS_MOUNT_32BITINOOPT 0x0004 #define LIBXFS_MOUNT_COMPAT_ATTR 0x0008 #define LIBXFS_MOUNT_ATTR2 0x0010 +#define LIBXFS_MOUNT_WANT_CORRUPTED 0x0020 #define LIBXFS_BHASHSIZE(sbp) (1<<10) diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 9135aac6a..0f4d3e573 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -147,10 +147,25 @@ enum ce { CE_DEBUG, CE_CONT, CE_NOTE, CE_WARN, CE_ALERT, CE_PANIC }; #define XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,tp,ip,nblks,ninos,fl) 0 #define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp,tp,ip,nblks,ninos,fl) 0 #define XFS_TEST_ERROR(expr,a,b,c) ( expr ) -#define XFS_WANT_CORRUPTED_GOTO(mp, expr, l) \ - { (mp) = (mp); if (!(expr)) { error = -EFSCORRUPTED; goto l; } } -#define XFS_WANT_CORRUPTED_RETURN(mp, expr) \ - { (mp) = (mp); if (!(expr)) { return -EFSCORRUPTED; } } +#define XFS_WANT_CORRUPTED_GOTO(mp, expr, l) \ +{ \ + if (!(expr)) { \ + if ((mp)->m_flags & LIBXFS_MOUNT_WANT_CORRUPTED) \ + printf("WANT_CORRUPTED_GOTO at %s:%d\n", \ + __func__, __LINE__); \ + error = -EFSCORRUPTED; \ + goto l; \ + } \ +} +#define XFS_WANT_CORRUPTED_RETURN(mp, expr) \ +{ \ + if (!(expr)) { \ + if ((mp)->m_flags & LIBXFS_MOUNT_WANT_CORRUPTED) \ + printf("WANT_CORRUPTED_RETURN at %s:%d\n", \ + __func__, __LINE__); \ + return -EFSCORRUPTED; \ + } \ +} #ifdef __GNUC__ #define __return_address __builtin_return_address(0) diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 index 0394c501f..1b4d9e323 100644 --- a/man/man8/xfs_repair.8 +++ b/man/man8/xfs_repair.8 @@ -158,7 +158,7 @@ outputs its progress every 15 minutes. Reporting is only activated when ag_stride is enabled. .TP .B \-v -Verbose output. +Verbose output. May be specified multiple times to increase verbosity. .TP .B \-d Repair dangerously. Allow diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index bed2ff5a8..1aeac5ba4 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -695,6 +695,10 @@ main(int argc, char **argv) } mp->m_log = &log; + /* Spit out function & line on these corruption macros */ + if (verbose > 2) + mp->m_flags |= LIBXFS_MOUNT_WANT_CORRUPTED; + /* * set XFS-independent status vars from the mount/sb structure */ -- 2.47.2