Commit Graph

28 Commits

Author SHA1 Message Date
Bill O'Donnell 271c605aee xfs: create a ranged query function for refcount btrees
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit d12bf8bac87a0d93e6e5fab67f399d1e3d3d5767
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Fri Dec 15 10:03:40 2023 -0800

    xfs: create a ranged query function for refcount btrees

    Implement ranged queries for refcount records.  The next patch will use
    this to scan refcount data.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:08 -06:00
Bill O'Donnell 71b1929648 xfs: repair refcount btrees
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 9099cd38002f8029c9a1da08e6832d1cd18e8451
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Fri Dec 15 10:03:33 2023 -0800

    xfs: repair refcount btrees

    Reconstruct the refcount data from the rmap btree.

    Link: https://docs.kernel.org/filesystems/xfs-online-fsck-design.html#case-study-rebuilding-the-space-reference-counts
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:04 -06:00
Bill O'Donnell de02d9af50 xfs: replace xfs_btree_has_record with a general keyspace scanner
JIRA: https://issues.redhat.com/browse/RHEL-25419

commit 6abc7aef85b1f42cb39a3149f4ab64ca255e41e6
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Apr 11 19:00:10 2023 -0700

    xfs: replace xfs_btree_has_record with a general keyspace scanner

    The current implementation of xfs_btree_has_record returns true if it
    finds /any/ record within the given range.  Unfortunately, that's not
    sufficient for scrub.  We want to be able to tell if a range of keyspace
    for a btree is devoid of records, is totally mapped to records, or is
    somewhere in between.  By forcing this to be a boolean, we conflated
    sparseness and fullness, which caused scrub to return incorrect results.
    Fix the API so that we can tell the caller which of those three is the
    current state.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-06-05 16:56:20 -05:00
Bill O'Donnell 8b97db8279 xfs: standardize ondisk to incore conversion for refcount btrees
JIRA: https://issues.redhat.com/browse/RHEL-25419

commit 2b30cc0bf0589d1ea0506c019b9b81de77535c87
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Apr 11 19:00:02 2023 -0700

    xfs: standardize ondisk to incore conversion for refcount btrees

    Create a xfs_refcount_check_irec function to detect corruption in btree
    records.  Fix all xfs_refcount_btrec_to_irec callsites to call the new
    helper and bubble up corruption reports.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-06-05 16:56:17 -05:00
Bill O'Donnell f61c6e66c9 xfs: give xfs_refcount_intent its own perag reference
JIRA: https://issues.redhat.com/browse/RHEL-25419

commit 00e7b3bac1dc8961bd5aa9d39e79131c6bd81181
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Apr 11 18:59:55 2023 -0700

    xfs: give xfs_refcount_intent its own perag reference

    Give the xfs_refcount_intent a passive reference to the perag structure
    data.  This reference will be used to enable scrub intent draining
    functionality in subsequent patches.  Any space being modified by a
    refcount intent is already allocated, so we need to be able to operate
    even if the AG is being shrunk or offlined.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-06-05 16:56:14 -05:00
Bill O'Donnell b010e995c4 xfs: pass refcount intent directly through the log intent code
JIRA: https://issues.redhat.com/browse/RHEL-2002

commit 0b11553ec54a6d88907e60d0595dbcef98539747
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Wed Feb 1 10:16:04 2023 -0800

    xfs: pass refcount intent directly through the log intent code

    Pass the incore refcount intent through the CUI logging code instead of
    repeatedly boxing and unboxing parameters.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-11-10 07:22:19 -06:00
Bill O'Donnell 188ab0a915 xfs: rename XFS_REFC_COW_START to _COWFLAG
JIRA: https://issues.redhat.com/browse/RHEL-2002

commit 8b972158afcaa66c538c3ee1d394f096fcd238a8
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 10 11:13:20 2022 -0700

    xfs: rename XFS_REFC_COW_START to _COWFLAG

    We've been (ab)using XFS_REFC_COW_START as both an integer quantity and
    a bit flag, even though it's *only* a bit flag.  Rename the variable to
    reflect its nature and update the cast target since we're not supposed
    to be comparing it to xfs_agblock_t now.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-11-10 07:22:15 -06:00
Bill O'Donnell af3bbae86d xfs: refactor domain and refcount checking
JIRA: https://issues.redhat.com/browse/RHEL-2002

commit f492135df0aa0417337f9b8b1cc6d6a994d61d25
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Wed Oct 26 14:31:27 2022 -0700

    xfs: refactor domain and refcount checking

    Create a helper function to ensure that CoW staging extent records have
    a single refcount and that shared extent records have more than 1
    refcount.  We'll put this to more use in the next patch.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-11-06 19:42:19 -06:00
