Commit da8c8281 authored by Jens Axboe's avatar Jens Axboe

Merge branch 'md-next' of git://git.kernel.org/pub/scm/linux/kernel/git/song/md into for-5.4/block

Pull MD fixes from Song.

* 'md-next' of git://git.kernel.org/pub/scm/linux/kernel/git/song/md:
  raid5 improve too many read errors msg by adding limits
  md: don't report active array_state until after revalidate_disk() completes.
  md: only call set_in_sync() when it is expected to succeed.
parents cecf5d87 0009fad0
...@@ -4179,7 +4179,7 @@ array_state_show(struct mddev *mddev, char *page) ...@@ -4179,7 +4179,7 @@ array_state_show(struct mddev *mddev, char *page)
{ {
enum array_state st = inactive; enum array_state st = inactive;
if (mddev->pers) if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags))
switch(mddev->ro) { switch(mddev->ro) {
case 1: case 1:
st = readonly; st = readonly;
...@@ -5776,9 +5776,6 @@ int md_run(struct mddev *mddev) ...@@ -5776,9 +5776,6 @@ int md_run(struct mddev *mddev)
md_update_sb(mddev, 0); md_update_sb(mddev, 0);
md_new_event(mddev); md_new_event(mddev);
sysfs_notify_dirent_safe(mddev->sysfs_state);
sysfs_notify_dirent_safe(mddev->sysfs_action);
sysfs_notify(&mddev->kobj, NULL, "degraded");
return 0; return 0;
bitmap_abort: bitmap_abort:
...@@ -5799,6 +5796,7 @@ static int do_md_run(struct mddev *mddev) ...@@ -5799,6 +5796,7 @@ static int do_md_run(struct mddev *mddev)
{ {
int err; int err;
set_bit(MD_NOT_READY, &mddev->flags);
err = md_run(mddev); err = md_run(mddev);
if (err) if (err)
goto out; goto out;
...@@ -5819,9 +5817,14 @@ static int do_md_run(struct mddev *mddev) ...@@ -5819,9 +5817,14 @@ static int do_md_run(struct mddev *mddev)
set_capacity(mddev->gendisk, mddev->array_sectors); set_capacity(mddev->gendisk, mddev->array_sectors);
revalidate_disk(mddev->gendisk); revalidate_disk(mddev->gendisk);
clear_bit(MD_NOT_READY, &mddev->flags);
mddev->changed = 1; mddev->changed = 1;
kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
sysfs_notify_dirent_safe(mddev->sysfs_state);
sysfs_notify_dirent_safe(mddev->sysfs_action);
sysfs_notify(&mddev->kobj, NULL, "degraded");
out: out:
clear_bit(MD_NOT_READY, &mddev->flags);
return err; return err;
} }
...@@ -8932,6 +8935,7 @@ void md_check_recovery(struct mddev *mddev) ...@@ -8932,6 +8935,7 @@ void md_check_recovery(struct mddev *mddev)
if (mddev_trylock(mddev)) { if (mddev_trylock(mddev)) {
int spares = 0; int spares = 0;
bool try_set_sync = mddev->safemode != 0;
if (!mddev->external && mddev->safemode == 1) if (!mddev->external && mddev->safemode == 1)
mddev->safemode = 0; mddev->safemode = 0;
...@@ -8977,7 +8981,7 @@ void md_check_recovery(struct mddev *mddev) ...@@ -8977,7 +8981,7 @@ void md_check_recovery(struct mddev *mddev)
} }
} }
if (!mddev->external && !mddev->in_sync) { if (try_set_sync && !mddev->external && !mddev->in_sync) {
spin_lock(&mddev->lock); spin_lock(&mddev->lock);
set_in_sync(mddev); set_in_sync(mddev);
spin_unlock(&mddev->lock); spin_unlock(&mddev->lock);
......
...@@ -248,6 +248,9 @@ enum mddev_flags { ...@@ -248,6 +248,9 @@ enum mddev_flags {
MD_UPDATING_SB, /* md_check_recovery is updating the metadata MD_UPDATING_SB, /* md_check_recovery is updating the metadata
* without explicitly holding reconfig_mutex. * without explicitly holding reconfig_mutex.
*/ */
MD_NOT_READY, /* do_md_run() is active, so 'array_state'
* must not report that array is ready yet
*/
}; };
enum mddev_sb_flags { enum mddev_sb_flags {
......
...@@ -2549,10 +2549,16 @@ static void raid5_end_read_request(struct bio * bi) ...@@ -2549,10 +2549,16 @@ static void raid5_end_read_request(struct bio * bi)
(unsigned long long)s, (unsigned long long)s,
bdn); bdn);
} else if (atomic_read(&rdev->read_errors) } else if (atomic_read(&rdev->read_errors)
> conf->max_nr_stripes) > conf->max_nr_stripes) {
pr_warn("md/raid:%s: Too many read errors, failing device %s.\n", if (!test_bit(Faulty, &rdev->flags)) {
mdname(conf->mddev), bdn); pr_warn("md/raid:%s: %d read_errors > %d stripes\n",
else mdname(conf->mddev),
atomic_read(&rdev->read_errors),
conf->max_nr_stripes);
pr_warn("md/raid:%s: Too many read errors, failing device %s.\n",
mdname(conf->mddev), bdn);
}
} else
retry = 1; retry = 1;
if (set_bad && test_bit(In_sync, &rdev->flags) if (set_bad && test_bit(In_sync, &rdev->flags)
&& !test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) && !test_bit(R5_ReadNoMerge, &sh->dev[i].flags))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment