All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 7/9] xfs: have getfsmap fall back to the freesp btrees when rmap is not present
Date: Wed, 1 Mar 2017 12:59:20 -0500	[thread overview]
Message-ID: <20170301175920.GC3312@bfoster.bfoster> (raw)
In-Reply-To: <148830759554.22089.6408995371724685885.stgit@birch.djwong.org>

On Tue, Feb 28, 2017 at 10:46:35AM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> If the reverse-mapping btree isn't available, fall back to the
> free space btrees to provide partial reverse mapping information.
> The online scrub tool can make use of even partial information to
> speed up the data block scan.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  fs/xfs/xfs_fsmap.c |   81 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 78 insertions(+), 3 deletions(-)
> 
> 
> diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c
> index 2d0fa2a..56bbd24 100644
> --- a/fs/xfs/xfs_fsmap.c
> +++ b/fs/xfs/xfs_fsmap.c
> @@ -40,6 +40,7 @@
>  #include "xfs_fsmap.h"
>  #include "xfs_refcount.h"
>  #include "xfs_refcount_btree.h"
> +#include "xfs_alloc_btree.h"
>  
>  /* Convert an xfs_fsmap to an fsmap. */
>  void
> @@ -158,6 +159,9 @@ xfs_fsmap_owner_from_rmap(
>  	case XFS_RMAP_OWN_COW:
>  		dest->fmr_owner = XFS_FMR_OWN_COW;
>  		break;
> +	case XFS_RMAP_OWN_NULL:	/* "free" */
> +		dest->fmr_owner = XFS_FMR_OWN_FREE;
> +		break;
>  	default:
>  		return -EFSCORRUPTED;
>  	}
> @@ -411,6 +415,31 @@ xfs_getfsmap_rtdev_helper(
>  	return xfs_getfsmap_helper(cur->bc_tp, info, rec, rec_daddr);
>  }
>  
> +/* Transform a bnobt irec into a fsmap */
> +STATIC int
> +xfs_getfsmap_datadev_bnobt_helper(
> +	struct xfs_btree_cur		*cur,
> +	struct xfs_alloc_rec_incore	*rec,
> +	void				*priv)
> +{
> +	struct xfs_mount		*mp = cur->bc_mp;
> +	struct xfs_getfsmap_info	*info = priv;
> +	struct xfs_rmap_irec		irec;
> +	xfs_fsblock_t			fsb;
> +	xfs_daddr_t			rec_daddr;
> +
> +	fsb = XFS_AGB_TO_FSB(mp, cur->bc_private.a.agno, rec->ar_startblock);
> +	rec_daddr = XFS_FSB_TO_DADDR(mp, fsb);
> +

XFS_AGB_TO_DADDR()?

> +	irec.rm_startblock = rec->ar_startblock;
> +	irec.rm_blockcount = rec->ar_blockcount;
> +	irec.rm_owner = XFS_RMAP_OWN_NULL;	/* "free" */
> +	irec.rm_offset = 0;
> +	irec.rm_flags = 0;
> +
> +	return xfs_getfsmap_helper(cur->bc_tp, info, &irec, rec_daddr);
> +}
> +
>  /* Set rmap flags based on the getfsmap flags */
>  static void
>  xfs_getfsmap_set_irec_flags(
> @@ -633,6 +662,51 @@ xfs_getfsmap_datadev_rmapbt(
>  			xfs_getfsmap_datadev_rmapbt_end, NULL);
>  }
>  
> +/* Report any gap at the end of bnobt records. */
> +STATIC int
> +xfs_getfsmap_datadev_bnobt_end(
> +	struct xfs_btree_cur		*cur,
> +	struct xfs_getfsmap_info	*info,
> +	void				*priv)
> +{
> +	struct xfs_alloc_rec_incore	*key = priv;
> +
> +	return xfs_getfsmap_datadev_bnobt_helper(cur, key + 1, info);

Nit: please use key[1] (or maybe call it keys to be clear) here and
below rather than pointer arithmetic.

Looks good aside from those couple nits and modulo the separate
_query()/_end() callbacks thing.

Brian

> +}
> +
> +/* Actually query the bno btree. */
> +STATIC int
> +xfs_getfsmap_datadev_bnobt_query(
> +	struct xfs_trans		*tp,
> +	struct xfs_getfsmap_info	*info,
> +	struct xfs_btree_cur		**curpp,
> +	void				*priv)
> +{
> +	struct xfs_alloc_rec_incore	*key = priv;
> +
> +	*curpp = xfs_allocbt_init_cursor(tp->t_mountp, tp, info->agf_bp,
> +			info->agno, XFS_BTNUM_BNO);
> +	key->ar_startblock = info->low.rm_startblock;
> +	(key + 1)->ar_startblock = info->high.rm_startblock;
> +	return xfs_alloc_query_range(*curpp, key, key + 1,
> +			xfs_getfsmap_datadev_bnobt_helper, info);
> +}
> +
> +/* Execute a getfsmap query against the regular data device's bnobt. */
> +STATIC int
> +xfs_getfsmap_datadev_bnobt(
> +	struct xfs_trans		*tp,
> +	struct xfs_fsmap		*keys,
> +	struct xfs_getfsmap_info	*info)
> +{
> +	struct xfs_alloc_rec_incore	akeys[2];
> +
> +	info->missing_owner = XFS_FMR_OWN_UNKNOWN;
> +	return __xfs_getfsmap_datadev(tp, keys, info,
> +			xfs_getfsmap_datadev_bnobt_query,
> +			xfs_getfsmap_datadev_bnobt_end, &akeys[0]);
> +}
> +
>  /* Do we recognize the device? */
>  STATIC bool
>  xfs_getfsmap_is_valid_device(
> @@ -714,8 +788,6 @@ xfs_getfsmap(
>  	int				i;
>  	int				error = 0;
>  
> -	if (!xfs_sb_version_hasrmapbt(&mp->m_sb))
> -		return -EOPNOTSUPP;
>  	if (head->fmh_iflags & ~FMH_IF_VALID)
>  		return -EINVAL;
>  	if (!xfs_getfsmap_is_valid_device(mp, &head->fmh_keys[0]) ||
> @@ -727,7 +799,10 @@ xfs_getfsmap(
>  	/* Set up our device handlers. */
>  	memset(handlers, 0, sizeof(handlers));
>  	handlers[0].dev = new_encode_dev(mp->m_ddev_targp->bt_dev);
> -	handlers[0].fn = xfs_getfsmap_datadev_rmapbt;
> +	if (xfs_sb_version_hasrmapbt(&mp->m_sb))
> +		handlers[0].fn = xfs_getfsmap_datadev_rmapbt;
> +	else
> +		handlers[0].fn = xfs_getfsmap_datadev_bnobt;
>  	if (mp->m_logdev_targp != mp->m_ddev_targp) {
>  		handlers[1].dev = new_encode_dev(mp->m_logdev_targp->bt_dev);
>  		handlers[1].fn = xfs_getfsmap_logdev;
> 
> --
> 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

  reply	other threads:[~2017-03-01 17:49 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-28 18:45 [RFC PATCH v7 0/9] vfs/xfs/ext4: GETFSMAP support Darrick J. Wong
2017-02-28 18:45 ` [PATCH 1/9] vfs: add common GETFSMAP ioctl definitions Darrick J. Wong
2017-02-28 18:46 ` [PATCH 2/9] xfs: plumb in needed functions for range querying of the freespace btrees Darrick J. Wong
2017-02-28 18:46 ` [PATCH 3/9] xfs: provide a query_range function for " Darrick J. Wong
2017-02-28 18:46 ` [PATCH 4/9] xfs: create a function to query all records in a btree Darrick J. Wong
2017-02-28 18:46 ` [PATCH 5/9] xfs: add a couple of queries to iterate free extents in the rtbitmap Darrick J. Wong
2017-03-01 16:56   ` Brian Foster
2017-02-28 18:46 ` [PATCH 6/9] xfs: implement the GETFSMAP ioctl Darrick J. Wong
2017-03-01 16:57   ` Brian Foster
2017-03-01 18:45     ` Darrick J. Wong
2017-03-02  2:29   ` [PATCH v2 " Darrick J. Wong
2017-03-02 15:59     ` Brian Foster
2017-02-28 18:46 ` [PATCH 7/9] xfs: have getfsmap fall back to the freesp btrees when rmap is not present Darrick J. Wong
2017-03-01 17:59   ` Brian Foster [this message]
2017-03-01 18:46     ` Darrick J. Wong
2017-03-02  2:29   ` [PATCH v2 " Darrick J. Wong
2017-03-02 15:59     ` Brian Foster
2017-02-28 18:46 ` [PATCH 8/9] xfs: report realtime space information via the rtbitmap Darrick J. Wong
2017-03-01 17:59   ` Brian Foster
2017-02-28 18:46 ` [PATCH 9/9] ext4: support GETFSMAP ioctls Darrick J. Wong
2017-03-01  2:22   ` Andreas Dilger
2017-03-01 20:41     ` Darrick J. Wong
2017-03-02  2:30   ` [PATCH v2 " Darrick J. Wong
  -- strict thread matches above, loose matches on Subject: below --
2017-03-30 15:57 [PATCH v8 0/9] vfs/xfs/ext4: GETFSMAP support Darrick J. Wong
     [not found] ` <149088947516.25895.12489128187852930801.stgit-PTl6brltDGh4DFYR7WNSRA@public.gmane.org>
2017-03-30 15:58   ` [PATCH 7/9] xfs: have getfsmap fall back to the freesp btrees when rmap is not present Darrick J. Wong
2017-03-30 15:58     ` 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=20170301175920.GC3312@bfoster.bfoster \
    --to=bfoster@redhat.com \
    --cc=darrick.wong@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.