Bill O'Donnell 7d0d335ad8 xfs: track cow/shared record domains explicitly in xfs_refcount_irec
JIRA: https://issues.redhat.com/browse/RHEL-2002

commit 9a50ee4f8db6e4dd0d8d757b7adaf0591776860a
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 10 09:06:24 2022 -0700

    xfs: track cow/shared record domains explicitly in xfs_refcount_irec

    Just prior to committing the reflink code into upstream, the xfs
    maintainer at the time requested that I find a way to shard the refcount
    records into two domains -- one for records tracking shared extents, and
    a second for tracking CoW staging extents.  The idea here was to
    minimize mount time CoW reclamation by pushing all the CoW records to
    the right edge of the keyspace, and it was accomplished by setting the
    upper bit in rc_startblock.  We don't allow AGs to have more than 2^31
    blocks, so the bit was free.

    Unfortunately, this was a very late addition to the codebase, so most of
    the refcount record processing code still treats rc_startblock as a u32
    and pays no attention to whether or not the upper bit (the cow flag) is
    set.  This is a weakness is theoretically exploitable, since we're not
    fully validating the incoming metadata records.

    Fuzzing demonstrates practical exploits of this weakness.  If the cow
    flag of a node block key record is corrupted, a lookup operation can go
    to the wrong record block and start returning records from the wrong
    cow/shared domain.  This causes the math to go all wrong (since cow
    domain is still implicit in the upper bit of rc_startblock) and we can
    crash the kernel by tricking xfs into jumping into a nonexistent AG and
    tripping over xfs_perag_get(mp, <nonexistent AG>) returning NULL.

    To fix this, start tracking the domain as an explicit part of struct
    xfs_refcount_irec, adjust all refcount functions to check the domain
    of a returned record, and alter the function definitions to accept them
    where necessary.

    Found by fuzzing keys[2].cowflag = add in xfs/464.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-11-06 19:42:19 -06:00
Bill O'Donnell 37bb5cd300 xfs: stop artificially limiting the length of bunmap calls
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit 4ed6435cc369cce722966983f6e07b872562276f
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Apr 25 18:37:15 2022 -0700

    xfs: stop artificially limiting the length of bunmap calls

    In commit e1a4e37cc7, we clamped the length of bunmapi calls on the
    data forks of shared files to avoid two failure scenarios: one where the
    extent being unmapped is so sparsely shared that we exceed the
    transaction reservation with the sheer number of refcount btree updates
    and EFI intent items; and the other where we attach so many deferred
    updates to the transaction that we pin the log tail and later the log
    head meets the tail, causing the log to livelock.

    We avoid triggering the first problem by tracking the number of ops in
    the refcount btree cursor and forcing a requeue of the refcount intent
    item any time we think that we might be close to overflowing.  This has
    been baked into XFS since before the original e1a4 patch.

    A recent patchset fixed the second problem by changing the deferred ops
    code to finish all the work items created by each round of trying to
    complete a refcount intent item, which eliminates the long chains of
    deferred items (27dad); and causing long-running transactions to relog
    their intent log items when space in the log gets low (74f4d).

    Because this clamp affects /any/ unmapping request regardless of the
    sharing factors of the component blocks, it degrades the performance of
    all large unmapping requests -- whereas with an unshared file we can
    unmap millions of blocks in one go, shared files are limited to
    unmapping a few thousand blocks at a time, which causes the upper level
    code to spin in a bunmapi loop even if it wasn't needed.

    This also eliminates one more place where log recovery behavior can
    differ from online behavior, because bunmapi operations no longer need
    to requeue.  The fstest generic/447 was created to test the old fix, and
    it still passes with this applied.

    Partial-revert-of: e1a4e37cc7 ("xfs: try to avoid blowing out the transaction reservation when bunmaping a shared extent")
    Depends: 27dada070d ("xfs: change the order in which child and parent defer ops ar finished")
    Depends: 74f4d6a1e0 ("xfs: only relog deferred intent items if free space in the log gets low")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:11:10 -05:00
