From patchwork Sat Jan 6 01:53:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 10147497 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D345C60134 for ; Sat, 6 Jan 2018 01:53:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 56FEB28997 for ; Sat, 6 Jan 2018 01:53:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4C146289B9; Sat, 6 Jan 2018 01:53:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CB97628997 for ; Sat, 6 Jan 2018 01:53:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753494AbeAFBxL (ORCPT ); Fri, 5 Jan 2018 20:53:11 -0500 Received: from aserp2130.oracle.com ([141.146.126.79]:43102 "EHLO aserp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753411AbeAFBxK (ORCPT ); Fri, 5 Jan 2018 20:53:10 -0500 Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.21/8.16.0.21) with SMTP id w061qJjP016133; Sat, 6 Jan 2018 01:53:08 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2017-10-26; bh=flTKGdo6h0Sm5vhgm3olkAYXSofpL7GUo1IAbWrNLAQ=; b=bYv4KbRM/79Io5fzDyr0syg3b3ne8XhFgbQjFbEhjyl8SxH9m2z/1+v+Rr0onPDnit3h B4sDq67SQGmeJsE5P4Gwqz7qEFX8zTlo5KaYvdEENlAzVpozzlCZEJOkq4uM1IBiIrTS 1q9Qgl+BP8SOIzSwvlBoI34mrGensfKYcTsBZHRFzajdMULHJWGFtzI+CTKybxdxE3BZ iFAEmF9QhraMTj92RHDux1W50etWpgDU6F5FOrDlBJyzxSsIqlBDFDCt3ftNNr8Phzfc e2tUlLybAs6wZI1axo4vVwFFbr8NDYwDXWQWXPoeUUNJIkOkZ0oUBBuK877V3kU9qSEL Vg== Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp2130.oracle.com with ESMTP id 2fam6ar2vb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 06 Jan 2018 01:53:08 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w061r7eo010108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 6 Jan 2018 01:53:07 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w061r7hg013046; Sat, 6 Jan 2018 01:53:07 GMT Received: from localhost (/65.154.186.210) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 05 Jan 2018 17:53:07 -0800 Subject: [PATCH 16/27] xfs_scrub: check directory connectivity From: "Darrick J. Wong" To: sandeen@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org Date: Fri, 05 Jan 2018 17:53:06 -0800 Message-ID: <151520358640.2027.7884761399254522940.stgit@magnolia> In-Reply-To: <151520348769.2027.9860697266310422360.stgit@magnolia> References: <151520348769.2027.9860697266310422360.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8765 signatures=668651 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1801060020 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Darrick J. Wong 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 --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html 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 + * + * 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 +#include +#include +#include +#include +#include +#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 5bde6cf..64517f4 100644 --- a/scrub/xfs_scrub.c +++ b/scrub/xfs_scrub.c @@ -365,6 +365,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 41d471b..c9f53d8 100644 --- a/scrub/xfs_scrub.h +++ b/scrub/xfs_scrub.h @@ -100,5 +100,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_ */