From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 2/5] xfs: remove xfs_rmap_ag_owner and friends
Date: Tue, 20 Nov 2018 08:30:09 -0800 [thread overview]
Message-ID: <20181120163009.GB6792@magnolia> (raw)
In-Reply-To: <20181120162008.GB48509@bfoster>
On Tue, Nov 20, 2018 at 11:20:09AM -0500, Brian Foster wrote:
> On Thu, Nov 08, 2018 at 03:20:13PM -0800, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> >
> > Owner information for static fs metadata can be defined readonly at
> > build time because it never changes across filesystems. This enables us
> > to reduce stack usage (particularly in scrub) because we can use the
> > statically defined oinfo structures.
> >
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
> > fs/xfs/libxfs/xfs_ag.c | 9 ++++-----
> > fs/xfs/libxfs/xfs_alloc.c | 8 +++-----
> > fs/xfs/libxfs/xfs_bmap.c | 4 ++--
> > fs/xfs/libxfs/xfs_ialloc.c | 8 +++-----
> > fs/xfs/libxfs/xfs_ialloc_btree.c | 7 ++-----
> > fs/xfs/libxfs/xfs_refcount_btree.c | 6 ++----
> > fs/xfs/libxfs/xfs_rmap.c | 28 ++++++++++++++++++++++++++++
> > fs/xfs/libxfs/xfs_rmap.h | 34 ++++++++++------------------------
> > fs/xfs/scrub/agheader.c | 25 +++++++------------------
> > fs/xfs/scrub/agheader_repair.c | 5 ++---
> > fs/xfs/scrub/alloc.c | 4 +---
> > fs/xfs/scrub/ialloc.c | 28 +++++++++-------------------
> > fs/xfs/scrub/inode.c | 4 +---
> > fs/xfs/scrub/refcount.c | 15 +++++----------
> > fs/xfs/scrub/repair.c | 4 +---
> > fs/xfs/scrub/rmap.c | 5 +----
> > fs/xfs/xfs_extfree_item.c | 5 ++---
> > 17 files changed, 83 insertions(+), 116 deletions(-)
> >
> >
> ...
> > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c
> > index bce46fa0ee38..0f5e10a0c024 100644
> > --- a/fs/xfs/libxfs/xfs_alloc.c
> > +++ b/fs/xfs/libxfs/xfs_alloc.c
> > @@ -1594,7 +1594,6 @@ xfs_alloc_ag_vextent_small(
> > xfs_extlen_t *flenp, /* result length */
> > int *stat) /* status: 0-freelist, 1-normal/none */
> > {
> > - struct xfs_owner_info oinfo;
> > int error;
> > xfs_agblock_t fbno;
> > xfs_extlen_t flen;
> > @@ -1648,9 +1647,8 @@ xfs_alloc_ag_vextent_small(
> > * doesn't live in the free space, we need to clear
> > * out the OWN_AG rmap.
> > */
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG);
> > error = xfs_rmap_free(args->tp, args->agbp, args->agno,
> > - fbno, 1, &oinfo);
> > + fbno, 1, &XFS_RMAP_OINFO_AG);
> > if (error)
> > goto error0;
> >
> > @@ -2315,9 +2313,9 @@ xfs_alloc_fix_freelist(
> > */
> > memset(&targs, 0, sizeof(targs));
> > if (flags & XFS_ALLOC_FLAG_NORMAP)
> > - xfs_rmap_skip_owner_update(&targs.oinfo);
> > + targs.oinfo = XFS_RMAP_OINFO_SKIP_UPDATE;
> > else
> > - xfs_rmap_ag_owner(&targs.oinfo, XFS_RMAP_OWN_AG);
> > + targs.oinfo = XFS_RMAP_OINFO_AG;
>
> Hmm, so these are actually struct copies. The broader changes to use the
> global directly seem fine, but it's kind of unfortunate how close these
> assignment patterns look to some kind of direct value assignment at a
> glance, particularly with the macro looking name.
I'll add a comment /* struct copy */ to this.
> > while (!(flags & XFS_ALLOC_FLAG_NOSHRINK) && pag->pagf_flcount > need) {
> > error = xfs_alloc_get_freelist(tp, agbp, &bno, 0);
> > if (error)
> ...
> > diff --git a/fs/xfs/scrub/agheader.c b/fs/xfs/scrub/agheader.c
> > index 3068a9382feb..90955ab1e895 100644
> > --- a/fs/xfs/scrub/agheader.c
> > +++ b/fs/xfs/scrub/agheader.c
> ...
> > @@ -638,7 +632,7 @@ xchk_agfl_block(
> > else
> > xchk_block_set_corrupt(sc, sc->sa.agfl_bp);
> >
> > - xchk_agfl_block_xref(sc, agbno, priv);
> > + xchk_agfl_block_xref(sc, agbno);
>
> Heh, I'm not sure if that was an intentional hack or happy accident, but
> this looks like it removes a bit of a landmine by passing the void
> pointer to the struct xchk_agfl_info directly as the oinfo. :P
Yep, I'm glad this weird code can go away. :)
--D
> Brian
>
> >
> > if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
> > return XFS_BTREE_QUERY_RANGE_ABORT;
> > @@ -662,7 +656,6 @@ STATIC void
> > xchk_agfl_xref(
> > struct xfs_scrub *sc)
> > {
> > - struct xfs_owner_info oinfo;
> > struct xfs_mount *mp = sc->mp;
> > xfs_agblock_t agbno;
> > int error;
> > @@ -678,8 +671,7 @@ xchk_agfl_xref(
> >
> > xchk_xref_is_used_space(sc, agbno, 1);
> > xchk_xref_is_not_inode_chunk(sc, agbno, 1);
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_FS);
> > - xchk_xref_is_owned_by(sc, agbno, 1, &oinfo);
> > + xchk_xref_is_owned_by(sc, agbno, 1, &XFS_RMAP_OINFO_FS);
> > xchk_xref_is_not_shared(sc, agbno, 1);
> >
> > /*
> > @@ -732,7 +724,6 @@ xchk_agfl(
> > }
> >
> > /* Check the blocks in the AGFL. */
> > - xfs_rmap_ag_owner(&sai.oinfo, XFS_RMAP_OWN_AG);
> > error = xfs_agfl_walk(sc->mp, XFS_BUF_TO_AGF(sc->sa.agf_bp),
> > sc->sa.agfl_bp, xchk_agfl_block, &sai);
> > if (error == XFS_BTREE_QUERY_RANGE_ABORT) {
> > @@ -791,7 +782,6 @@ STATIC void
> > xchk_agi_xref(
> > struct xfs_scrub *sc)
> > {
> > - struct xfs_owner_info oinfo;
> > struct xfs_mount *mp = sc->mp;
> > xfs_agblock_t agbno;
> > int error;
> > @@ -808,8 +798,7 @@ xchk_agi_xref(
> > xchk_xref_is_used_space(sc, agbno, 1);
> > xchk_xref_is_not_inode_chunk(sc, agbno, 1);
> > xchk_agi_xref_icounts(sc);
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_FS);
> > - xchk_xref_is_owned_by(sc, agbno, 1, &oinfo);
> > + xchk_xref_is_owned_by(sc, agbno, 1, &XFS_RMAP_OINFO_FS);
> > xchk_xref_is_not_shared(sc, agbno, 1);
> >
> > /* scrub teardown will take care of sc->sa for us */
> > diff --git a/fs/xfs/scrub/agheader_repair.c b/fs/xfs/scrub/agheader_repair.c
> > index f7568a4b5fe5..03d1e15cceba 100644
> > --- a/fs/xfs/scrub/agheader_repair.c
> > +++ b/fs/xfs/scrub/agheader_repair.c
> > @@ -646,7 +646,6 @@ int
> > xrep_agfl(
> > struct xfs_scrub *sc)
> > {
> > - struct xfs_owner_info oinfo;
> > struct xfs_bitmap agfl_extents;
> > struct xfs_mount *mp = sc->mp;
> > struct xfs_buf *agf_bp;
> > @@ -708,8 +707,8 @@ xrep_agfl(
> > goto err;
> >
> > /* Dump any AGFL overflow. */
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG);
> > - return xrep_reap_extents(sc, &agfl_extents, &oinfo, XFS_AG_RESV_AGFL);
> > + return xrep_reap_extents(sc, &agfl_extents, &XFS_RMAP_OINFO_AG,
> > + XFS_AG_RESV_AGFL);
> > err:
> > xfs_bitmap_destroy(&agfl_extents);
> > return error;
> > diff --git a/fs/xfs/scrub/alloc.c b/fs/xfs/scrub/alloc.c
> > index 376bcb585ae6..44883e9112ad 100644
> > --- a/fs/xfs/scrub/alloc.c
> > +++ b/fs/xfs/scrub/alloc.c
> > @@ -125,12 +125,10 @@ xchk_allocbt(
> > struct xfs_scrub *sc,
> > xfs_btnum_t which)
> > {
> > - struct xfs_owner_info oinfo;
> > struct xfs_btree_cur *cur;
> >
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG);
> > cur = which == XFS_BTNUM_BNO ? sc->sa.bno_cur : sc->sa.cnt_cur;
> > - return xchk_btree(sc, cur, xchk_allocbt_rec, &oinfo, NULL);
> > + return xchk_btree(sc, cur, xchk_allocbt_rec, &XFS_RMAP_OINFO_AG, NULL);
> > }
> >
> > int
> > diff --git a/fs/xfs/scrub/ialloc.c b/fs/xfs/scrub/ialloc.c
> > index 224dba937492..72f45b298fa5 100644
> > --- a/fs/xfs/scrub/ialloc.c
> > +++ b/fs/xfs/scrub/ialloc.c
> > @@ -82,15 +82,12 @@ xchk_iallocbt_chunk_xref(
> > xfs_agblock_t agbno,
> > xfs_extlen_t len)
> > {
> > - struct xfs_owner_info oinfo;
> > -
> > if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
> > return;
> >
> > xchk_xref_is_used_space(sc, agbno, len);
> > xchk_iallocbt_chunk_xref_other(sc, irec, agino);
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INODES);
> > - xchk_xref_is_owned_by(sc, agbno, len, &oinfo);
> > + xchk_xref_is_owned_by(sc, agbno, len, &XFS_RMAP_OINFO_INODES);
> > xchk_xref_is_not_shared(sc, agbno, len);
> > }
> >
> > @@ -186,7 +183,6 @@ xchk_iallocbt_check_freemask(
> > struct xchk_btree *bs,
> > struct xfs_inobt_rec_incore *irec)
> > {
> > - struct xfs_owner_info oinfo;
> > struct xfs_imap imap;
> > struct xfs_mount *mp = bs->cur->bc_mp;
> > struct xfs_dinode *dip;
> > @@ -205,7 +201,6 @@ xchk_iallocbt_check_freemask(
> > /* Make sure the freemask matches the inode records. */
> > blks_per_cluster = xfs_icluster_size_fsb(mp);
> > nr_inodes = XFS_OFFBNO_TO_AGINO(mp, blks_per_cluster, 0);
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INODES);
> >
> > for (agino = irec->ir_startino;
> > agino < irec->ir_startino + XFS_INODES_PER_CHUNK;
> > @@ -230,12 +225,13 @@ xchk_iallocbt_check_freemask(
> > /* If any part of this is a hole, skip it. */
> > if (ir_holemask) {
> > xchk_xref_is_not_owned_by(bs->sc, agbno,
> > - blks_per_cluster, &oinfo);
> > + blks_per_cluster,
> > + &XFS_RMAP_OINFO_INODES);
> > continue;
> > }
> >
> > xchk_xref_is_owned_by(bs->sc, agbno, blks_per_cluster,
> > - &oinfo);
> > + &XFS_RMAP_OINFO_INODES);
> >
> > /* Grab the inode cluster buffer. */
> > imap.im_blkno = XFS_AGB_TO_DADDR(mp, bs->cur->bc_private.a.agno,
> > @@ -366,7 +362,6 @@ xchk_iallocbt_xref_rmap_btreeblks(
> > struct xfs_scrub *sc,
> > int which)
> > {
> > - struct xfs_owner_info oinfo;
> > xfs_filblks_t blocks;
> > xfs_extlen_t inobt_blocks = 0;
> > xfs_extlen_t finobt_blocks = 0;
> > @@ -388,9 +383,8 @@ xchk_iallocbt_xref_rmap_btreeblks(
> > return;
> > }
> >
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INOBT);
> > - error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur, &oinfo,
> > - &blocks);
> > + error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur,
> > + &XFS_RMAP_OINFO_INOBT, &blocks);
> > if (!xchk_should_check_xref(sc, &error, &sc->sa.rmap_cur))
> > return;
> > if (blocks != inobt_blocks + finobt_blocks)
> > @@ -407,7 +401,6 @@ xchk_iallocbt_xref_rmap_inodes(
> > int which,
> > xfs_filblks_t inode_blocks)
> > {
> > - struct xfs_owner_info oinfo;
> > xfs_filblks_t blocks;
> > int error;
> >
> > @@ -415,9 +408,8 @@ xchk_iallocbt_xref_rmap_inodes(
> > return;
> >
> > /* Check that we saw as many inode blocks as the rmap knows about. */
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INODES);
> > - error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur, &oinfo,
> > - &blocks);
> > + error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur,
> > + &XFS_RMAP_OINFO_INODES, &blocks);
> > if (!xchk_should_check_xref(sc, &error, &sc->sa.rmap_cur))
> > return;
> > if (blocks != inode_blocks)
> > @@ -431,13 +423,11 @@ xchk_iallocbt(
> > xfs_btnum_t which)
> > {
> > struct xfs_btree_cur *cur;
> > - struct xfs_owner_info oinfo;
> > xfs_filblks_t inode_blocks = 0;
> > int error;
> >
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INOBT);
> > cur = which == XFS_BTNUM_INO ? sc->sa.ino_cur : sc->sa.fino_cur;
> > - error = xchk_btree(sc, cur, xchk_iallocbt_rec, &oinfo,
> > + error = xchk_btree(sc, cur, xchk_iallocbt_rec, &XFS_RMAP_OINFO_INOBT,
> > &inode_blocks);
> > if (error)
> > return error;
> > diff --git a/fs/xfs/scrub/inode.c b/fs/xfs/scrub/inode.c
> > index e386c9b0b4ab..e213efc194a1 100644
> > --- a/fs/xfs/scrub/inode.c
> > +++ b/fs/xfs/scrub/inode.c
> > @@ -509,7 +509,6 @@ xchk_inode_xref(
> > xfs_ino_t ino,
> > struct xfs_dinode *dip)
> > {
> > - struct xfs_owner_info oinfo;
> > xfs_agnumber_t agno;
> > xfs_agblock_t agbno;
> > int error;
> > @@ -526,8 +525,7 @@ xchk_inode_xref(
> >
> > xchk_xref_is_used_space(sc, agbno, 1);
> > xchk_inode_xref_finobt(sc, ino);
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INODES);
> > - xchk_xref_is_owned_by(sc, agbno, 1, &oinfo);
> > + xchk_xref_is_owned_by(sc, agbno, 1, &XFS_RMAP_OINFO_INODES);
> > xchk_xref_is_not_shared(sc, agbno, 1);
> > xchk_inode_xref_bmap(sc, dip);
> >
> > diff --git a/fs/xfs/scrub/refcount.c b/fs/xfs/scrub/refcount.c
> > index b7ade620acee..708b4158eb90 100644
> > --- a/fs/xfs/scrub/refcount.c
> > +++ b/fs/xfs/scrub/refcount.c
> > @@ -385,7 +385,6 @@ xchk_refcount_xref_rmap(
> > struct xfs_scrub *sc,
> > xfs_filblks_t cow_blocks)
> > {
> > - struct xfs_owner_info oinfo;
> > xfs_extlen_t refcbt_blocks = 0;
> > xfs_filblks_t blocks;
> > int error;
> > @@ -394,21 +393,19 @@ xchk_refcount_xref_rmap(
> > return;
> >
> > /* Check that we saw as many refcbt blocks as the rmap knows about. */
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_REFC);
> > error = xfs_btree_count_blocks(sc->sa.refc_cur, &refcbt_blocks);
> > if (!xchk_btree_process_error(sc, sc->sa.refc_cur, 0, &error))
> > return;
> > - error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur, &oinfo,
> > - &blocks);
> > + error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur,
> > + &XFS_RMAP_OINFO_REFC, &blocks);
> > if (!xchk_should_check_xref(sc, &error, &sc->sa.rmap_cur))
> > return;
> > if (blocks != refcbt_blocks)
> > xchk_btree_xref_set_corrupt(sc, sc->sa.rmap_cur, 0);
> >
> > /* Check that we saw as many cow blocks as the rmap knows about. */
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_COW);
> > - error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur, &oinfo,
> > - &blocks);
> > + error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur,
> > + &XFS_RMAP_OINFO_COW, &blocks);
> > if (!xchk_should_check_xref(sc, &error, &sc->sa.rmap_cur))
> > return;
> > if (blocks != cow_blocks)
> > @@ -420,13 +417,11 @@ int
> > xchk_refcountbt(
> > struct xfs_scrub *sc)
> > {
> > - struct xfs_owner_info oinfo;
> > xfs_agblock_t cow_blocks = 0;
> > int error;
> >
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_REFC);
> > error = xchk_btree(sc, sc->sa.refc_cur, xchk_refcountbt_rec,
> > - &oinfo, &cow_blocks);
> > + &XFS_RMAP_OINFO_REFC, &cow_blocks);
> > if (error)
> > return error;
> >
> > diff --git a/fs/xfs/scrub/repair.c b/fs/xfs/scrub/repair.c
> > index 90ae9e173de7..1c8eecfe52b8 100644
> > --- a/fs/xfs/scrub/repair.c
> > +++ b/fs/xfs/scrub/repair.c
> > @@ -505,7 +505,6 @@ xrep_put_freelist(
> > struct xfs_scrub *sc,
> > xfs_agblock_t agbno)
> > {
> > - struct xfs_owner_info oinfo;
> > int error;
> >
> > /* Make sure there's space on the freelist. */
> > @@ -518,9 +517,8 @@ xrep_put_freelist(
> > * create an rmap for the block prior to merging it or else other
> > * parts will break.
> > */
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG);
> > error = xfs_rmap_alloc(sc->tp, sc->sa.agf_bp, sc->sa.agno, agbno, 1,
> > - &oinfo);
> > + &XFS_RMAP_OINFO_AG);
> > if (error)
> > return error;
> >
> > diff --git a/fs/xfs/scrub/rmap.c b/fs/xfs/scrub/rmap.c
> > index 8a5bf15d544d..92a140c5b55e 100644
> > --- a/fs/xfs/scrub/rmap.c
> > +++ b/fs/xfs/scrub/rmap.c
> > @@ -174,11 +174,8 @@ int
> > xchk_rmapbt(
> > struct xfs_scrub *sc)
> > {
> > - struct xfs_owner_info oinfo;
> > -
> > - xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG);
> > return xchk_btree(sc, sc->sa.rmap_cur, xchk_rmapbt_rec,
> > - &oinfo, NULL);
> > + &XFS_RMAP_OINFO_AG, NULL);
> > }
> >
> > /* xref check that the extent is owned by a given owner */
> > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c
> > index d9da66c718bb..74ddf66f4cfe 100644
> > --- a/fs/xfs/xfs_extfree_item.c
> > +++ b/fs/xfs/xfs_extfree_item.c
> > @@ -494,7 +494,6 @@ xfs_efi_recover(
> > int error = 0;
> > xfs_extent_t *extp;
> > xfs_fsblock_t startblock_fsb;
> > - struct xfs_owner_info oinfo;
> >
> > ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags));
> >
> > @@ -526,11 +525,11 @@ xfs_efi_recover(
> > return error;
> > efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents);
> >
> > - xfs_rmap_any_owner_update(&oinfo);
> > for (i = 0; i < efip->efi_format.efi_nextents; i++) {
> > extp = &efip->efi_format.efi_extents[i];
> > error = xfs_trans_free_extent(tp, efdp, extp->ext_start,
> > - extp->ext_len, &oinfo, false);
> > + extp->ext_len,
> > + &XFS_RMAP_OINFO_ANY_OWNER, false);
> > if (error)
> > goto abort_error;
> >
> >
next prev parent reply other threads:[~2018-11-21 3:00 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-08 23:20 [PATCH 0/5] xfs-5.0: miscellaneous cleanups Darrick J. Wong
2018-11-08 23:20 ` [PATCH 1/5] xfs: const-ify xfs_owner_info arguments Darrick J. Wong
2018-11-20 16:17 ` Brian Foster
2018-11-20 16:27 ` Darrick J. Wong
2018-11-08 23:20 ` [PATCH 2/5] xfs: remove xfs_rmap_ag_owner and friends Darrick J. Wong
2018-11-20 16:20 ` Brian Foster
2018-11-20 16:30 ` Darrick J. Wong [this message]
2018-11-08 23:20 ` [PATCH 3/5] xfs: add a block to inode count converter Darrick J. Wong
2018-11-20 16:21 ` Brian Foster
2018-11-20 16:31 ` Darrick J. Wong
2018-11-08 23:20 ` [PATCH 4/5] xfs: precalculate inodes and blocks per inode cluster Darrick J. Wong
2018-11-20 16:23 ` Brian Foster
2018-11-20 16:33 ` Darrick J. Wong
2018-11-08 23:20 ` [PATCH 5/5] xfs: precalculate cluster alignment in inodes and blocks Darrick J. Wong
2018-11-20 16:23 ` Brian Foster
2018-11-20 16:56 ` 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=20181120163009.GB6792@magnolia \
--to=darrick.wong@oracle.com \
--cc=bfoster@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).