Bill O'Donnell 744b6e2712 xfs: count EFIs when deciding to ask for a continuation of a refcount update
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit c47260d4ea2ac11ce607d6ac1e0ca5528f42f482
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Apr 26 15:29:54 2022 -0700

    xfs: count EFIs when deciding to ask for a continuation of a refcount update

    A long time ago, I added to XFS the ability to use deferred reference
    count operations as part of a transaction chain.  This enabled us to
    avoid blowing out the transaction reservation when the blocks in a
    physical extent all had different reference counts because we could ask
    the deferred operation manager for a continuation, which would get us a
    clean transaction.

    The refcount code asks for a continuation when the number of refcount
    record updates reaches the point where we think that the transaction has
    logged enough full btree blocks due to refcount (and free space) btree
    shape changes and refcount record updates that we're in danger of
    overflowing the transaction.

    We did not previously count the EFIs logged to the refcount update
    transaction because the clamps on the length of a bunmap operation were
    sufficient to avoid overflowing the transaction reservation even in the
    worst case situation where every other block of the unmapped extent is
    shared.

    Unfortunately, the restrictions on bunmap length avoid failure in the
    worst case by imposing a maximum unmap length of ~3000 blocks, even for
    non-pathological cases.  This seriously limits performance when freeing
    large extents.

    Therefore, track EFIs with the same counter as refcount record updates,
    and use that information as input into when we should ask for a
    continuation.  This enables the next patch to drop the clumsy bunmap
    limitation.

    Depends: 27dada070d ("xfs: change the order in which child and parent defer ops ar finished")
    Depends: 74f4d6a1e0 ("xfs: only relog deferred intent items if free space in the log gets low")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:11:10 -05:00
Carlos Maiolino c63a9018d9 xfs: create slab caches for frequently-used deferred items
Bugzilla: https://bugzilla.redhat.com/2125724

Create slab caches for the high-level structures that coordinate
deferred intent items, since they're used fairly heavily.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>

Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
(cherry picked from commit f3c799c22c661e181c71a0d9914fc923023f65fb)
2022-10-21 12:50:46 +02:00
Carlos Maiolino 49c8f0df52 xfs: compact deferred intent item structures
Bugzilla: https://bugzilla.redhat.com/2125724

Rearrange these structs to reduce the amount of unused padding bytes.
This saves eight bytes for each of the three structs changed here, which
means they're now all (rmap/bmap are 64 bytes, refc is 32 bytes) even
powers of two.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>

Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
(cherry picked from commit 9e253954acf53227f33d307f5ac5ff94c1ca5880)
2022-10-21 12:50:46 +02:00
Brian Foster af9b90b846 xfs: make the record pointer passed to query_range functions const
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2083143
Upstream Status: linux.git

commit 159eb69dba8baf6d5b58b69936920fb311324c82
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Aug 10 17:02:16 2021 -0700

    xfs: make the record pointer passed to query_range functions const

    The query_range functions are supposed to call a caller-supplied
    function on each record found in the dataset.  These functions don't
    own the memory storing the record, so don't let them change the record.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Brian Foster <bfoster@redhat.com>
2022-08-25 08:11:29 -04:00
Dave Chinner a81a06211f xfs: convert refcount btree cursor to use perags
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
2021-06-02 10:48:24 +10:00
Darrick J. Wong 74b4c5d4a9 xfs: remove unnecessary int returns from deferred refcount functions
Remove the return value from the functions that schedule deferred
refcount operations since they never fail and do not return status.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2019-08-28 08:31:02 -07:00
Brian Foster 0f37d1780c xfs: pass transaction to xfs_defer_add()
The majority of remaining references to struct xfs_defer_ops in XFS
are associated with xfs_defer_add(). At this point, there are no
more external xfs_defer_ops users left. All instances of
xfs_defer_ops are embedded in the transaction, which means we can
safely pass the transaction down to the dfops add interface.

Update xfs_defer_add() to receive the transaction as a parameter.
Various subsystems implement wrappers to allocate and construct the
context specific data structures for the associated deferred
operation type. Update these to also carry the transaction down as
needed and clean up unused dfops parameters along the way.

This removes most of the remaining references to struct
xfs_defer_ops throughout the code and facilitates removal of the
structure.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
[darrick: fix unused variable warnings with ftrace disabled]
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2018-08-02 23:05:14 -07:00
Brian Foster 7dbddbaccd xfs: drop dop param from xfs_defer_op_type ->finish_item() callback
The dfops infrastructure ->finish_item() callback passes the
transaction and dfops as separate parameters. Since dfops is always
part of a transaction, the latter parameter is no longer necessary.
Remove it from the various callbacks.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2018-08-02 23:05:14 -07:00
Dave Chinner 0b61f8a407 xfs: convert to SPDX license tags
Remove the verbose license text from XFS files and replace them
with SPDX tags. This does not change the license of any of the code,
merely refers to the common, up-to-date license files in LICENSES/

This change was mostly scripted. fs/xfs/Makefile and
fs/xfs/libxfs/xfs_fs.h were modified by hand, the rest were detected
and modified by the following command:

for f in `git grep -l "GNU General" fs/xfs/` ; do
	echo $f
	cat $f | awk -f hdr.awk > $f.new
	mv -f $f.new $f
done

And the hdr.awk script that did the modification (including
detecting the difference between GPL-2.0 and GPL-2.0+ licenses)
is as follows:

