mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 18:26:42 +00:00
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.
This commit is contained in:
commit
da8c828190
@ -4179,7 +4179,7 @@ array_state_show(struct mddev *mddev, char *page)
|
||||
{
|
||||
enum array_state st = inactive;
|
||||
|
||||
if (mddev->pers)
|
||||
if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags))
|
||||
switch(mddev->ro) {
|
||||
case 1:
|
||||
st = readonly;
|
||||
@ -5776,9 +5776,6 @@ int md_run(struct mddev *mddev)
|
||||
md_update_sb(mddev, 0);
|
||||
|
||||
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;
|
||||
|
||||
bitmap_abort:
|
||||
@ -5799,6 +5796,7 @@ static int do_md_run(struct mddev *mddev)
|
||||
{
|
||||
int err;
|
||||
|
||||
set_bit(MD_NOT_READY, &mddev->flags);
|
||||
err = md_run(mddev);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -5819,9 +5817,14 @@ static int do_md_run(struct mddev *mddev)
|
||||
|
||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||
revalidate_disk(mddev->gendisk);
|
||||
clear_bit(MD_NOT_READY, &mddev->flags);
|
||||
mddev->changed = 1;
|
||||
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:
|
||||
clear_bit(MD_NOT_READY, &mddev->flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -8932,6 +8935,7 @@ void md_check_recovery(struct mddev *mddev)
|
||||
|
||||
if (mddev_trylock(mddev)) {
|
||||
int spares = 0;
|
||||
bool try_set_sync = mddev->safemode != 0;
|
||||
|
||||
if (!mddev->external && mddev->safemode == 1)
|
||||
mddev->safemode = 0;
|
||||
@ -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);
|
||||
set_in_sync(mddev);
|
||||
spin_unlock(&mddev->lock);
|
||||
|
@ -248,6 +248,9 @@ enum mddev_flags {
|
||||
MD_UPDATING_SB, /* md_check_recovery is updating the metadata
|
||||
* 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 {
|
||||
|
@ -2549,10 +2549,16 @@ static void raid5_end_read_request(struct bio * bi)
|
||||
(unsigned long long)s,
|
||||
bdn);
|
||||
} else if (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
|
||||
> conf->max_nr_stripes) {
|
||||
if (!test_bit(Faulty, &rdev->flags)) {
|
||||
pr_warn("md/raid:%s: %d read_errors > %d stripes\n",
|
||||
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;
|
||||
if (set_bad && test_bit(In_sync, &rdev->flags)
|
||||
&& !test_bit(R5_ReadNoMerge, &sh->dev[i].flags))
|
||||
|
Loading…
x
Reference in New Issue
Block a user