Unverified Commit 49f3cbc2 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!3827 backport mainline md patch

Merge Pull Request from: @ci-robot 
 
PR sync from: Li Nan <linan122@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/3MBEHV5PZTE3IMKY4T6KGBWSGOJCRHL6/ 
v2:
 - drop lts patches which have been merged.

Alex Lyakas (1):
  md: Whenassemble the array, consult the superblock of the freshest
    device

Denis Plotnikov (1):
  md-cluster: check for timeout while a new disk adding

Gou Hao (1):
  md/raid1: remove unnecessary null checking

Junxiao Bi (2):
  md: bypass block throttle for superblock update
  Revert "md/raid5: Wait for MD_SB_CHANGE_PENDING in raid5d"

Justin Stitt (1):
  md: replace deprecated strncpy with memcpy

Li Nan (2):
  md: factor out a helper exceed_read_errors() to check read_errors
  md/raid1: support read error check

Mariusz Tkaczyk (1):
  md: do not require mddev_lock() for all options in array_state_store()

Yu Kuai (46):
  md: use separate work_struct for md_start_sync()
  md: factor out a helper to choose sync action from md_check_recovery()
  md: delay choosing sync action to md_start_sync()
  md: factor out a helper rdev_removeable() from remove_and_add_spares()
  md: factor out a helper rdev_is_spare() from remove_and_add_spares()
  md: factor out a helper rdev_addable() from remove_and_add_spares()
  md: delay remove_and_add_spares() for read only array to
    md_start_sync()
  md: initialize 'active_io' while allocating mddev
  md: initialize 'writes_pending' while allocating mddev
  md-bitmap: remove the checking of 'pers->quiesce' from
    location_store()
  md-bitmap: suspend array earlier in location_store()
  md: don't check 'mddev->pers' from suspend_hi_store()
  md: don't check 'mddev->pers' and 'pers->quiesce' from
    suspend_lo_store()
  md: factor out a helper from mddev_put()
  md: simplify md_seq_ops
  md/raid1: don't split discard io for write behind
  md: use READ_ONCE/WRITE_ONCE for 'suspend_lo' and 'suspend_hi'
  md/raid5-cache: use READ_ONCE/WRITE_ONCE for 'conf->log'
  md: replace is_md_suspended() with 'mddev->suspended' in
    md_check_recovery()
  md: add new helpers to suspend/resume array
  md: add new helpers to suspend/resume and lock/unlock array
  md/dm-raid: use new apis to suspend array
  md/md-bitmap: use new apis to suspend array for location_store()
  md/raid5-cache: use new apis to suspend array
  md/raid5: use new apis to suspend array
  md: use new apis to suspend array for sysfs apis
  md: use new apis to suspend array for adding/removing rdev from
    state_store()
  md: use new apis to suspend array for ioctls involed array
    reconfiguration
  md: use new apis to suspend array before
    mddev_create/destroy_serial_pool
  md: cleanup mddev_create/destroy_serial_pool()
  md/md-linear: cleanup linear_add()
  md/raid5: replace suspend with quiesce() callback
  md: suspend array in md_start_sync() if array need reconfiguration
  md: remove old apis to suspend the array
  md: rename __mddev_suspend/resume() back to mddev_suspend/resume()
  md: cleanup pers->prepare_suspend()
  md: remove flag RemoveSynchronized
  md/raid10: remove rcu protection to access rdev from conf
  md/raid1: remove rcu protection to access rdev from conf
  md/raid5: remove rcu protection to access rdev from conf
  md/md-multipath: remove rcu protection to access rdev from conf
  md: synchronize flush io with array reconfiguration
  md: fix missing flush of sync_work
  md: fix stopping sync thread
  md: split MD_RECOVERY_NEEDED out of mddev_resume
  dm-raid: delay flushing event_work() after reconfig_mutex is released


-- 
2.39.2
 
https://gitee.com/openeuler/kernel/issues/I8T02O 
 
Link:https://gitee.com/openeuler/kernel/pulls/3827

 

Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarzhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parents e945027f b3623a92
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -749,7 +749,11 @@ static struct raid_set *raid_set_alloc(struct dm_target *ti, struct raid_type *r
		return ERR_PTR(-ENOMEM);
	}

	mddev_init(&rs->md);
	if (mddev_init(&rs->md)) {
		kfree(rs);
		ti->error = "Cannot initialize raid context";
		return ERR_PTR(-ENOMEM);
	}

	rs->raid_disks = raid_devs;
	rs->delta_disks = 0;
