From: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
Report errors reported by close().
Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
---
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;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at https://urldefense.proofpoint.com/v2/url?u=http-3A__vger.kernel.org_majordomo-2Dinfo.html&d=DwICaQ&c=RoP1YumCXCgaWHvlZYR8PZh8Bv7qIrMUB65eapI_JnE&r=LHZQ8fHvy6wDKXGTWcm97burZH5sQKHRDMaY1UthQxc&m=QEHg-4gJOhupzORWTApyuKuBTYX6Sum0GqFWPnC_mCo&s=QA446VHazWxqoc7nECcFGE-upy-amurTz6LUSuZURGg&e=