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

Commit c622ca54 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Shaohua Li
Browse files

md: don't print the same repeated messages about delayed sync operation



This fixes a long-standing bug that caused a flood of messages like:
"md: delaying data-check of md1 until md2 has finished (they share one
or more physical units)"

It can be reproduced like this:
1. Create at least 3 raid1 arrays on a pair of disks, each on different
   partitions.
2. Request a sync operation like 'check' or 'repair' on 2 arrays by
   writing to their md/sync_action attribute files. One operation should
   start and one should be delayed and a message like the above will be
   printed.
3. Issue a write to the third array. Each write will cause 2 copies of
   the message to be printed.

This happens when wake_up(&resync_wait) is called, usually by
md_check_recovery(). Then the delayed sync thread again prints the
message and is put to sleep. This patch adds a check in md_do_sync() to
prevent printing this message more than once for the same pair of
devices.

Reported-by: default avatarSven Koehler <sven.koehler@gmail.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=151801


Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent 207efcd2
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -7865,6 +7865,7 @@ void md_do_sync(struct md_thread *thread)
	 */

	do {
		int mddev2_minor = -1;
		mddev->curr_resync = 2;

	try_again:
@@ -7894,10 +7895,14 @@ void md_do_sync(struct md_thread *thread)
				prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
				if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
				    mddev2->curr_resync >= mddev->curr_resync) {
					if (mddev2_minor != mddev2->md_minor) {
						mddev2_minor = mddev2->md_minor;
						printk(KERN_INFO "md: delaying %s of %s"
						       " until %s has finished (they"
						       " share one or more physical units)\n",
					       desc, mdname(mddev), mdname(mddev2));
						       desc, mdname(mddev),
						       mdname(mddev2));
					}
					mddev_put(mddev2);
					if (signal_pending(current))
						flush_signals(current);