On Fri, Dec 22, 2017 at 04:43:41PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Add a couple of functions to the rmap btrees that will be used > to cross-reference metadata against the rmapbt. > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > fs/xfs/libxfs/xfs_rmap.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/libxfs/xfs_rmap.h | 5 ++++ > 2 files changed, 63 insertions(+) > > > diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c > index 50db920..ea78ec3 100644 > --- a/fs/xfs/libxfs/xfs_rmap.c > +++ b/fs/xfs/libxfs/xfs_rmap.c > @@ -2387,3 +2387,61 @@ xfs_rmap_compare( > else > return 0; > } > + > +/* Is there a record covering a given extent? */ > +int > +xfs_rmap_has_record( > + struct xfs_btree_cur *cur, > + xfs_agblock_t bno, > + xfs_extlen_t len, > + bool *exists) > +{ > + union xfs_btree_irec low; > + union xfs_btree_irec high; > + > + memset(&low, 0, sizeof(low)); > + low.r.rm_startblock = bno; > + memset(&high, 0xFF, sizeof(high)); > + high.r.rm_startblock = bno + len - 1; > + > + return xfs_btree_has_record(cur, &low, &high, exists); > +} > + > +/* Is there a record covering a given extent? */ > +int > +xfs_rmap_record_exists( > + struct xfs_btree_cur *cur, > + xfs_agblock_t bno, > + xfs_extlen_t len, > + struct xfs_owner_info *oinfo, > + bool *has_rmap) > +{ > + uint64_t owner; > + uint64_t offset; > + unsigned int flags; > + int stat; has_record to match the other code? > + struct xfs_rmap_irec irec; > + int error; > + > + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); > + > + error = xfs_rmap_lookup_le(cur, bno, len, owner, offset, flags, &stat); > + if (error) > + return error; > + if (!stat) { > + *has_rmap = false; > + return 0; > + } > + > + error = xfs_rmap_get_rec(cur, &irec, &stat); > + if (error) > + return error; > + if (!stat) { > + *has_rmap = false; > + return 0; > + } > + > + *has_rmap = (irec.rm_owner == owner && irec.rm_startblock <= bno && > + irec.rm_startblock + irec.rm_blockcount >= bno + len); Ok, so this returns true only if the rmap record spans the entire range we pass in. What does it mean if the rmap record only partially spans the range passed in? Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html