Re: [PATCH 05/10] btrfs: raid56: Use in_range where applicable

David Sterba
2020-07-03T15:45:28Z

On Thu, Jul 02, 2020 at 04:46:45PM +0300, Nikolay Borisov wrote:
> While at it use the opportunity to simplify find_logical_bio_stripe by
> reducing the scope of 'stripe_start' variable and squash the
> sector-to-bytes conversion on one line.
>
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
> fs/btrfs/raid56.c | 16 ++++------------
> 1 file changed, 4 insertions(+), 12 deletions(-)
>
> diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c
> index d9415a22617b..d89dd3030bba 100644
> --- a/fs/btrfs/raid56.c
> +++ b/fs/btrfs/raid56.c
> @@ -1349,7 +1349,6 @@ static int find_bio_stripe(struct btrfs_raid_bio *rbio,
> struct bio *bio)
> {
> u64 physical = bio->bi_iter.bi_sector;
> - u64 stripe_start;
> int i;
> struct btrfs_bio_stripe *stripe;
>
> @@ -1357,9 +1356,7 @@ static int find_bio_stripe(struct btrfs_raid_bio *rbio,
>
> for (i = 0; i < rbio->bbio->num_stripes; i++) {
> stripe = &rbio->bbio->stripes[i];
> - stripe_start = stripe->physical;
> - if (physical >= stripe_start &&
> - physical < stripe_start + rbio->stripe_len &&
> + if (in_range(physical, stripe->physical, rbio->stripe_len) &&
> stripe->dev->bdev &&
> bio->bi_disk == stripe->dev->bdev->bd_disk &&
> bio->bi_partno == stripe->dev->bdev->bd_partno) {
> @@ -1377,18 +1374,13 @@ static int find_bio_stripe(struct btrfs_raid_bio *rbio,
> static int find_logical_bio_stripe(struct btrfs_raid_bio *rbio,
> struct bio *bio)
> {
> - u64 logical = bio->bi_iter.bi_sector;
> - u64 stripe_start;
> + u64 logical = bio->bi_iter.bi_sector << 9;

FYI, if bi_iter::bi_sector is shifted left or right, it needs the u64
cast because the type sector_t is not always 64bit for some reasons.
We've had bugs with the conversion on 32bit arches, for consistency it
needs to be there.

> int i;
>
> - logical <<= 9;
> -
> for (i = 0; i < rbio->nr_data; i++) {
> - stripe_start = rbio->bbio->raid_map[i];
> - if (logical >= stripe_start &&
> - logical < stripe_start + rbio->stripe_len) {
> + u64 stripe_start = rbio->bbio->raid_map[i];
> + if (in_range(logical, stripe_start, rbio->stripe_len))
> return i;
> - }
> }
> return -1;
> }
> --
> 2.17.1