diff options
author | NeilBrown <neilb@suse.com> | 2015-07-24 13:27:08 +1000 |
---|---|---|
committer | Sasha Levin <alexander.levin@verizon.com> | 2016-11-23 23:08:55 -0500 |
commit | debebae7513631270b3051dac8e5e7a0e3bdfe89 (patch) | |
tree | ac7fd667eeb3b5d1c7c44f58a69a6f729952f033 /drivers/md/md.c | |
parent | 98d446ef289ddce78684965745d34a28b05cfb34 (diff) | |
download | linux-rt-debebae7513631270b3051dac8e5e7a0e3bdfe89.tar.gz |
md: sync sync_completed has correct value as recovery finishes.
[ Upstream commit 5ed1df2eacc0ba92c8c7e2499c97594b5ef928a8 ]
There can be a small window between the moment that recovery
actually writes the last block and the time when various sysfs
and /proc/mdstat attributes report that it has finished.
During this time, 'sync_completed' can have the wrong value.
This can confuse monitoring software.
So:
- don't set curr_resync_completed beyond the end of the devices,
- set it correctly when resync/recovery has completed.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 3d2cc7453ec1..7987e87a1be0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -7409,6 +7409,9 @@ void md_do_sync(struct md_thread *thread) break; j += sectors; + if (j > max_sectors) + /* when skipping, extra large numbers can be returned. */ + j = max_sectors; if (j > 2) mddev->curr_resync = j; mddev->curr_mark_cnt = io_sectors; @@ -7468,6 +7471,12 @@ void md_do_sync(struct md_thread *thread) blk_finish_plug(&plug); wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); + if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && + !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && + mddev->curr_resync > 2) { + mddev->curr_resync_completed = mddev->curr_resync; + sysfs_notify(&mddev->kobj, NULL, "sync_completed"); + } /* tell personality that we are finished */ mddev->pers->sync_request(mddev, max_sectors, &skipped, 1); |