| From 503785306d182ab624a2232856ef8ab503ee85f9 Mon Sep 17 00:00:00 2001 |
| From: Zhao Lei <zhaolei@cn.fujitsu.com> |
| Date: Fri, 18 Dec 2015 21:33:05 +0800 |
| Subject: btrfs: reada: Fix in-segment calculation for reada |
| |
| From: Zhao Lei <zhaolei@cn.fujitsu.com> |
| |
| commit 503785306d182ab624a2232856ef8ab503ee85f9 upstream. |
| |
| reada_zone->end is end pos of segment: |
| end = start + cache->key.offset - 1; |
| |
| So we need to use "<=" in condition to judge is a pos in the |
| segment. |
| |
| The problem happened rearly, because logical pos rarely pointed |
| to last 4k of a blockgroup, but we need to fix it to make code |
| right in logic. |
| |
| Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/reada.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/btrfs/reada.c |
| +++ b/fs/btrfs/reada.c |
| @@ -265,7 +265,7 @@ static struct reada_zone *reada_find_zon |
| spin_unlock(&fs_info->reada_lock); |
| |
| if (ret == 1) { |
| - if (logical >= zone->start && logical < zone->end) |
| + if (logical >= zone->start && logical <= zone->end) |
| return zone; |
| spin_lock(&fs_info->reada_lock); |
| kref_put(&zone->refcnt, reada_zone_release); |
| @@ -679,7 +679,7 @@ static int reada_start_machine_dev(struc |
| */ |
| ret = radix_tree_gang_lookup(&dev->reada_extents, (void **)&re, |
| dev->reada_next >> PAGE_CACHE_SHIFT, 1); |
| - if (ret == 0 || re->logical >= dev->reada_curr_zone->end) { |
| + if (ret == 0 || re->logical > dev->reada_curr_zone->end) { |
| ret = reada_pick_zone(dev); |
| if (!ret) { |
| spin_unlock(&fs_info->reada_lock); |