Skip to content

Commit

Permalink
md: Fix some bugs in recovery_disabled handling.
Browse files Browse the repository at this point in the history
In 3.0 we changed the way recovery_disabled was handle so that instead
of testing against zero, we test an mddev-> value against a conf->
value.
Two problems:
  1/ one place in raid1 was missed and still sets to '1'.
  2/ We didn't explicitly set the conf-> value at array creation
     time.
     It defaulted to '0' just like the mddev value does so they
     could appear equal and thus disable recovery.
     This did not affect normal 'md' as it calls bind_rdev_to_array
     which changes the mddev value.  However the dmraid interface
     doesn't call this and so doesn't change ->recovery_disabled; so at
     array start all recovery is incorrectly disabled.

So initialise the 'conf' value to one less that the mddev value, so
the will only be the same when explicitly set that way.

Reported-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: NeilBrown  <neilb@suse.de>
  • Loading branch information
NeilBrown committed Oct 26, 2011
1 parent 355840e commit d890fa2
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/md/raid1.c
Original file line number Diff line number Diff line change
Expand Up @@ -1519,7 +1519,8 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
abort = 1;
}
if (abort) {
mddev->recovery_disabled = 1;
conf->recovery_disabled =
mddev->recovery_disabled;
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
md_done_sync(mddev, r1_bio->sectors, 0);
put_buf(r1_bio);
Expand Down Expand Up @@ -2436,6 +2437,7 @@ static struct r1conf *setup_conf(struct mddev *mddev)

bio_list_init(&conf->pending_bio_list);
conf->pending_count = 0;
conf->recovery_disabled = mddev->recovery_disabled - 1;

conf->last_used = -1;
for (i = 0; i < conf->raid_disks; i++) {
Expand Down
2 changes: 2 additions & 0 deletions drivers/md/raid10.c
Original file line number Diff line number Diff line change
Expand Up @@ -1373,6 +1373,7 @@ static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev)
}

p->head_position = 0;
p->recovery_disabled = mddev->recovery_disabled - 1;
rdev->raid_disk = mirror;
err = 0;
if (rdev->saved_raid_disk != mirror)
Expand Down Expand Up @@ -2931,6 +2932,7 @@ static int run(struct mddev *mddev)
if (disk->rdev)
conf->fullsync = 1;
}
disk->recovery_disabled = mddev->recovery_disabled - 1;
}

if (mddev->recovery_cp != MaxSector)
Expand Down
1 change: 1 addition & 0 deletions drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -4591,6 +4591,7 @@ static struct r5conf *setup_conf(struct mddev *mddev)
atomic_set(&conf->preread_active_stripes, 0);
atomic_set(&conf->active_aligned_reads, 0);
conf->bypass_threshold = BYPASS_THRESHOLD;
conf->recovery_disabled = mddev->recovery_disabled - 1;

conf->raid_disks = mddev->raid_disks;
if (mddev->reshape_position == MaxSector)
Expand Down

0 comments on commit d890fa2

Please sign in to comment.