Report errors reported by close().
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
xfs_cleanup_fs(
struct scrub_ctx *ctx)
{
+ int error;
+
if (ctx->fshandle)
free_handle(ctx->fshandle, ctx->fshandle_len);
if (ctx->rtdev)
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;
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(
struct ptcounter *icount = ictx->icount;
bool moveon = true;
int fd = -1;
+ int error;
background_sleep();
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;
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));
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;
/* 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;
}
{
bool moveon;
int fd;
+ int error;
/* Ignore things we can't open. */
if (!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode))
goto out;
out:
- close(fd);
-
+ error = close(fd);
+ if (error)
+ str_errno(ctx, path);
return moveon;
}
/* 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;
}