From patchwork Fri Aug 26 00:01:45 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: 9300707 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 58249607D8 for ; Fri, 26 Aug 2016 00:02:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 47B5929298 for ; Fri, 26 Aug 2016 00:02:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3AAC8292AB; Fri, 26 Aug 2016 00:02:13 +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 C824A29298 for ; Fri, 26 Aug 2016 00:02:11 +0000 (UTC) Received: from oss.sgi.com (localhost [IPv6:::1]) by oss.sgi.com (Postfix) with ESMTP id 583D084B3; Thu, 25 Aug 2016 19:01:55 -0500 (CDT) X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4F04184A9 for ; Thu, 25 Aug 2016 19:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B54C4AC001 for ; Thu, 25 Aug 2016 17:01:52 -0700 (PDT) X-ASG-Debug-ID: 1472169710-0bf57b531320a030001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id dbwCWoBYrYFMvXWN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01m3W008037 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:01:49 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q01m16026657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:48 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01lTQ006388; Fri, 26 Aug 2016 00:01:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:47 -0700 Subject: [PATCH 29/29] mkfs: create the realtime rmap inode From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 29/29] mkfs: create the realtime rmap inode To: david@fromorbit.com, darrick.wong@oracle.com Date: Thu, 25 Aug 2016 17:01:45 -0700 Message-ID: <147216970577.7022.917857374242640355.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169710 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4004 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 a realtime rmapbt inode if we format the fs with realtime and rmap. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 1 + mkfs/proto.c | 51 +++++++++++++++++++++++++++++++--------------- mkfs/xfs_mkfs.c | 19 +++++++++++------ 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 44b9065..e567076 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -145,5 +145,6 @@ #define xfs_rtrmapbt_maxrecs libxfs_rtrmapbt_maxrecs #define xfs_rtrmapbt_init_cursor libxfs_rtrmapbt_init_cursor #define xfs_rmap_map_extent libxfs_rmap_map_extent +#define xfs_btree_compute_maxlevels libxfs_btree_compute_maxlevels #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/mkfs/proto.c b/mkfs/proto.c index 1de77f8..bf31483 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -626,24 +626,25 @@ parse_proto( */ static void rtinit( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_fileoff_t bno; - xfs_fileoff_t ebno; - xfs_bmbt_irec_t *ep; - int error; - xfs_fsblock_t first; + xfs_fileoff_t bno; + xfs_fileoff_t ebno; + struct xfs_bmbt_irec *ep; + int error; + xfs_fsblock_t first; struct xfs_defer_ops dfops; - int i; - xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; - xfs_extlen_t nsumblocks; - int nmap; - xfs_inode_t *rbmip; - xfs_inode_t *rsumip; - xfs_trans_t *tp; - struct cred creds; - struct fsxattr fsxattrs; - struct xfs_trans_res tres = {0}; + int i; + struct xfs_bmbt_irec map[XFS_BMAP_MAX_NMAP]; + xfs_extlen_t nsumblocks; + int nmap; + struct xfs_inode *rbmip; + struct xfs_inode *rsumip; + struct xfs_inode *rrmapip; + struct xfs_trans *tp; + struct cred creds; + struct fsxattr fsxattrs; + struct xfs_trans_res tres = {0}; /* * First, allocate the inodes. @@ -680,8 +681,24 @@ rtinit( rsumip->i_d.di_size = mp->m_rsumsize; libxfs_trans_log_inode(tp, rsumip, XFS_ILOG_CORE); libxfs_log_sb(tp); - libxfs_trans_commit(tp); mp->m_rsumip = rsumip; + + /* If we have rmap and a realtime device, create a rtrmapbt inode. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && mp->m_sb.sb_rblocks > 0) { + error = -libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, + &creds, &fsxattrs, &rrmapip); + if (error) { + fail(_("Realtime rmap inode allocation failed"), error); + } + mp->m_sb.sb_rrmapino = rrmapip->i_ino; + rrmapip->i_d.di_size = 0; + rrmapip->i_d.di_format = XFS_DINODE_FMT_RMAP; + libxfs_trans_log_inode(tp, rrmapip, XFS_ILOG_CORE); + libxfs_log_sb(tp); + mp->m_rrmapip = rrmapip; + } + libxfs_trans_commit(tp); + /* * Next, give the bitmap file some zero-filled blocks. */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index fc565c0..e7bc044 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2141,13 +2141,6 @@ _("reflink not supported without CRC support\n")); } - if (sb_feat.rmapbt && xi.rtname) { - fprintf(stderr, -_("rmapbt not supported with realtime devices\n")); - usage(); - sb_feat.rmapbt = false; - } - if (nsflag || nlflag) { if (dirblocksize < blocksize || dirblocksize > XFS_MAX_BLOCKSIZE) { @@ -2908,6 +2901,18 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), exit(1); } + /* The realtime rmapbt mustn't grow taller than max btree height. */ + if (xfs_sb_version_hasrtrmapbt(&mp->m_sb) && + libxfs_btree_compute_maxlevels(mp, mp->m_rtrmap_mnr, + mp->m_sb.sb_rblocks) > XFS_BTREE_MAXLEVELS) { + fprintf(stderr, +_("%s: max realtime rmapbt height (%d) exceeds configured maximum (%d)\n"), + progname, libxfs_btree_compute_maxlevels(mp, + mp->m_rtrmap_mnr, mp->m_sb.sb_rblocks), + XFS_BTREE_MAXLEVELS); + exit(1); + } + /* * XXX: this code is effectively shared with the kernel growfs code. * These initialisations should be pulled into libxfs to keep the