md: separate flags for superblock changes
The mddev->flags are used for different purposes. There are a lot of places we check/change the flags without masking unrelated flags, we could check/change unrelated flags. These usage are most for superblock write, so spearate superblock related flags. This should make the code clearer and also fix real bugs. Reviewed-by: NeilBrown <neilb@suse.com> Signed-off-by: Shaohua Li <shli@fb.com>
This commit is contained in:
@@ -961,7 +961,7 @@ again:
|
||||
if (bad < 0) {
|
||||
set_bit(BlockedBadBlocks, &rdev->flags);
|
||||
if (!conf->mddev->external &&
|
||||
conf->mddev->flags) {
|
||||
conf->mddev->sb_flags) {
|
||||
/* It is very unlikely, but we might
|
||||
* still need to write out the
|
||||
* bad block log - better give it
|
||||
@@ -2547,8 +2547,8 @@ static void raid5_error(struct mddev *mddev, struct md_rdev *rdev)
|
||||
|
||||
set_bit(Blocked, &rdev->flags);
|
||||
set_bit(Faulty, &rdev->flags);
|
||||
set_mask_bits(&mddev->flags, 0,
|
||||
BIT(MD_CHANGE_DEVS) | BIT(MD_CHANGE_PENDING));
|
||||
set_mask_bits(&mddev->sb_flags, 0,
|
||||
BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING));
|
||||
pr_crit("md/raid:%s: Disk failure on %s, disabling device.\n"
|
||||
"md/raid:%s: Operation continuing on %d devices.\n",
|
||||
mdname(mddev),
|
||||
@@ -4761,7 +4761,7 @@ finish:
|
||||
}
|
||||
|
||||
if (!bio_list_empty(&s.return_bi)) {
|
||||
if (test_bit(MD_CHANGE_PENDING, &conf->mddev->flags)) {
|
||||
if (test_bit(MD_SB_CHANGE_PENDING, &conf->mddev->sb_flags)) {
|
||||
spin_lock_irq(&conf->device_lock);
|
||||
bio_list_merge(&conf->return_bi, &s.return_bi);
|
||||
spin_unlock_irq(&conf->device_lock);
|
||||
@@ -5617,9 +5617,9 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
|
||||
mddev->reshape_position = conf->reshape_progress;
|
||||
mddev->curr_resync_completed = sector_nr;
|
||||
conf->reshape_checkpoint = jiffies;
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
||||
md_wakeup_thread(mddev->thread);
|
||||
wait_event(mddev->sb_wait, mddev->flags == 0 ||
|
||||
wait_event(mddev->sb_wait, mddev->sb_flags == 0 ||
|
||||
test_bit(MD_RECOVERY_INTR, &mddev->recovery));
|
||||
if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
|
||||
return 0;
|
||||
@@ -5715,10 +5715,10 @@ finish:
|
||||
mddev->reshape_position = conf->reshape_progress;
|
||||
mddev->curr_resync_completed = sector_nr;
|
||||
conf->reshape_checkpoint = jiffies;
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
||||
md_wakeup_thread(mddev->thread);
|
||||
wait_event(mddev->sb_wait,
|
||||
!test_bit(MD_CHANGE_DEVS, &mddev->flags)
|
||||
!test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)
|
||||
|| test_bit(MD_RECOVERY_INTR, &mddev->recovery));
|
||||
if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
|
||||
goto ret;
|
||||
@@ -5993,10 +5993,10 @@ static void raid5d(struct md_thread *thread)
|
||||
md_check_recovery(mddev);
|
||||
|
||||
if (!bio_list_empty(&conf->return_bi) &&
|
||||
!test_bit(MD_CHANGE_PENDING, &mddev->flags)) {
|
||||
!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) {
|
||||
struct bio_list tmp = BIO_EMPTY_LIST;
|
||||
spin_lock_irq(&conf->device_lock);
|
||||
if (!test_bit(MD_CHANGE_PENDING, &mddev->flags)) {
|
||||
if (!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) {
|
||||
bio_list_merge(&tmp, &conf->return_bi);
|
||||
bio_list_init(&conf->return_bi);
|
||||
}
|
||||
@@ -6043,7 +6043,7 @@ static void raid5d(struct md_thread *thread)
|
||||
break;
|
||||
handled += batch_size;
|
||||
|
||||
if (mddev->flags & ~(1<<MD_CHANGE_PENDING)) {
|
||||
if (mddev->sb_flags & ~(1 << MD_SB_CHANGE_PENDING)) {
|
||||
spin_unlock_irq(&conf->device_lock);
|
||||
md_check_recovery(mddev);
|
||||
spin_lock_irq(&conf->device_lock);
|
||||
@@ -7640,7 +7640,7 @@ static int raid5_start_reshape(struct mddev *mddev)
|
||||
}
|
||||
mddev->raid_disks = conf->raid_disks;
|
||||
mddev->reshape_position = conf->reshape_progress;
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
||||
|
||||
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
||||
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
||||
@@ -7906,7 +7906,7 @@ static int raid5_check_reshape(struct mddev *mddev)
|
||||
conf->chunk_sectors = new_chunk ;
|
||||
mddev->chunk_sectors = new_chunk;
|
||||
}
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
|
||||
md_wakeup_thread(mddev->thread);
|
||||
}
|
||||
return check_reshape(mddev);
|
||||
|
Reference in New Issue
Block a user