@@ -798,6 +802,7 @@ static void raid_set_free(struct raid_set *rs)
			dm_put_device(rs->ti, rs->dev[i].data_dev);
	}

	mddev_destroy(&rs->md);
	kfree(rs);
}

@@ -3239,7 +3244,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
	set_bit(MD_RECOVERY_FROZEN, &rs->md.recovery);

	/* Has to be held on running the array */
	mddev_lock_nointr(&rs->md);
	mddev_suspend_and_lock_nointr(&rs->md);
	r = md_run(&rs->md);
	rs->md.in_sync = 0; /* Assume already marked dirty */
	if (r) {
@@ -3263,7 +3268,6 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
		}
	}

	mddev_suspend(&rs->md);
	set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags);

	/* Try to adjust the raid4/5/6 stripe cache size to the stripe size */
@@ -3313,6 +3317,9 @@ static void raid_dtr(struct dm_target *ti)
	mddev_lock_nointr(&rs->md);
	md_stop(&rs->md);
	mddev_unlock(&rs->md);

	if (work_pending(&rs->md.event_work))
		flush_work(&rs->md.event_work);
	raid_set_free(rs);
}

@@ -3793,9 +3800,7 @@ static void raid_postsuspend(struct dm_target *ti)
		if (!test_bit(MD_RECOVERY_FROZEN, &rs->md.recovery))
			md_stop_writes(&rs->md);

		mddev_lock_nointr(&rs->md);
		mddev_suspend(&rs->md);
		mddev_unlock(&rs->md);
		mddev_suspend(&rs->md, false);
	}
}

@@ -4054,8 +4059,7 @@ static void raid_resume(struct dm_target *ti)
		clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
		mddev->ro = 0;
		mddev->in_sync = 0;
		mddev_resume(mddev);
		mddev_unlock(mddev);
		mddev_unlock_and_resume(mddev);
	}
}

+2 −2
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ static void __init md_setup_drive(struct md_setup_args *args)
		return;
	}

	err = mddev_lock(mddev);
	err = mddev_suspend_and_lock(mddev);
	if (err) {
		pr_err("md: failed to lock array %s\n", name);
		goto out_mddev_put;
@@ -221,7 +221,7 @@ static void __init md_setup_drive(struct md_setup_args *args)
	if (err)
		pr_warn("md: starting %s failed\n", name);
out_unlock:
	mddev_unlock(mddev);
	mddev_unlock_and_resume(mddev);
out_mddev_put:
	mddev_put(mddev);
}
+26 −35
Original line number Diff line number Diff line
@@ -1861,7 +1861,7 @@ void md_bitmap_destroy(struct mddev *mddev)

	md_bitmap_wait_behind_writes(mddev);
	if (!mddev->serialize_policy)
		mddev_destroy_serial_pool(mddev, NULL, true);
		mddev_destroy_serial_pool(mddev, NULL);

	mutex_lock(&mddev->bitmap_info.mutex);
	spin_lock(&mddev->lock);
@@ -1977,7 +1977,7 @@ int md_bitmap_load(struct mddev *mddev)
		goto out;

	rdev_for_each(rdev, mddev)
		mddev_create_serial_pool(mddev, rdev, true);
		mddev_create_serial_pool(mddev, rdev);

	if (mddev_is_clustered(mddev))
		md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes);
