diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2019-11-01 16:16:40 -0400 |
---|---|---|
committer | Eric Sandeen <sandeen@sandeen.net> | 2019-11-01 16:16:40 -0400 |
commit | 663e02a090c82391bd3fdb861b8fceba7f051726 (patch) | |
tree | 7db2c063d1c87c110a787d834adae77a3d607315 | |
parent | aeff064126ede3d7eef1e7120f93c71a35fe2b73 (diff) | |
download | xfsprogs-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.c | 45 |
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. */ |