diff options
author | NeilBrown <neilb@suse.de> | 2009-03-31 15:27:18 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-03-31 15:27:18 +1100 |
commit | b0f9ec047b79a92e8b8a9dfbf97537c8fbef234a (patch) | |
tree | 2761193e869ed51d08674c39ed3df105cd91f4de /drivers | |
parent | 2cffc4a01dd90a502324e3453d7b245d6d16e1c2 (diff) | |
download | linux-3.10-b0f9ec047b79a92e8b8a9dfbf97537c8fbef234a.tar.gz linux-3.10-b0f9ec047b79a92e8b8a9dfbf97537c8fbef234a.tar.bz2 linux-3.10-b0f9ec047b79a92e8b8a9dfbf97537c8fbef234a.zip |
md/raid5: minor code cleanups in make_request.
... and to be certain the that make_request doesn't wait forever,
add a 'wake_up' when ->reshape_progress has been set to MaxSector
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/raid5.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index fb11c13eb69..bb4b12e370d 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3637,10 +3637,9 @@ static int make_request(struct request_queue *q, struct bio * bi) retry: previous = 0; + disks = conf->raid_disks; prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE); - if (likely(conf->reshape_progress == MaxSector)) - disks = conf->raid_disks; - else { + if (unlikely(conf->reshape_progress != MaxSector)) { /* spinlock is needed as reshape_progress may be * 64bit on a 32bit platform, and so it might be * possible to see a half-updated value @@ -3650,7 +3649,6 @@ static int make_request(struct request_queue *q, struct bio * bi) * to check again. */ spin_lock_irq(&conf->device_lock); - disks = conf->raid_disks; if (mddev->delta_disks < 0 ? logical_sector < conf->reshape_progress : logical_sector >= conf->reshape_progress) { @@ -3679,7 +3677,7 @@ static int make_request(struct request_queue *q, struct bio * bi) sh = get_active_stripe(conf, new_sector, previous, (bi->bi_rw&RWA_MASK)); if (sh) { - if (unlikely(conf->reshape_progress != MaxSector)) { + if (unlikely(previous)) { /* expansion might have moved on while waiting for a * stripe, so we must do the range check again. * Expansion could still move past after this @@ -3690,10 +3688,9 @@ static int make_request(struct request_queue *q, struct bio * bi) */ int must_retry = 0; spin_lock_irq(&conf->device_lock); - if ((mddev->delta_disks < 0 - ? logical_sector >= conf->reshape_progress - : logical_sector < conf->reshape_progress) - && previous) + if (mddev->delta_disks < 0 + ? logical_sector >= conf->reshape_progress + : logical_sector < conf->reshape_progress) /* mismatch, need to try again */ must_retry = 1; spin_unlock_irq(&conf->device_lock); @@ -4977,6 +4974,7 @@ static void end_reshape(raid5_conf_t *conf) conf->previous_raid_disks = conf->raid_disks; conf->reshape_progress = MaxSector; spin_unlock_irq(&conf->device_lock); + wake_up(&conf->wait_for_overlap); /* read-ahead size must cover two whole stripes, which is * 2 * (datadisks) * chunksize where 'n' is the number of raid devices |