From patchwork Thu Aug 25 23:45:13 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: 9300447 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 8071660757 for ; Thu, 25 Aug 2016 23:46:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 70F682939E for ; Thu, 25 Aug 2016 23:46:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 65C86293A6; Thu, 25 Aug 2016 23:46:22 +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 EDCA52939E for ; Thu, 25 Aug 2016 23:46:21 +0000 (UTC) Received: from oss.sgi.com (localhost [IPv6:::1]) by oss.sgi.com (Postfix) with ESMTP id EDD0A8063; Thu, 25 Aug 2016 18:45:21 -0500 (CDT) X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 471F28061 for ; Thu, 25 Aug 2016 18:45:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18073304039 for ; Thu, 25 Aug 2016 16:45:20 -0700 (PDT) X-ASG-Debug-ID: 1472168717-0bf57c55b41c7cf0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id b2DusGrEfdHBjPPa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:17 -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 aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNjGdT021000 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:45:16 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNjGpB018825 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:16 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNjFVj032483; Thu, 25 Aug 2016 23:45:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:15 -0700 Subject: [PATCH 17/20] xfs: wire up getfsmap to the realtime reverse mapping btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/20] xfs: wire up getfsmap to the realtime reverse mapping btree To: david@fromorbit.com, darrick.wong@oracle.com Date: Thu, 25 Aug 2016 16:45:13 -0700 Message-ID: <147216871382.3688.13083744368929762457.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168717 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: 3671 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 Connect the getfsmap ioctl to the realtime rmapbt. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_fsmap.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c index 1c5ce01..a816955 100644 --- a/fs/xfs/xfs_fsmap.c +++ b/fs/xfs/xfs_fsmap.c @@ -41,6 +41,7 @@ #include "xfs_refcount_btree.h" #include "xfs_alloc_btree.h" #include "xfs_rtalloc.h" +#include "xfs_rtrmap_btree.h" /* getfsmap query state */ struct xfs_getfsmap_info { @@ -431,6 +432,81 @@ xfs_getfsmap_logdev( return xfs_getfsmap_rtdev_helper(&cur, &rmap, info); } +/* Execute a getfsmap query against the realtime data device. */ +STATIC int +xfs_getfsmap_rtdev( + struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info) +{ + struct xfs_btree_cur *bt_cur = NULL; + struct getfsmap *lowkey; + struct getfsmap *highkey; + xfs_fsblock_t start_fsb; + xfs_fsblock_t end_fsb; + xfs_daddr_t eofs; + int error = 0; + + lowkey = keys; + highkey = keys + 1; + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); + if (lowkey->fmv_block >= eofs) + return 0; + if (highkey->fmv_block >= eofs) + highkey->fmv_block = eofs - 1; + start_fsb = XFS_BB_TO_FSBT(mp, lowkey->fmv_block); + end_fsb = XFS_BB_TO_FSB(mp, highkey->fmv_block); + + /* Set up search keys */ + info->low.rm_startblock = start_fsb; + info->low.rm_owner = lowkey->fmv_owner; + info->low.rm_offset = XFS_BB_TO_FSBT(mp, lowkey->fmv_offset); + info->low.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->low, lowkey); + + info->high.rm_startblock = end_fsb; + info->high.rm_owner = highkey->fmv_owner; + info->high.rm_offset = XFS_BB_TO_FSBT(mp, highkey->fmv_offset); + info->high.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->high, highkey); + + info->missing_owner = FMV_OWN_FREE; + + trace_xfs_fsmap_low_key(mp, info->dev, info->agno, + info->low.rm_startblock, + info->low.rm_blockcount, + info->low.rm_owner, + info->low.rm_offset); + + trace_xfs_fsmap_high_key(mp, info->dev, info->agno, + info->high.rm_startblock, + info->high.rm_blockcount, + info->high.rm_owner, + info->high.rm_offset); + + /* Query the rtrmapbt */ + xfs_ilock(mp->m_rrmapip, XFS_ILOCK_EXCL); + bt_cur = xfs_rtrmapbt_init_cursor(mp, NULL, mp->m_rrmapip); + + error = xfs_rmap_query_range(bt_cur, &info->low, &info->high, + xfs_getfsmap_rtdev_helper, info); + if (error) + goto err; + + /* Report any free space at the end of the rtdev */ + info->last = true; + error = xfs_getfsmap_rtdev_helper(bt_cur, &info->high, info); + if (error) + goto err; + +err: + xfs_btree_del_cursor(bt_cur, error < 0 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + xfs_iunlock(mp->m_rrmapip, XFS_ILOCK_EXCL); + + return error; +} + /* Execute a getfsmap query against the realtime data device (rtbitmap). */ STATIC int xfs_getfsmap_rtdev_rtbitmap( @@ -769,6 +845,9 @@ xfs_getfsmap_is_valid_device( if (mp->m_logdev_targp && fmv->fmv_device == new_encode_dev(mp->m_logdev_targp->bt_dev)) return true; + if (mp->m_rtdev_targp && + fmv->fmv_device == new_encode_dev(mp->m_rtdev_targp->bt_dev)) + return true; return false; } @@ -824,6 +903,8 @@ xfs_getfsmap( handlers[2].dev = new_encode_dev(mp->m_rtdev_targp->bt_dev); if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) handlers[2].fn = xfs_getfsmap_rtdev_rtbitmap; + else + handlers[2].fn = xfs_getfsmap_rtdev; } xfs_sort(handlers, XFS_GETFSMAP_DEVS, sizeof(struct xfs_getfsmap_dev),