From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@redhat.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 5/4] xfs_scrub: actually check for errors coming from close()
Date: Mon, 14 May 2018 16:42:07 -0700 [thread overview]
Message-ID: <20180514234207.GI4933@magnolia> (raw)
In-Reply-To: <152579743411.10641.4577883761846454290.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Report errors reported by close().
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
scrub/phase1.c | 6 +++++-
scrub/phase3.c | 27 +++++++++++++++++++++++++--
scrub/phase5.c | 8 ++++++--
scrub/phase6.c | 10 +++++++---
scrub/vfs.c | 4 +++-
5 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/scrub/phase1.c b/scrub/phase1.c
index c2b9067a..87847259 100644
--- a/scrub/phase1.c
+++ b/scrub/phase1.c
@@ -60,6 +60,8 @@ bool
xfs_cleanup_fs(
struct scrub_ctx *ctx)
{
+ int error;
+
if (ctx->fshandle)
free_handle(ctx->fshandle, ctx->fshandle_len);
if (ctx->rtdev)
@@ -69,7 +71,9 @@ xfs_cleanup_fs(
if (ctx->datadev)
disk_close(ctx->datadev);
fshandle_destroy();
- close(ctx->mnt_fd);
+ error = close(ctx->mnt_fd);
+ if (error)
+ str_errno(ctx, _("closing mountpoint fd"));
fs_table_destroy();
return true;
diff --git a/scrub/phase3.c b/scrub/phase3.c
index 68c95e67..cbaa80ba 100644
--- a/scrub/phase3.c
+++ b/scrub/phase3.c
@@ -53,6 +53,25 @@ struct scrub_inode_ctx {
bool moveon;
};
+/* Report a filesystem error that the vfs fed us on close. */
+static void
+xfs_scrub_inode_vfs_error(
+ struct scrub_ctx *ctx,
+ struct xfs_bstat *bstat)
+{
+ char descr[DESCR_BUFSZ];
+ xfs_agnumber_t agno;
+ xfs_agino_t agino;
+ int old_errno = errno;
+
+ agno = bstat->bs_ino / (1ULL << (ctx->inopblog + ctx->agblklog));
+ agino = bstat->bs_ino % (1ULL << (ctx->inopblog + ctx->agblklog));
+ snprintf(descr, DESCR_BUFSZ, _("inode %"PRIu64" (%u/%u)"),
+ (uint64_t)bstat->bs_ino, agno, agino);
+ errno = old_errno;
+ str_errno(ctx, descr);
+}
+
/* Verify the contents, xattrs, and extent maps of an inode. */
static int
xfs_scrub_inode(
@@ -65,6 +84,7 @@ xfs_scrub_inode(
struct ptcounter *icount = ictx->icount;
bool moveon = true;
int fd = -1;
+ int error;
background_sleep();
@@ -116,8 +136,11 @@ xfs_scrub_inode(
out:
ptcounter_add(icount, 1);
progress_add(1);
- if (fd >= 0)
- close(fd);
+ if (fd >= 0) {
+ error = close(fd);
+ if (error)
+ xfs_scrub_inode_vfs_error(ctx, bstat);
+ }
if (!moveon)
ictx->moveon = false;
return ictx->moveon ? 0 : XFS_ITERATE_INODES_ABORT;
diff --git a/scrub/phase5.c b/scrub/phase5.c
index 01038f77..456f38e2 100644
--- a/scrub/phase5.c
+++ b/scrub/phase5.c
@@ -250,6 +250,7 @@ xfs_scrub_connections(
xfs_agnumber_t agno;
xfs_agino_t agino;
int fd = -1;
+ int error;
agno = bstat->bs_ino / (1ULL << (ctx->inopblog + ctx->agblklog));
agino = bstat->bs_ino % (1ULL << (ctx->inopblog + ctx->agblklog));
@@ -285,8 +286,11 @@ xfs_scrub_connections(
out:
progress_add(1);
- if (fd >= 0)
- close(fd);
+ if (fd >= 0) {
+ error = close(fd);
+ if (error)
+ str_errno(ctx, descr);
+ }
if (!moveon)
*pmoveon = false;
return *pmoveon ? 0 : XFS_ITERATE_INODES_ABORT;
diff --git a/scrub/phase6.c b/scrub/phase6.c
index b533cbbd..26540155 100644
--- a/scrub/phase6.c
+++ b/scrub/phase6.c
@@ -212,7 +212,9 @@ _("Disappeared during read error reporting."));
/* Go find the badness. */
moveon = xfs_report_verify_fd(ctx, descr, fd, arg);
- close(fd);
+ error = close(fd);
+ if (error)
+ str_errno(ctx, descr);
return moveon ? 0 : XFS_ITERATE_INODES_ABORT;
}
@@ -243,6 +245,7 @@ xfs_report_verify_dirent(
{
bool moveon;
int fd;
+ int error;
/* Ignore things we can't open. */
if (!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode))
@@ -268,8 +271,9 @@ xfs_report_verify_dirent(
goto out;
out:
- close(fd);
-
+ error = close(fd);
+ if (error)
+ str_errno(ctx, path);
return moveon;
}
diff --git a/scrub/vfs.c b/scrub/vfs.c
index cfb58782..77df2874 100644
--- a/scrub/vfs.c
+++ b/scrub/vfs.c
@@ -86,7 +86,9 @@ scan_fs_dir(
/* Caller-specific directory checks. */
if (!sft->dir_fn(ctx, sftd->path, dir_fd, sft->arg)) {
sft->moveon = false;
- close(dir_fd);
+ error = close(dir_fd);
+ if (error)
+ str_errno(ctx, sftd->path);
goto out;
}
prev parent reply other threads:[~2018-05-14 23:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-08 16:37 [PATCH 0/4] xfsprogs-4.17: tooling fixes Darrick J. Wong
2018-05-08 16:37 ` [PATCH 1/4] xfs_buflock: ignore if buffer already locked Darrick J. Wong
2018-05-08 16:37 ` [PATCH 2/4] xfs_buflock: record line number of trace where we locked the buffer Darrick J. Wong
2018-05-08 16:37 ` [PATCH 3/4] xfs_buflock: record buffer initialization Darrick J. Wong
2018-05-08 16:37 ` [PATCH 4/4] fsck: fix more bashisms Darrick J. Wong
2018-05-08 16:47 ` Eric Sandeen
2018-05-14 23:42 ` Darrick J. Wong [this message]
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=20180514234207.GI4933@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.com \
/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