From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@sandeen.net, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 11/18] xfs_scrub: remove moveon from phase 6 functions
Date: Wed, 25 Sep 2019 14:39:12 -0700 [thread overview]
Message-ID: <156944755221.301514.3338654907589072498.stgit@magnolia> (raw)
In-Reply-To: <156944748487.301514.14685083474028866113.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Replace the moveon returns in the phase 6 code with a direct integer
error return.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
scrub/phase6.c | 173 ++++++++++++++++++++++++++++++--------------------------
1 file changed, 92 insertions(+), 81 deletions(-)
diff --git a/scrub/phase6.c b/scrub/phase6.c
index 49650a21..9ee337f5 100644
--- a/scrub/phase6.c
+++ b/scrub/phase6.c
@@ -45,7 +45,7 @@ struct media_verify_state {
/* Find the fd for a given device identifier. */
static struct read_verify_pool *
-xfs_dev_to_pool(
+dev_to_pool(
struct scrub_ctx *ctx,
struct media_verify_state *vs,
dev_t dev)
@@ -61,7 +61,7 @@ xfs_dev_to_pool(
/* Find the device major/minor for a given file descriptor. */
static dev_t
-xfs_disk_to_dev(
+disk_to_dev(
struct scrub_ctx *ctx,
struct disk *disk)
{
@@ -95,7 +95,7 @@ static const struct owner_decode special_owners[] = {
/* Decode a special owner. */
static const char *
-xfs_decode_special_owner(
+decode_special_owner(
uint64_t owner)
{
const struct owner_decode *od = special_owners;
@@ -213,8 +213,8 @@ _("media error in extended attribute data."));
}
/* Iterate the extent mappings of a file to report errors. */
-static bool
-xfs_report_verify_fd(
+static int
+report_fd_loss(
struct scrub_ctx *ctx,
const char *descr,
int fd,
@@ -236,7 +236,7 @@ xfs_report_verify_fd(
report_data_loss, &br);
if (ret) {
str_liberror(ctx, ret, bmap_descr);
- return false;
+ return ret;
}
/* attr fork */
@@ -245,23 +245,23 @@ xfs_report_verify_fd(
report_attr_loss, &br);
if (ret) {
str_liberror(ctx, ret, bmap_descr);
- return false;
+ return ret;
}
- return true;
+
+ return 0;
}
/* Report read verify errors in unlinked (but still open) files. */
static int
-xfs_report_verify_inode(
+report_inode_loss(
struct scrub_ctx *ctx,
struct xfs_handle *handle,
struct xfs_bulkstat *bstat,
void *arg)
{
char descr[DESCR_BUFSZ];
- bool moveon;
int fd;
- int error;
+ int error, err2;
/* Ignore linked files and things we can't open. */
if (bstat->bs_nlink != 0)
@@ -285,26 +285,24 @@ _("Disappeared during read error reporting."));
}
/* Go find the badness. */
- moveon = xfs_report_verify_fd(ctx, descr, fd, arg);
- error = close(fd);
- if (error)
+ error = report_fd_loss(ctx, descr, fd, arg);
+
+ err2 = close(fd);
+ if (err2)
str_errno(ctx, descr);
- return moveon ? 0 : XFS_ITERATE_INODES_ABORT;
+ return error;
}
/* Scan a directory for matches in the read verify error list. */
static int
-xfs_report_verify_dir(
+report_dir_loss(
struct scrub_ctx *ctx,
const char *path,
int dir_fd,
void *arg)
{
- bool moveon;
-
- moveon = xfs_report_verify_fd(ctx, path, dir_fd, arg);
- return moveon ? 0 : -1;
+ return report_fd_loss(ctx, path, dir_fd, arg);
}
/*
@@ -312,7 +310,7 @@ xfs_report_verify_dir(
* the read verify error list.
*/
static int
-xfs_report_verify_dirent(
+report_dirent_loss(
struct scrub_ctx *ctx,
const char *path,
int dir_fd,
@@ -320,9 +318,8 @@ xfs_report_verify_dirent(
struct stat *sb,
void *arg)
{
- bool moveon;
int fd;
- int error;
+ int error, err2;
/* Ignore things we can't open. */
if (!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode))
@@ -347,15 +344,15 @@ xfs_report_verify_dirent(
}
/* Go find the badness. */
- moveon = xfs_report_verify_fd(ctx, path, fd, arg);
- if (moveon)
- goto out;
+ error = report_fd_loss(ctx, path, fd, arg);
-out:
- error = close(fd);
- if (error)
+ err2 = close(fd);
+ if (err2)
str_errno(ctx, path);
- return moveon ? 0 : -1;
+ if (!error && err2)
+ error = err2;
+
+ return error;
}
/* Report an IO error resulting from read-verify based off getfsmap. */
@@ -383,7 +380,7 @@ ioerr_fsmap_report(
if (map->fmr_flags & FMR_OF_SPECIAL_OWNER) {
snprintf(buf, DESCR_BUFSZ, _("disk offset %"PRIu64),
(uint64_t)map->fmr_physical + err_off);
- type = xfs_decode_special_owner(map->fmr_owner);
+ type = decode_special_owner(map->fmr_owner);
str_error(ctx, buf, _("media error in %s."), type);
}
@@ -413,7 +410,7 @@ bitmap_for_disk(
struct disk *disk,
struct media_verify_state *vs)
{
- dev_t dev = xfs_disk_to_dev(ctx, disk);
+ dev_t dev = disk_to_dev(ctx, disk);
/*
* If we don't have parent pointers, save the bad extent for
@@ -457,6 +454,7 @@ struct walk_ioerr {
struct disk *disk;
};
+/* For a given badblocks extent, walk the rmap data to tell us what was lost. */
static int
walk_ioerr(
uint64_t start,
@@ -467,7 +465,7 @@ walk_ioerr(
struct fsmap keys[2];
dev_t dev;
- dev = xfs_disk_to_dev(wioerr->ctx, wioerr->disk);
+ dev = disk_to_dev(wioerr->ctx, wioerr->disk);
/* Go figure out which blocks are bad from the fsmap. */
memset(keys, 0, sizeof(struct fsmap) * 2);
@@ -482,6 +480,7 @@ walk_ioerr(
&start);
}
+/* Walk all badblocks extents to report what was lost. */
static int
walk_ioerrs(
struct scrub_ctx *ctx,
@@ -503,8 +502,8 @@ walk_ioerrs(
}
/* Given bad extent lists for the data & rtdev, find bad files. */
-static bool
-xfs_report_verify_errors(
+static int
+report_loss(
struct scrub_ctx *ctx,
struct media_verify_state *vs)
{
@@ -513,24 +512,22 @@ xfs_report_verify_errors(
ret = walk_ioerrs(ctx, ctx->datadev, vs);
if (ret) {
str_liberror(ctx, ret, _("walking datadev io errors"));
- return false;
+ return ret;
}
ret = walk_ioerrs(ctx, ctx->rtdev, vs);
if (ret) {
str_liberror(ctx, ret, _("walking rtdev io errors"));
- return false;
+ return ret;
}
/* Scan the directory tree to get file paths. */
- ret = scan_fs_tree(ctx, xfs_report_verify_dir,
- xfs_report_verify_dirent, vs);
+ ret = scan_fs_tree(ctx, report_dir_loss, report_dirent_loss, vs);
if (ret)
- return false;
+ return ret;
/* Scan for unlinked files. */
- ret = scrub_scan_all_inodes(ctx, xfs_report_verify_inode, vs);
- return ret == 0;
+ return scrub_scan_all_inodes(ctx, report_inode_loss, vs);
}
/* Schedule a read-verify of a (data block) extent. */
@@ -544,7 +541,7 @@ check_rmap(
struct read_verify_pool *rvp;
int ret;
- rvp = xfs_dev_to_pool(ctx, vs, map->fmr_device);
+ rvp = dev_to_pool(ctx, vs, map->fmr_device);
dbg_printf("rmap dev %d:%d phys %"PRIu64" owner %"PRId64
" offset %"PRIu64" len %"PRIu64" flags 0x%x\n",
@@ -622,7 +619,7 @@ verify_entire_disk(
}
/* Scan every part of every disk. */
-static bool
+static int
verify_all_disks(
struct scrub_ctx *ctx,
struct media_verify_state *vs)
@@ -632,14 +629,14 @@ verify_all_disks(
ret = verify_entire_disk(vs->rvp_data, ctx->datadev, vs);
if (ret) {
str_liberror(ctx, ret, _("scheduling datadev verify"));
- return false;
+ return ret;
}
if (ctx->logdev) {
ret = verify_entire_disk(vs->rvp_log, ctx->logdev, vs);
if (ret) {
str_liberror(ctx, ret, _("scheduling logdev verify"));
- return false;
+ return ret;
}
}
@@ -647,11 +644,11 @@ verify_all_disks(
ret = verify_entire_disk(vs->rvp_realtime, ctx->rtdev, vs);
if (ret) {
str_liberror(ctx, ret, _("scheduling rtdev verify"));
- return false;
+ return ret;
}
}
- return true;
+ return 0;
}
/*
@@ -662,18 +659,17 @@ verify_all_disks(
* scan the extent maps of the entire fs tree to figure (and the unlinked
* inodes) out which files are now broken.
*/
-bool
-xfs_scan_blocks(
+int
+phase6_func(
struct scrub_ctx *ctx)
{
struct media_verify_state vs = { NULL };
- bool moveon = false;
- int ret;
+ int ret, ret2, ret3;
ret = bitmap_alloc(&vs.d_bad);
if (ret) {
str_liberror(ctx, ret, _("creating datadev badblock bitmap"));
- goto out;
+ return ret;
}
ret = bitmap_alloc(&vs.r_bad);
@@ -711,40 +707,39 @@ xfs_scan_blocks(
}
if (scrub_data > 1)
- moveon = verify_all_disks(ctx, &vs);
- else {
+ ret = verify_all_disks(ctx, &vs);
+ else
ret = scrub_scan_all_spacemaps(ctx, check_rmap, &vs);
- if (ret)
- moveon = false;
- }
- if (!moveon)
+ if (ret)
goto out_rtpool;
ret = clean_pool(vs.rvp_data, &ctx->bytes_checked);
- if (ret) {
+ if (ret)
str_liberror(ctx, ret, _("flushing datadev verify pool"));
- moveon = false;
- }
- ret = clean_pool(vs.rvp_log, &ctx->bytes_checked);
- if (ret) {
- str_liberror(ctx, ret, _("flushing logdev verify pool"));
- moveon = false;
- }
+ ret2 = clean_pool(vs.rvp_log, &ctx->bytes_checked);
+ if (ret2)
+ str_liberror(ctx, ret2, _("flushing logdev verify pool"));
- ret = clean_pool(vs.rvp_realtime, &ctx->bytes_checked);
- if (ret) {
- str_liberror(ctx, ret, _("flushing rtdev verify pool"));
- moveon = false;
- }
+ ret3 = clean_pool(vs.rvp_realtime, &ctx->bytes_checked);
+ if (ret3)
+ str_liberror(ctx, ret3, _("flushing rtdev verify pool"));
+
+ /*
+ * If the verify flush didn't work or we found no bad blocks, we're
+ * done! No errors detected.
+ */
+ if (ret || ret2 || ret3)
+ goto out_rbad;
+ if (bitmap_empty(vs.d_bad) && bitmap_empty(vs.r_bad))
+ goto out_rbad;
/* Scan the whole dir tree to see what matches the bad extents. */
- if (moveon && (!bitmap_empty(vs.d_bad) || !bitmap_empty(vs.r_bad)))
- moveon = xfs_report_verify_errors(ctx, &vs);
+ ret = report_loss(ctx, &vs);
bitmap_free(&vs.r_bad);
bitmap_free(&vs.d_bad);
- return moveon;
+ return ret;
out_rtpool:
if (vs.rvp_realtime) {
@@ -763,13 +758,19 @@ xfs_scan_blocks(
bitmap_free(&vs.r_bad);
out_dbad:
bitmap_free(&vs.d_bad);
-out:
- return moveon;
+ return ret;
}
-/* Estimate how much work we're going to do. */
bool
-xfs_estimate_verify_work(
+xfs_scan_blocks(
+ struct scrub_ctx *ctx)
+{
+ return phase6_func(ctx) == 0;
+}
+
+/* Estimate how much work we're going to do. */
+int
+phase6_estimate(
struct scrub_ctx *ctx,
uint64_t *items,
unsigned int *nr_threads,
@@ -787,7 +788,7 @@ xfs_estimate_verify_work(
&r_blocks, &r_bfree, &f_files, &f_free);
if (ret) {
str_liberror(ctx, ret, _("estimating verify work"));
- return false;
+ return ret;
}
*items = cvt_off_fsb_to_b(&ctx->mnt, d_blocks + r_blocks);
@@ -795,5 +796,15 @@ xfs_estimate_verify_work(
*items -= cvt_off_fsb_to_b(&ctx->mnt, d_bfree + r_bfree);
*nr_threads = disk_heads(ctx->datadev);
*rshift = 20;
- return true;
+ return 0;
+}
+
+bool
+xfs_estimate_verify_work(
+ struct scrub_ctx *ctx,
+ uint64_t *items,
+ unsigned int *nr_threads,
+ int *rshift)
+{
+ return phase6_estimate(ctx, items, nr_threads, rshift) == 0;
}
next prev parent reply other threads:[~2019-09-25 21:39 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-25 21:38 [PATCH 00/18] xfs_scrub: remove moveon space aliens Darrick J. Wong
2019-09-25 21:38 ` [PATCH 01/18] xfs_scrub: remove moveon from filemap iteration Darrick J. Wong
2019-09-25 21:38 ` [PATCH 02/18] xfs_scrub: remove moveon from the fscounters functions Darrick J. Wong
2019-09-25 21:38 ` [PATCH 03/18] xfs_scrub: remove moveon from inode iteration Darrick J. Wong
2019-09-25 21:38 ` [PATCH 04/18] xfs_scrub: remove moveon from vfs directory tree iteration Darrick J. Wong
2019-09-25 21:38 ` [PATCH 05/18] xfs_scrub: remove moveon from spacemap Darrick J. Wong
2019-09-25 21:38 ` [PATCH 06/18] xfs_scrub: remove moveon from unicode name collision helpers Darrick J. Wong
2019-09-25 21:38 ` [PATCH 07/18] xfs_scrub: remove moveon from progress report helpers Darrick J. Wong
2019-09-25 21:38 ` [PATCH 08/18] xfs_scrub: remove moveon from scrub ioctl wrappers Darrick J. Wong
2019-09-25 21:39 ` [PATCH 09/18] xfs_scrub: remove moveon from repair action list helpers Darrick J. Wong
2019-09-25 21:39 ` [PATCH 10/18] xfs_scrub: remove moveon from phase 7 functions Darrick J. Wong
2019-09-25 21:39 ` Darrick J. Wong [this message]
2019-09-25 21:39 ` [PATCH 12/18] xfs_scrub: remove moveon from phase 5 functions Darrick J. Wong
2019-09-25 21:39 ` [PATCH 13/18] xfs_scrub: remove moveon from phase 4 functions Darrick J. Wong
2019-09-25 21:39 ` [PATCH 14/18] xfs_scrub: remove moveon from phase 3 functions Darrick J. Wong
2019-09-25 21:39 ` [PATCH 15/18] xfs_scrub: remove moveon from phase 2 functions Darrick J. Wong
2019-09-25 21:39 ` [PATCH 16/18] xfs_scrub: remove moveon from phase 1 functions Darrick J. Wong
2019-09-25 21:39 ` [PATCH 17/18] xfs_scrub: remove XFS_ITERATE_INODES_ABORT from inode iterator Darrick J. Wong
2019-09-25 21:39 ` [PATCH 18/18] xfs_scrub: remove moveon from main program Darrick J. Wong
-- strict thread matches above, loose matches on Subject: below --
2019-10-22 18:50 [PATCH 00/18] xfs_scrub: remove moveon space aliens Darrick J. Wong
2019-10-22 18:51 ` [PATCH 11/18] xfs_scrub: remove moveon from phase 6 functions Darrick J. Wong
2019-09-06 3:40 [PATCH 00/18] xfs_scrub: remove moveon space aliens Darrick J. Wong
2019-09-06 3:42 ` [PATCH 11/18] xfs_scrub: remove moveon from phase 6 functions Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=156944755221.301514.3338654907589072498.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).