lkml.org 
[lkml]   [2024]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 15/26] range: Add range_overlaps()
    On Sun, Mar 24, 2024 at 04:18:18PM -0700, Ira Weiny wrote:
    > Code to support CXL Dynamic Capacity devices will have extent ranges
    > which need to be compared for intersection not a subset as is being
    > checked in range_contains().
    >
    > range_overlaps() is defined in btrfs with a different meaning from what
    > is required in the standard range code. Dan Williams pointed this out
    > in [1]. Adjust the btrfs call according to his suggestion there.
    >
    > Then add a generic range_overlaps().
    >
    > Cc: Dan Williams <dan.j.williams@intel.com>
    > Cc: Chris Mason <clm@fb.com>
    > Cc: Josef Bacik <josef@toxicpanda.com>
    > Cc: David Sterba <dsterba@suse.com>
    > Cc: linux-btrfs@vger.kernel.org
    > Signed-off-by: Ira Weiny <ira.weiny@intel.com>

    Reviewed-by: Fan Ni <fan.ni@samsung.com>

    >
    > [1] https://lore.kernel.org/all/65949f79ef908_8dc68294f2@dwillia2-xfh.jf.intel.com.notmuch/
    > ---
    > fs/btrfs/ordered-data.c | 10 +++++-----
    > include/linux/range.h | 7 +++++++
    > 2 files changed, 12 insertions(+), 5 deletions(-)
    >
    > diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
    > index 59850dc17b22..032d30a49edc 100644
    > --- a/fs/btrfs/ordered-data.c
    > +++ b/fs/btrfs/ordered-data.c
    > @@ -111,8 +111,8 @@ static struct rb_node *__tree_search(struct rb_root *root, u64 file_offset,
    > return NULL;
    > }
    >
    > -static int range_overlaps(struct btrfs_ordered_extent *entry, u64 file_offset,
    > - u64 len)
    > +static int btrfs_range_overlaps(struct btrfs_ordered_extent *entry, u64 file_offset,
    > + u64 len)
    > {
    > if (file_offset + len <= entry->file_offset ||
    > entry->file_offset + entry->num_bytes <= file_offset)
    > @@ -914,7 +914,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_range(
    >
    > while (1) {
    > entry = rb_entry(node, struct btrfs_ordered_extent, rb_node);
    > - if (range_overlaps(entry, file_offset, len))
    > + if (btrfs_range_overlaps(entry, file_offset, len))
    > break;
    >
    > if (entry->file_offset >= file_offset + len) {
    > @@ -1043,12 +1043,12 @@ struct btrfs_ordered_extent *btrfs_lookup_first_ordered_range(
    > }
    > if (prev) {
    > entry = rb_entry(prev, struct btrfs_ordered_extent, rb_node);
    > - if (range_overlaps(entry, file_offset, len))
    > + if (btrfs_range_overlaps(entry, file_offset, len))
    > goto out;
    > }
    > if (next) {
    > entry = rb_entry(next, struct btrfs_ordered_extent, rb_node);
    > - if (range_overlaps(entry, file_offset, len))
    > + if (btrfs_range_overlaps(entry, file_offset, len))
    > goto out;
    > }
    > /* No ordered extent in the range */
    > diff --git a/include/linux/range.h b/include/linux/range.h
    > index 6ad0b73cb7ad..9a46f3212965 100644
    > --- a/include/linux/range.h
    > +++ b/include/linux/range.h
    > @@ -13,11 +13,18 @@ static inline u64 range_len(const struct range *range)
    > return range->end - range->start + 1;
    > }
    >
    > +/* True if r1 completely contains r2 */
    > static inline bool range_contains(struct range *r1, struct range *r2)
    > {
    > return r1->start <= r2->start && r1->end >= r2->end;
    > }
    >
    > +/* True if any part of r1 overlaps r2 */
    > +static inline bool range_overlaps(struct range *r1, struct range *r2)
    > +{
    > + return r1->start <= r2->end && r1->end >= r2->start;
    > +}
    > +
    > int add_range(struct range *range, int az, int nr_range,
    > u64 start, u64 end);
    >
    >
    > --
    > 2.44.0
    >

    \
     
     \ /
      Last update: 2024-05-27 16:12    [W:3.322 / U:0.464 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site