@@ -2348,14 +2348,11 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
{
	int rv;

	rv = mddev_lock(mddev);
	rv = mddev_suspend_and_lock(mddev);
	if (rv)
		return rv;

	if (mddev->pers) {
		if (!mddev->pers->quiesce) {
			rv = -EBUSY;
			goto out;
		}
		if (mddev->recovery || mddev->sync_thread) {
			rv = -EBUSY;
			goto out;
@@ -2369,11 +2366,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
			rv = -EBUSY;
			goto out;
		}
		if (mddev->pers) {
			mddev_suspend(mddev);

		md_bitmap_destroy(mddev);
			mddev_resume(mddev);
		}
		mddev->bitmap_info.offset = 0;
		if (mddev->bitmap_info.file) {
			struct file *f = mddev->bitmap_info.file;
@@ -2383,6 +2377,8 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
	} else {
		/* No bitmap, OK to set a location */
		long long offset;
		struct bitmap *bitmap;

		if (strncmp(buf, "none", 4) == 0)
			/* nothing to be done */;
		else if (strncmp(buf, "file:", 5) == 0) {
@@ -2406,26 +2402,21 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
				rv = -EINVAL;
				goto out;
			}

			mddev->bitmap_info.offset = offset;
			if (mddev->pers) {
				struct bitmap *bitmap;
			bitmap = md_bitmap_create(mddev, -1);
				mddev_suspend(mddev);
				if (IS_ERR(bitmap))
			if (IS_ERR(bitmap)) {
				rv = PTR_ERR(bitmap);
				else {
				goto out;
			}

			mddev->bitmap = bitmap;
			rv = md_bitmap_load(mddev);
					if (rv)
						mddev->bitmap_info.offset = 0;
				}
			if (rv) {
				mddev->bitmap_info.offset = 0;
				md_bitmap_destroy(mddev);
					mddev_resume(mddev);
				goto out;
			}
				mddev_resume(mddev);
			}
		}
	}
	if (!mddev->external) {
@@ -2437,7 +2428,7 @@ location_store(struct mddev *mddev, const char *buf, size_t len)
	}
	rv = 0;
out:
	mddev_unlock(mddev);
	mddev_unlock_and_resume(mddev);
	if (rv)
		return rv;
	return len;
@@ -2546,7 +2537,7 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)
	if (backlog > COUNTER_MAX)
		return -EINVAL;

	rv = mddev_lock(mddev);
	rv = mddev_suspend_and_lock(mddev);
	if (rv)
		return rv;

@@ -2571,16 +2562,16 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)
	if (!backlog && mddev->serial_info_pool) {
		/* serial_info_pool is not needed if backlog is zero */
		if (!mddev->serialize_policy)
			mddev_destroy_serial_pool(mddev, NULL, false);
			mddev_destroy_serial_pool(mddev, NULL);
	} else if (backlog && !mddev->serial_info_pool) {
		/* serial_info_pool is needed since backlog is not zero */
		rdev_for_each(rdev, mddev)
			mddev_create_serial_pool(mddev, rdev, false);
			mddev_create_serial_pool(mddev, rdev);
	}
	if (old_mwb != backlog)
		md_bitmap_update_sb(mddev->bitmap);

	mddev_unlock(mddev);
	mddev_unlock_and_resume(mddev);
	return len;
}

+11 −4
Original line number Diff line number Diff line
@@ -501,7 +501,7 @@ static void process_suspend_info(struct mddev *mddev,
	mddev->pers->quiesce(mddev, 0);
}

static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
static int process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
{
	char disk_uuid[64];
	struct md_cluster_info *cinfo = mddev->cluster_info;
@@ -509,6 +509,7 @@ static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
	char raid_slot[16];
	char *envp[] = {event_name, disk_uuid, raid_slot, NULL};
	int len;
	int res = 0;

	len = snprintf(disk_uuid, 64, "DEVICE_UUID=");
	sprintf(disk_uuid + len, "%pU", cmsg->uuid);
@@ -517,9 +518,14 @@ static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
	init_completion(&cinfo->newdisk_completion);
	set_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
	kobject_uevent_env(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE, envp);
	wait_for_completion_timeout(&cinfo->newdisk_completion,
			NEW_DEV_TIMEOUT);
	if (!wait_for_completion_timeout(&cinfo->newdisk_completion,
					NEW_DEV_TIMEOUT)) {
		pr_err("md-cluster(%s:%d): timeout on a new disk adding\n",
			__func__, __LINE__);
		res = -1;
	}
	clear_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
	return res;
}


@@ -594,7 +600,8 @@ static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
				     le64_to_cpu(msg->high));
		break;
	case NEWDISK:
		process_add_new_disk(mddev, msg);
		if (process_add_new_disk(mddev, msg))
			ret = -1;
		break;
	case REMOVE:
		process_remove_disk(mddev, msg);
+0 −2
Original line number Diff line number Diff line
@@ -183,7 +183,6 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
	 * in linear_congested(), therefore kfree_rcu() is used to free
	 * oldconf until no one uses it anymore.
	 */
	mddev_suspend(mddev);
	oldconf = rcu_dereference_protected(mddev->private,
			lockdep_is_held(&mddev->reconfig_mutex));
	mddev->raid_disks++;
@@ -192,7 +191,6 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
	rcu_assign_pointer(mddev->private, newconf);
	md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
	set_capacity_and_notify(mddev->gendisk, mddev->array_sectors);
	mddev_resume(mddev);
	kfree_rcu(oldconf, rcu);
	return 0;
}
Loading