md: Recovery speed is wrong
authorXiao Ni <xni@redhat.com>
Thu, 7 Aug 2014 13:37:41 +0000 (09:37 -0400)
committerNeilBrown <neilb@suse.de>
Fri, 8 Aug 2014 02:11:25 +0000 (12:11 +1000)
When we calculate the speed of recovery, the numerator that contains
the recovery done sectors.  It's need to subtract the sectors which
don't finish recovery.

Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index 1379b1a..eb8c93d 100644 (file)
@@ -7376,7 +7376,7 @@ void md_do_sync(struct md_thread *thread)
        struct mddev *mddev2;
        unsigned int currspeed = 0,
                 window;
-       sector_t max_sectors,j, io_sectors;
+       sector_t max_sectors,j, io_sectors, recovery_done;
        unsigned long mark[SYNC_MARKS];
        unsigned long update_time;
        sector_t mark_cnt[SYNC_MARKS];
@@ -7652,7 +7652,8 @@ void md_do_sync(struct md_thread *thread)
                 */
                cond_resched();
 
-               currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2
+               recovery_done = io_sectors - atomic_read(&mddev->recovery_active);
+               currspeed = ((unsigned long)(recovery_done - mddev->resync_mark_cnt))/2
                        /((jiffies-mddev->resync_mark)/HZ +1) +1;
 
                if (currspeed > speed_min(mddev)) {