diff options
author | Nate Dailey <nate.dailey@stratus.com> | 2017-11-30 17:33:30 +0100 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2017-12-01 21:19:47 +0100 |
commit | d2e2ec8222b4cb49c59f6dc6f5c4fe6fb4c80de9 (patch) | |
tree | 84c377a418d8bccf0b2a26185732aa0096d8273d /drivers/md/md.c | |
parent | md/r5cache: move mddev_lock() out of r5c_journal_mode_set() (diff) | |
download | linux-d2e2ec8222b4cb49c59f6dc6f5c4fe6fb4c80de9.tar.xz linux-d2e2ec8222b4cb49c59f6dc6f5c4fe6fb4c80de9.zip |
md: limit mdstat resync progress to max_sectors
There is a small window near the end of md_do_sync where mddev->curr_resync
can be equal to MaxSector.
If status_resync is called during this window, the resulting /proc/mdstat
output contains a HUGE number of = signs due to the very large curr_resync:
Personalities : [raid1]
md123 : active raid1 sdd3[2] sdb3[0]
204736 blocks super 1.0 [2/1] [U_]
[=====================================================================
... (82 MB more) ...
================>] recovery =429496729.3% (9223372036854775807/204736)
finish=0.2min speed=12796K/sec
bitmap: 0/1 pages [0KB], 65536KB chunk
Modify status_resync to ensure the resync variable doesn't exceed
the array's max_sectors.
Signed-off-by: Nate Dailey <nate.dailey@stratus.com>
Acked-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 41c050b59ec4..4e4dee0ec2de 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -7605,7 +7605,9 @@ static int status_resync(struct seq_file *seq, struct mddev *mddev) if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) /* Still cleaning up */ resync = max_sectors; - } else + } else if (resync > max_sectors) + resync = max_sectors; + else resync -= atomic_read(&mddev->recovery_active); if (resync == 0) { |