$ cat hdr.awk
BEGIN {
	hdr = 1.0
	tag = "GPL-2.0"
	str = ""
}

/^ \* This program is free software/ {
	hdr = 2.0;
	next
}

/any later version./ {
	tag = "GPL-2.0+"
	next
}

/^ \*\// {
	if (hdr > 0.0) {
		print "// SPDX-License-Identifier: " tag
		print str
		print $0
		str=""
		hdr = 0.0
		next
	}
	print $0
	next
}

/^ \* / {
	if (hdr > 1.0)
		next
	if (hdr > 0.0) {
		if (str != "")
			str = str "\n"
		str = str $0
		next
	}
	print $0
	next
}

/^ \*/ {
	if (hdr > 0.0)
		next
	print $0
	next
}

// {
	if (hdr > 0.0) {
		if (str != "")
			str = str "\n"
		str = str $0
		next
	}
	print $0
}

END { }
$

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2018-06-06 14:17:53 -07:00
Darrick J. Wong 08daa3ccf5 xfs: add repair helpers for the reference count btree
Add a couple of functions to the refcount btree and generic btree code
that will be used to repair the refcountbt.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2018-05-15 17:57:05 -07:00
Darrick J. Wong 7f8f1313d9 xfs: expose various functions to repair code
Expose various helpers that the repair code will want to use.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2018-05-15 17:57:05 -07:00
Darrick J. Wong 49db55eca5 xfs: add scrub cross-referencing helpers for the refcount btrees
Add a couple of functions to the refcount btrees that will be used
to cross-reference metadata against the refcountbt.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2018-01-17 21:00:44 -08:00
Darrick J. Wong e1a4e37cc7 xfs: try to avoid blowing out the transaction reservation when bunmaping a shared extent
In a pathological scenario where we are trying to bunmapi a single
extent in which every other block is shared, it's possible that trying
to unmap the entire large extent in a single transaction can generate so
many EFIs that we overflow the transaction reservation.

Therefore, use a heuristic to guess at the number of blocks we can
safely unmap from a reflink file's data fork in an single transaction.
This should prevent problems such as the log head slamming into the tail
and ASSERTs that trigger because we've exceeded the transaction
reservation.

Note that since bunmapi can fail to unmap the entire range, we must also
teach the deferred unmap code to roll into a new transaction whenever we
get low on reservation.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
[hch: random edits, all bugs are my fault]
Signed-off-by: Christoph Hellwig <hch@lst.de>
2017-06-19 08:59:10 -07:00
Darrick J. Wong 174edb0e46 xfs: store in-progress CoW allocations in the refcount btree
Due to the way the CoW algorithm in XFS works, there's an interval
during which blocks allocated to handle a CoW can be lost -- if the FS
goes down after the blocks are allocated but before the block
remapping takes place.  This is exacerbated by the cowextsz hint --
allocated reservations can sit around for a while, waiting to get
used.

Since the refcount btree doesn't normally store records with refcount
of 1, we can use it to record these in-progress extents.  In-progress
blocks cannot be shared because they're not user-visible, so there
shouldn't be any conflicts with other programs.  This is a better
solution than holding EFIs during writeback because (a) EFIs can't be
relogged currently, (b) even if they could, EFIs are bound by
available log space, which puts an unnecessary upper bound on how much
CoW we can have in flight, and (c) we already have a mechanism to
track blocks.

At mount time, read the refcount records and free anything we find
with a refcount of 1 because those were in-progress when the FS went
down.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2016-10-05 16:26:05 -07:00
Darrick J. Wong 350a27a6a6 xfs: introduce reflink utility functions
These functions will be used by the other reflink functions to find
the maximum length of a range of shared blocks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.coM>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2016-10-03 09:11:25 -07:00
Darrick J. Wong 33ba612920 xfs: connect refcount adjust functions to upper layers
Plumb in the upper level interface to schedule and finish deferred
refcount operations via the deferred ops mechanism.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2016-10-03 09:11:22 -07:00
Darrick J. Wong f997ee2137 xfs: log refcount intent items
Provide a mechanism for higher levels to create CUI/CUD items, submit
them to the log, and a stub function to deal with recovered CUI items.
These parts will be connected to the refcountbt in a later patch.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2016-10-03 09:11:21 -07:00
Darrick J. Wong bdf28630b7 xfs: add refcount btree operations
Implement the generic btree operations required to manipulate refcount
btree blocks.  The implementation is similar to the bmapbt, though it
will only allocate and free blocks from the AG.

Since the refcount root and level fields are separate from the
existing roots and levels array, they need a separate logging flag.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
[hch: fix logging of AGF refcount btree fields]
Signed-off-by: Christoph Hellwig <hch@lst.de>
2016-10-03 09:11:19 -07:00