From patchwork Thu Aug 25 23:40:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 9300377 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 E99B460757 for ; Thu, 25 Aug 2016 23:41:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DAE4129354 for ; Thu, 25 Aug 2016 23:41:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CF7C2293CD; Thu, 25 Aug 2016 23:41:40 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from oss.sgi.com (oss.sgi.com [192.48.182.195]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 42A6A29354 for ; Thu, 25 Aug 2016 23:41:40 +0000 (UTC) Received: from oss.sgi.com (localhost [IPv6:::1]) by oss.sgi.com (Postfix) with ESMTP id 5A8047F00; Thu, 25 Aug 2016 18:41:04 -0500 (CDT) X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10C817EFD for ; Thu, 25 Aug 2016 18:41:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D84928F8033 for ; Thu, 25 Aug 2016 16:41:02 -0700 (PDT) X-ASG-Debug-ID: 1472168460-0bf57c55b21c7ab0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FiFCz6dALNEUpJak (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNexAt017372 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNexh5027944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:59 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNewZf030434; Thu, 25 Aug 2016 23:40:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:58 -0700 Subject: [PATCH 07/25] xfs: create an ioctl to scrub AG metadata From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/25] xfs: create an ioctl to scrub AG metadata To: david@fromorbit.com, darrick.wong@oracle.com Date: Thu, 25 Aug 2016 16:40:57 -0700 Message-ID: <147216845703.3108.9850206520479318952.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168460 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4333 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com X-BeenThere: xfs@oss.sgi.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: XFS Filesystem from SGI List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: xfs-bounces@oss.sgi.com Sender: xfs-bounces@oss.sgi.com X-Virus-Scanned: ClamAV using ClamSMTP Create an ioctl that can be used to scrub internal filesystem metadata. The new ioctl takes the metadata type, an (optional) AG number, and a flags argument. This will be used by the upcoming XFS online scrub tool. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 16 ++++++++++++++++ fs/xfs/xfs_ioctl.c | 20 ++++++++++++++++++++ fs/xfs/xfs_scrub.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_scrub.h | 2 +- 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 58e14b14e..22559ab 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -524,6 +524,21 @@ typedef struct xfs_swapext #define XFS_FSOP_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */ #define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */ +/* metadata scrubbing */ +struct xfs_scrub_metadata { + __u32 type; /* What to check? */ + __u32 flags; /* Flags; none defined right now. */ + __u64 control; /* AG or inode number */ + __u64 reserved[6]; /* Must be zero. */ +}; + +/* + * Metadata types and flags for scrub operation. + */ +#define XFS_SCRUB_TYPE_MAX 0 + +#define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ + /* * ioctl limits */ @@ -567,6 +582,7 @@ typedef struct xfs_swapext #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) #define XFS_IOC_GETFSMAP _IOWR('X', 59, struct getfsmap) +#define XFS_IOC_SCRUB_METADATA _IOR ('X', 60, struct xfs_scrub_metadata) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 936cb45..65f0c03 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -44,6 +44,7 @@ #include "xfs_reflink.h" #include "xfs_btree.h" #include "xfs_fsmap.h" +#include "xfs_scrub.h" #include #include @@ -1686,6 +1687,22 @@ xfs_ioc_getfsmap( return 0; } +STATIC int +xfs_ioc_scrub_metadata( + struct xfs_inode *ip, + void __user *arg) +{ + struct xfs_scrub_metadata scrub; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user(&scrub, arg, sizeof(scrub))) + return -EFAULT; + + return xfs_scrub_metadata(ip, &scrub); +} + int xfs_ioc_swapext( xfs_swapext_t *sxp) @@ -1871,6 +1888,9 @@ xfs_file_ioctl( return -EPERM; return xfs_ioc_getfsmap(ip, arg); + case XFS_IOC_SCRUB_METADATA: + return xfs_ioc_scrub_metadata(ip, arg); + case XFS_IOC_FD_TO_HANDLE: case XFS_IOC_PATH_TO_HANDLE: case XFS_IOC_PATH_TO_FSHANDLE: { diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 13bea55..fd24af7 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -703,3 +703,47 @@ out: out_badcursor: return error; } + +/* Scrubbing dispatch. */ + +struct xfs_scrub_meta_fns { + int (*scrub_fn)(struct xfs_inode *, struct xfs_scrub_metadata *); + bool (*has_fn)(struct xfs_sb *); +}; + +static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { +}; + +/* Dispatch metadata scrubbing. */ +int +xfs_scrub_metadata( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + const struct xfs_scrub_meta_fns *fns; + int i; + int error = 0; + + trace_xfs_scrub(ip, sm->type, sm->control, sm->flags, error); + + error = -EINVAL; + for (i = 0; i < ARRAY_SIZE(sm->reserved); i++) + if (sm->reserved[i]) + goto out; + if (sm->type > XFS_SCRUB_TYPE_MAX) + goto out; + if (sm->flags & ~XFS_SCRUB_FLAGS_ALL) + goto out; + + fns = &meta_scrub_fns[sm->type]; + if (fns->has_fn && !fns->has_fn(&mp->m_sb)) { + error = -ENOENT; + goto out; + } + error = fns->scrub_fn(ip, sm); + +out: + trace_xfs_scrub_done(ip, sm->type, sm->control, sm->flags, error); + return error; +} diff --git a/fs/xfs/xfs_scrub.h b/fs/xfs/xfs_scrub.h index 474df7e..f4bb021 100644 --- a/fs/xfs/xfs_scrub.h +++ b/fs/xfs/xfs_scrub.h @@ -20,6 +20,6 @@ #ifndef __XFS_SCRUB_H__ #define __XFS_SCRUB_H__ -/* Functions to come later. */ +int xfs_scrub_metadata(struct xfs_inode *ip, struct xfs_scrub_metadata *sm); #endif /* __XFS_SCRUB_H__ */