If @conf->far_offset > 0, there is only 1 stripe so that we can treat the array same as 'near' arrays. Furthermore we could calculate new distance from the previous position even for the real 'far' array cases if the position of given disk is already in the lowest stripe. Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxx> --- drivers/md/raid10.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 6e846688962f..9ec4c5f8cd48 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -531,11 +531,19 @@ retry: break; /* for far > 1 always use the lowest address */ - if (conf->far_copies > 1) - new_distance = r10_bio->devs[slot].addr; - else + if (conf->far_copies > 1 && conf->far_offset == 0) { + if (conf->mirrors[disk].head_position < conf->stride && + r10_bio->devs[slot].addr < conf->stride) + /* already in the lowest stripe */ + new_distance = abs(r10_bio->devs[slot].addr - + conf->mirrors[disk].head_position); + else + new_distance = r10_bio->devs[slot].addr; + } else { new_distance = abs(r10_bio->devs[slot].addr - conf->mirrors[disk].head_position); + } + if (new_distance < best_dist) { best_dist = new_distance; best_slot = slot; -- 1.7.5.2 -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html