aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2019-11-01 16:16:40 -0400
committerEric Sandeen <sandeen@sandeen.net>2019-11-01 16:16:40 -0400
commit663e02a090c82391bd3fdb861b8fceba7f051726 (patch)
tree7db2c063d1c87c110a787d834adae77a3d607315
parentaeff064126ede3d7eef1e7120f93c71a35fe2b73 (diff)
downloadxfsprogs-dev-663e02a090c82391bd3fdb861b8fceba7f051726.tar.gz
xfs_scrub: separate media error reporting for attribute forks
Use different functions to warn about media errors that were detected in underlying xattr data because logical offsets for attribute fork extents have no meaning to users. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r--scrub/phase6.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/scrub/phase6.c b/scrub/phase6.c
index 2ce2a19ee4..f2a78a6097 100644
--- a/scrub/phase6.c
+++ b/scrub/phase6.c
@@ -113,7 +113,7 @@ xfs_decode_special_owner(
/* Report if this extent overlaps a bad region. */
static bool
-xfs_report_verify_inode_bmap(
+report_data_loss(
struct scrub_ctx *ctx,
const char *descr,
int fd,
@@ -142,6 +142,40 @@ _("offset %llu failed read verification."), bmap->bm_offset);
return true;
}
+/* Report if the extended attribute data overlaps a bad region. */
+static bool
+report_attr_loss(
+ struct scrub_ctx *ctx,
+ const char *descr,
+ int fd,
+ int whichfork,
+ struct fsxattr *fsx,
+ struct xfs_bmap *bmap,
+ void *arg)
+{
+ struct media_verify_state *vs = arg;
+ struct bitmap *bmp = vs->d_bad;
+
+ /* Complain about attr fork extents that don't look right. */
+ if (bmap->bm_flags & (BMV_OF_PREALLOC | BMV_OF_DELALLOC)) {
+ str_info(ctx, descr,
+_("found unexpected unwritten/delalloc attr fork extent."));
+ return true;
+ }
+
+ if (fsx->fsx_xflags & FS_XFLAG_REALTIME) {
+ str_info(ctx, descr,
+_("found unexpected realtime attr fork extent."));
+ return true;
+ }
+
+ if (bitmap_test(bmp, bmap->bm_physical, bmap->bm_length))
+ str_error(ctx, descr,
+_("media error in extended attribute data."));
+
+ return true;
+}
+
/* Iterate the extent mappings of a file to report errors. */
static bool
xfs_report_verify_fd(
@@ -155,16 +189,13 @@ xfs_report_verify_fd(
/* data fork */
moveon = xfs_iterate_filemaps(ctx, descr, fd, XFS_DATA_FORK, &key,
- xfs_report_verify_inode_bmap, arg);
+ report_data_loss, arg);
if (!moveon)
return false;
/* attr fork */
- moveon = xfs_iterate_filemaps(ctx, descr, fd, XFS_ATTR_FORK, &key,
- xfs_report_verify_inode_bmap, arg);
- if (!moveon)
- return false;
- return true;
+ return xfs_iterate_filemaps(ctx, descr, fd, XFS_ATTR_FORK, &key,
+ report_attr_loss, arg);
}
/* Report read verify errors in unlinked (but still open) files. */