diff options
author | NeilBrown <neilb@suse.com> | 2015-07-15 09:54:15 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.com> | 2015-08-31 19:36:06 +0200 |
commit | c74c0d760e30f56f9699dc180036ca37993d1c58 (patch) | |
tree | c064932e8affe59739303ad7bed313ce3662efcf /drivers/md | |
parent | md/raid5: strengthen check on reshape_position at run. (diff) | |
download | linux-c74c0d760e30f56f9699dc180036ca37993d1c58.tar.xz linux-c74c0d760e30f56f9699dc180036ca37993d1c58.zip |
md/raid5: remove incorrect "min_t()" when calculating writepos.
This code is calculating:
writepos, which is the furthest along address (device-space) that we
*will* be writing to
readpos, which is the earliest address that we *could* possible read
from, and
safepos, which is the earliest address in the 'old' section that we
might read from after a crash when the reshape position is
recovered from metadata.
The first is a precise calculation, so clipping at zero doesn't
make sense. As the reshape position is now guaranteed to always be
a multiple of reshape_sectors and as we already BUG_ON when
reshape_progress is zero, there is no point in this min_t() call.
The readpos and safepos are worst case - actual value depends on
precise geometry. That worst case could be negative, which is only
a problem because we are storing the value in an unsigned.
So leave the min_t() for those.
Signed-off-by: NeilBrown <neilb@suse.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index e95219bf8859..19bbdbe1a52f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -5388,11 +5388,16 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk safepos = conf->reshape_safe; sector_div(safepos, data_disks); if (mddev->reshape_backwards) { - writepos -= min_t(sector_t, reshape_sectors, writepos); + BUG_ON(writepos < reshape_sectors); + writepos -= reshape_sectors; readpos += reshape_sectors; safepos += reshape_sectors; } else { writepos += reshape_sectors; + /* readpos and safepos are worst-case calculations. + * A negative number is overly pessimistic, and causes + * obvious problems for unsigned storage. So clip to 0. + */ readpos -= min_t(sector_t, reshape_sectors, readpos); safepos -= min_t(sector_t, reshape_sectors, safepos); } |