Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da8c8281 authored by Jens Axboe's avatar Jens Axboe
Browse files

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
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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 {
+10 −4
Original line number Diff line number Diff line
@@ -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)
			 > 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
			}
		} else
			retry = 1;
		if (set_bad && test_bit(In_sync, &rdev->flags)
		    && !test_bit(R5_ReadNoMerge, &sh->dev[i].flags))