summaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-05-26 12:41:08 +1000
committerNeilBrown <neilb@suse.de>2009-05-26 12:41:08 +1000
commit848b3182365fdf5a05bcd5ed949071cac2c894b3 (patch)
treecfb09457f8d8d582d443a92c2a47f1f9862a2036 /drivers/md
parentb6a9ce688f613e2ee5f15e6720e0bb8520efc36e (diff)
downloadlinux-stable-848b3182365fdf5a05bcd5ed949071cac2c894b3.tar.gz
linux-stable-848b3182365fdf5a05bcd5ed949071cac2c894b3.tar.bz2
linux-stable-848b3182365fdf5a05bcd5ed949071cac2c894b3.zip
md: raid5: avoid sector values going negative when testing reshape progress.
As sector_t in unsigned, we cannot afford to let 'safepos' etc go negative. So replace a -= b; by a -= min(b,a); Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid5.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 4616bc3a6e71..3c3626d2a1f9 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -3811,13 +3811,13 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped
safepos = conf->reshape_safe;
sector_div(safepos, data_disks);
if (mddev->delta_disks < 0) {
- writepos -= reshape_sectors;
+ writepos -= min(reshape_sectors, writepos);
readpos += reshape_sectors;
safepos += reshape_sectors;
} else {
writepos += reshape_sectors;
- readpos -= reshape_sectors;
- safepos -= reshape_sectors;
+ readpos -= min(reshape_sectors, readpos);
+ safepos -= min(reshape_sectors, safepos);
}
/* 'writepos' is the most advanced device address we might write.