From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@sandeen.net, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 6/7] libfrog: convert scrub.c functions to negative error codes
Date: Wed, 25 Sep 2019 14:40:38 -0700 [thread overview]
Message-ID: <156944763836.302827.14950651793743078704.stgit@magnolia> (raw)
In-Reply-To: <156944760161.302827.4342305147521200999.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Convert libfrog functions to return negative error codes like libxfs
does.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
libfrog/scrub.c | 9 ++-
scrub/scrub.c | 198 ++++++++++++++++++++++++++++---------------------------
2 files changed, 108 insertions(+), 99 deletions(-)
diff --git a/libfrog/scrub.c b/libfrog/scrub.c
index e9671da2..d900bf2a 100644
--- a/libfrog/scrub.c
+++ b/libfrog/scrub.c
@@ -137,10 +137,17 @@ const struct xfrog_scrub_descr xfrog_scrubbers[XFS_SCRUB_TYPE_NR] = {
},
};
+/* Invoke the scrub ioctl. Returns zero or negative error code. */
int
xfrog_scrub_metadata(
struct xfs_fd *xfd,
struct xfs_scrub_metadata *meta)
{
- return ioctl(xfd->fd, XFS_IOC_SCRUB_METADATA, meta);
+ int ret;
+
+ ret = ioctl(xfd->fd, XFS_IOC_SCRUB_METADATA, meta);
+ if (ret)
+ return -errno;
+
+ return 0;
}
diff --git a/scrub/scrub.c b/scrub/scrub.c
index 5eb1b276..f7677499 100644
--- a/scrub/scrub.c
+++ b/scrub/scrub.c
@@ -127,7 +127,6 @@ xfs_check_metadata(
{
DEFINE_DESCR(dsc, ctx, format_scrub_descr);
unsigned int tries = 0;
- int code;
int error;
assert(!debug_tweak_on("XFS_SCRUB_NO_KERNEL"));
@@ -136,41 +135,41 @@ xfs_check_metadata(
dbg_printf("check %s flags %xh\n", descr_render(&dsc), meta->sm_flags);
retry:
- error = xfrog_scrub_metadata(&ctx->mnt, meta);
+ error = -xfrog_scrub_metadata(&ctx->mnt, meta);
if (debug_tweak_on("XFS_SCRUB_FORCE_REPAIR") && !error)
meta->sm_flags |= XFS_SCRUB_OFLAG_CORRUPT;
- if (error) {
- code = errno;
- switch (code) {
- case ENOENT:
- /* Metadata not present, just skip it. */
- return CHECK_DONE;
- case ESHUTDOWN:
- /* FS already crashed, give up. */
- str_info(ctx, descr_render(&dsc),
+ switch (error) {
+ case 0:
+ /* No operational errors encountered. */
+ break;
+ case ENOENT:
+ /* Metadata not present, just skip it. */
+ return CHECK_DONE;
+ case ESHUTDOWN:
+ /* FS already crashed, give up. */
+ str_info(ctx, descr_render(&dsc),
_("Filesystem is shut down, aborting."));
- return CHECK_ABORT;
- case EIO:
- case ENOMEM:
- /* Abort on I/O errors or insufficient memory. */
- str_errno(ctx, descr_render(&dsc));
- return CHECK_ABORT;
- case EDEADLOCK:
- case EBUSY:
- case EFSBADCRC:
- case EFSCORRUPTED:
- /*
- * The first two should never escape the kernel,
- * and the other two should be reported via sm_flags.
- */
- str_info(ctx, descr_render(&dsc),
-_("Kernel bug! errno=%d"), code);
- /* fall through */
- default:
- /* Operational error. */
- str_errno(ctx, descr_render(&dsc));
- return CHECK_DONE;
- }
+ return CHECK_ABORT;
+ case EIO:
+ case ENOMEM:
+ /* Abort on I/O errors or insufficient memory. */
+ str_errno(ctx, descr_render(&dsc));
+ return CHECK_ABORT;
+ case EDEADLOCK:
+ case EBUSY:
+ case EFSBADCRC:
+ case EFSCORRUPTED:
+ /*
+ * The first two should never escape the kernel,
+ * and the other two should be reported via sm_flags.
+ */
+ str_info(ctx, descr_render(&dsc), _("Kernel bug! errno=%d"),
+ error);
+ /* fall through */
+ default:
+ /* Operational error. */
+ str_errno(ctx, descr_render(&dsc));
+ return CHECK_DONE;
}
/*
@@ -578,10 +577,10 @@ __xfs_scrub_test(
meta.sm_type = type;
if (repair)
meta.sm_flags |= XFS_SCRUB_IFLAG_REPAIR;
- error = xfrog_scrub_metadata(&ctx->mnt, &meta);
- if (!error)
+ error = -xfrog_scrub_metadata(&ctx->mnt, &meta);
+ switch (error) {
+ case 0:
return true;
- switch (errno) {
case EROFS:
str_info(ctx, ctx->mntpoint,
_("Filesystem is mounted read-only; cannot proceed."));
@@ -707,74 +706,77 @@ xfs_repair_metadata(
str_info(ctx, descr_render(&dsc),
_("Attempting optimization."));
- error = xfrog_scrub_metadata(&ctx->mnt, &meta);
- if (error) {
- switch (errno) {
- case EDEADLOCK:
- case EBUSY:
- /* Filesystem is busy, try again later. */
- if (debug || verbose)
- str_info(ctx, descr_render(&dsc),
-_("Filesystem is busy, deferring repair."));
- return CHECK_RETRY;
- case ESHUTDOWN:
- /* Filesystem is already shut down, abort. */
+ error = -xfrog_scrub_metadata(&ctx->mnt, &meta);
+ switch (error) {
+ case 0:
+ /* No operational errors encountered. */
+ break;
+ case EDEADLOCK:
+ case EBUSY:
+ /* Filesystem is busy, try again later. */
+ if (debug || verbose)
str_info(ctx, descr_render(&dsc),
+_("Filesystem is busy, deferring repair."));
+ return CHECK_RETRY;
+ case ESHUTDOWN:
+ /* Filesystem is already shut down, abort. */
+ str_info(ctx, descr_render(&dsc),
_("Filesystem is shut down, aborting."));
- return CHECK_ABORT;
- case ENOTTY:
- case EOPNOTSUPP:
- /*
- * If we're in no-complain mode, requeue the check for
- * later. It's possible that an error in another
- * component caused us to flag an error in this
- * component. Even if the kernel didn't think it
- * could fix this, it's at least worth trying the scan
- * again to see if another repair fixed it.
- */
- if (!(repair_flags & XRM_COMPLAIN_IF_UNFIXED))
- return CHECK_RETRY;
- /*
- * If we forced repairs or this is a preen, don't
- * error out if the kernel doesn't know how to fix.
- */
- if (is_unoptimized(&oldm) ||
- debug_tweak_on("XFS_SCRUB_FORCE_REPAIR"))
- return CHECK_DONE;
- /* fall through */
- case EINVAL:
- /* Kernel doesn't know how to repair this? */
- str_error(ctx, descr_render(&dsc),
-_("Don't know how to fix; offline repair required."));
+ return CHECK_ABORT;
+ case ENOTTY:
+ case EOPNOTSUPP:
+ /*
+ * If we're in no-complain mode, requeue the check for
+ * later. It's possible that an error in another
+ * component caused us to flag an error in this
+ * component. Even if the kernel didn't think it
+ * could fix this, it's at least worth trying the scan
+ * again to see if another repair fixed it.
+ */
+ if (!(repair_flags & XRM_COMPLAIN_IF_UNFIXED))
+ return CHECK_RETRY;
+ /*
+ * If we forced repairs or this is a preen, don't
+ * error out if the kernel doesn't know how to fix.
+ */
+ if (is_unoptimized(&oldm) ||
+ debug_tweak_on("XFS_SCRUB_FORCE_REPAIR"))
return CHECK_DONE;
- case EROFS:
- /* Read-only filesystem, can't fix. */
- if (verbose || debug || needs_repair(&oldm))
- str_info(ctx, descr_render(&dsc),
+ /* fall through */
+ case EINVAL:
+ /* Kernel doesn't know how to repair this? */
+ str_error(ctx,
+_("%s: Don't know how to fix; offline repair required."),
+ descr_render(&dsc));
+ return CHECK_DONE;
+ case EROFS:
+ /* Read-only filesystem, can't fix. */
+ if (verbose || debug || needs_repair(&oldm))
+ str_info(ctx, descr_render(&dsc),
_("Read-only filesystem; cannot make changes."));
+ return CHECK_DONE;
+ case ENOENT:
+ /* Metadata not present, just skip it. */
+ return CHECK_DONE;
+ case ENOMEM:
+ case ENOSPC:
+ /* Don't care if preen fails due to low resources. */
+ if (is_unoptimized(&oldm) && !needs_repair(&oldm))
return CHECK_DONE;
- case ENOENT:
- /* Metadata not present, just skip it. */
- return CHECK_DONE;
- case ENOMEM:
- case ENOSPC:
- /* Don't care if preen fails due to low resources. */
- if (is_unoptimized(&oldm) && !needs_repair(&oldm))
- return CHECK_DONE;
- /* fall through */
- default:
- /*
- * Operational error. If the caller doesn't want us
- * to complain about repair failures, tell the caller
- * to requeue the repair for later and don't say a
- * thing. Otherwise, print error and bail out.
- */
- if (!(repair_flags & XRM_COMPLAIN_IF_UNFIXED))
- return CHECK_RETRY;
- str_errno(ctx, descr_render(&dsc));
- return CHECK_DONE;
- }
+ /* fall through */
+ default:
+ /*
+ * Operational error. If the caller doesn't want us
+ * to complain about repair failures, tell the caller
+ * to requeue the repair for later and don't say a
+ * thing. Otherwise, print error and bail out.
+ */
+ if (!(repair_flags & XRM_COMPLAIN_IF_UNFIXED))
+ return CHECK_RETRY;
+ str_liberror(ctx, error, descr_render(&dsc));
+ return CHECK_DONE;
}
+
if (repair_flags & XRM_COMPLAIN_IF_UNFIXED)
xfs_scrub_warn_incomplete_scrub(ctx, &dsc, &meta);
if (needs_repair(&meta)) {
next prev parent reply other threads:[~2019-09-25 21:42 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-25 21:40 [PATCH 0/7] libfrog: switch to negative error codes Darrick J. Wong
2019-09-25 21:40 ` [PATCH 1/7] libfrog: print library errors Darrick J. Wong
2019-09-30 7:50 ` Christoph Hellwig
2019-09-25 21:40 ` [PATCH 2/7] libfrog: convert bitmap.c to negative error codes Darrick J. Wong
2019-09-30 7:51 ` Christoph Hellwig
2019-09-25 21:40 ` [PATCH 3/7] libfrog: convert fsgeom.c functions " Darrick J. Wong
2019-09-30 7:52 ` Christoph Hellwig
2019-09-25 21:40 ` [PATCH 4/7] libfrog: convert bulkstat.c " Darrick J. Wong
2019-09-30 7:52 ` Christoph Hellwig
2019-09-25 21:40 ` [PATCH 5/7] libfrog: convert ptvar.c " Darrick J. Wong
2019-09-30 7:52 ` Christoph Hellwig
2019-09-25 21:40 ` Darrick J. Wong [this message]
2019-09-30 7:54 ` [PATCH 6/7] libfrog: convert scrub.c " Christoph Hellwig
2019-09-30 16:15 ` Darrick J. Wong
2019-09-25 21:40 ` [PATCH 7/7] libfrog: convert workqueue.c " Darrick J. Wong
2019-09-30 7:55 ` Christoph Hellwig
2019-10-22 18:52 [PATCH 0/7] libfrog: switch " Darrick J. Wong
2019-10-22 18:53 ` [PATCH 6/7] libfrog: convert scrub.c 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=156944763836.302827.14950651793743078704.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).