From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@redhat.com, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 16/29] xfs_scrub: check directory connectivity
Date: Tue, 30 Jan 2018 19:08:13 -0800 [thread overview]
Message-ID: <151736809355.32164.8484573700904559592.stgit@magnolia> (raw)
In-Reply-To: <151736799098.32164.15446216987522359103.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Opening directories by file handle will cause the kernel to perform
parent lookups all the way to the root directory. Take advantage of
this to ensure that directories actually connect to the root. Some
day we'll have parent pointers and can make this more comprehensive.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
scrub/Makefile | 1 +
scrub/phase5.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++
scrub/xfs_scrub.c | 1 +
scrub/xfs_scrub.h | 1 +
4 files changed, 104 insertions(+)
create mode 100644 scrub/phase5.c
diff --git a/scrub/Makefile b/scrub/Makefile
index e0d15d8..adb868e 100644
--- a/scrub/Makefile
+++ b/scrub/Makefile
@@ -36,6 +36,7 @@ inodes.c \
phase1.c \
phase2.c \
phase3.c \
+phase5.c \
scrub.c \
spacemap.c \
xfs_scrub.c
diff --git a/scrub/phase5.c b/scrub/phase5.c
new file mode 100644
index 0000000..0b161e3
--- /dev/null
+++ b/scrub/phase5.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 Oracle. All Rights Reserved.
+ *
+ * Author: Darrick J. Wong <darrick.wong@oracle.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/statvfs.h>
+#include "xfs.h"
+#include "path.h"
+#include "workqueue.h"
+#include "xfs_scrub.h"
+#include "common.h"
+#include "inodes.h"
+#include "scrub.h"
+
+/* Phase 5: Check directory connectivity. */
+
+/*
+ * Verify the connectivity of the directory tree.
+ * We know that the kernel's open-by-handle function will try to reconnect
+ * parents of an opened directory, so we'll accept that as sufficient.
+ */
+static int
+xfs_scrub_connections(
+ struct scrub_ctx *ctx,
+ struct xfs_handle *handle,
+ struct xfs_bstat *bstat,
+ void *arg)
+{
+ bool *pmoveon = arg;
+ char descr[DESCR_BUFSZ];
+ bool moveon = true;
+ xfs_agnumber_t agno;
+ xfs_agino_t agino;
+ int fd = -1;
+
+ 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);
+ background_sleep();
+
+ /* Open the dir, let the kernel try to reconnect it to the root. */
+ if (S_ISDIR(bstat->bs_mode)) {
+ fd = xfs_open_handle(handle);
+ if (fd < 0) {
+ if (errno == ESTALE)
+ return ESTALE;
+ str_errno(ctx, descr);
+ goto out;
+ }
+ }
+
+out:
+ if (fd >= 0)
+ close(fd);
+ if (!moveon)
+ *pmoveon = false;
+ return *pmoveon ? 0 : XFS_ITERATE_INODES_ABORT;
+}
+
+/* Check directory connectivity. */
+bool
+xfs_scan_connections(
+ struct scrub_ctx *ctx)
+{
+ bool moveon = true;
+ bool ret;
+
+ if (ctx->errors_found) {
+ str_info(ctx, ctx->mntpoint,
+_("Filesystem has errors, skipping connectivity checks."));
+ return true;
+ }
+
+ ret = xfs_scan_all_inodes(ctx, xfs_scrub_connections, &moveon);
+ if (!ret)
+ moveon = false;
+ if (!moveon)
+ return false;
+ xfs_scrub_report_preen_triggers(ctx);
+ return true;
+}
diff --git a/scrub/xfs_scrub.c b/scrub/xfs_scrub.c
index be809fc..2530d69 100644
--- a/scrub/xfs_scrub.c
+++ b/scrub/xfs_scrub.c
@@ -380,6 +380,7 @@ run_scrub_phases(
},
{
.descr = _("Check directory tree."),
+ .fn = xfs_scan_connections,
},
{
.descr = _("Verify data file integrity."),
diff --git a/scrub/xfs_scrub.h b/scrub/xfs_scrub.h
index 462b590..fd7d7aa 100644
--- a/scrub/xfs_scrub.h
+++ b/scrub/xfs_scrub.h
@@ -97,5 +97,6 @@ bool xfs_cleanup_fs(struct scrub_ctx *ctx);
bool xfs_setup_fs(struct scrub_ctx *ctx);
bool xfs_scan_metadata(struct scrub_ctx *ctx);
bool xfs_scan_inodes(struct scrub_ctx *ctx);
+bool xfs_scan_connections(struct scrub_ctx *ctx);
#endif /* XFS_SCRUB_XFS_SCRUB_H_ */
next prev parent reply other threads:[~2018-01-31 3:08 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-31 3:06 [PATCH v11.2 00/29] xfsprogs: online scrub/repair support Darrick J. Wong
2018-01-31 3:06 ` [PATCH 01/29] xfs_scrub: create online filesystem scrub program Darrick J. Wong
2018-01-31 3:06 ` [PATCH 02/29] xfs_scrub: common error handling Darrick J. Wong
2018-01-31 3:06 ` [PATCH 03/29] xfs_scrub: set up command line argument parsing Darrick J. Wong
2018-01-31 3:06 ` [PATCH 04/29] xfs_scrub: dispatch the various phases of the scrub program Darrick J. Wong
2018-01-31 3:07 ` [PATCH 05/29] xfs_scrub: figure out how many threads we're going to need Darrick J. Wong
2018-01-31 3:07 ` [PATCH 06/29] xfs_scrub: create an abstraction for a block device Darrick J. Wong
2018-01-31 3:07 ` [PATCH 07/29] xfs_scrub: find XFS filesystem geometry Darrick J. Wong
2018-01-31 3:07 ` [PATCH 08/29] xfs_scrub: add inode iteration functions Darrick J. Wong
2018-01-31 3:07 ` [PATCH 09/29] xfs_scrub: add space map " Darrick J. Wong
2018-01-31 3:07 ` [PATCH 10/29] xfs_scrub: add file " Darrick J. Wong
2018-01-31 3:07 ` [PATCH 11/29] xfs_scrub: filesystem counter collection functions Darrick J. Wong
2018-01-31 3:07 ` [PATCH 12/29] xfs_scrub: wrap the scrub ioctl Darrick J. Wong
2018-01-31 3:07 ` [PATCH 13/29] xfs_scrub: scan filesystem and AG metadata Darrick J. Wong
2018-01-31 3:08 ` [PATCH 14/29] xfs_scrub: thread-safe stats counter Darrick J. Wong
2018-01-31 3:08 ` [PATCH 15/29] xfs_scrub: scan inodes Darrick J. Wong
2018-01-31 3:08 ` Darrick J. Wong [this message]
2018-01-31 3:08 ` [PATCH 17/29] xfs_scrub: warn about suspicious characters in directory/xattr names Darrick J. Wong
2018-01-31 3:08 ` [PATCH 18/29] xfs_scrub: warn about normalized Unicode name collisions Darrick J. Wong
2018-01-31 3:08 ` [PATCH 19/29] xfs_scrub: create a bitmap data structure Darrick J. Wong
2018-01-31 3:08 ` [PATCH 20/29] xfs_scrub: create infrastructure to read verify data blocks Darrick J. Wong
2018-01-31 3:08 ` [PATCH 21/29] xfs_scrub: scrub file " Darrick J. Wong
2018-01-31 3:09 ` [PATCH 22/29] xfs_scrub: optionally use SCSI READ VERIFY commands to scrub data blocks on disk Darrick J. Wong
2018-01-31 3:09 ` [PATCH 23/29] xfs_scrub: check summary counters Darrick J. Wong
2018-01-31 3:09 ` [PATCH 24/29] xfs_scrub: fstrim the free areas if there are no errors on the filesystem Darrick J. Wong
2018-01-31 3:09 ` [PATCH 25/29] xfs_scrub: progress indicator Darrick J. Wong
2018-01-31 3:09 ` [PATCH 26/29] xfs_scrub: create a script to scrub all xfs filesystems Darrick J. Wong
2018-01-31 6:40 ` [PATCH v2 " Darrick J. Wong
2018-01-31 3:09 ` [PATCH 27/29] xfs_scrub: integrate services with systemd Darrick J. Wong
2018-01-31 6:41 ` [PATCH v2 " Darrick J. Wong
2018-01-31 20:30 ` Eric Sandeen
2018-01-31 20:52 ` Darrick J. Wong
2018-01-31 20:54 ` [PATCH v3 " Darrick J. Wong
2018-01-31 3:09 ` [PATCH 28/29] xfs_scrub: wire up repair ioctl Darrick J. Wong
2018-01-31 3:09 ` [PATCH 29/29] xfs_scrub: schedule and manage optimizations/repairs to the filesystem Darrick J. Wong
2018-01-31 17:30 ` [PATCH 30/29] debian/control: remove nonexistent libreadline5-dev build dependency Darrick J. Wong
2018-02-01 20:33 ` [PATCH 31/29] xfs_scrub: handle scrub-only kernels more helpfully Eric Sandeen
2018-02-01 21:11 ` Darrick J. Wong
2018-02-01 21:46 ` [PATCH 31/29 v2] " Eric Sandeen
2018-02-01 21:49 ` Bill O'Donnell
2018-02-01 22:17 ` Darrick J. Wong
-- strict thread matches above, loose matches on Subject: below --
2018-01-17 22:01 [PATCH v11.1 00/29] xfsprogs: online scrub/repair support Darrick J. Wong
2018-01-17 22:03 ` [PATCH 16/29] xfs_scrub: check directory connectivity 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=151736809355.32164.8484573700904559592.stgit@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;
as well as URLs for NNTP newsgroup(s).