Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md: Update checkpoint of resync/recovery based on time.

md will current only only checkpoint recovery or resync ever 1/16th
of the device size. As devices get larger this can become a long time
an so a lot of work that might need to be duplicated after a shutdown.

So add a time-based checkpoint. Every 5 minutes limits the amount of
duplicated effort to at most 5 minutes, and has almost zero impact on
performance.

[changelog entry re-written by NeilBrown]

Signed-off-by: Jianpeng Ma <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>

authored by

majianpeng and committed by
NeilBrown
54f89341 35d78c66

+5
+5
drivers/md/md.c
··· 7277 7277 7278 7278 #define SYNC_MARKS 10 7279 7279 #define SYNC_MARK_STEP (3*HZ) 7280 + #define UPDATE_FREQUENCY (5*60*HZ) 7280 7281 void md_do_sync(struct md_thread *thread) 7281 7282 { 7282 7283 struct mddev *mddev = thread->mddev; ··· 7286 7285 window; 7287 7286 sector_t max_sectors,j, io_sectors; 7288 7287 unsigned long mark[SYNC_MARKS]; 7288 + unsigned long update_time; 7289 7289 sector_t mark_cnt[SYNC_MARKS]; 7290 7290 int last_mark,m; 7291 7291 struct list_head *tmp; ··· 7446 7444 mddev->curr_resync_completed = j; 7447 7445 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); 7448 7446 md_new_event(mddev); 7447 + update_time = jiffies; 7449 7448 7450 7449 blk_start_plug(&plug); 7451 7450 while (j < max_sectors) { ··· 7458 7455 ((mddev->curr_resync > mddev->curr_resync_completed && 7459 7456 (mddev->curr_resync - mddev->curr_resync_completed) 7460 7457 > (max_sectors >> 4)) || 7458 + time_after_eq(jiffies, update_time + UPDATE_FREQUENCY) || 7461 7459 (j - mddev->curr_resync_completed)*2 7462 7460 >= mddev->resync_max - mddev->curr_resync_completed 7463 7461 )) { ··· 7469 7465 if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) && 7470 7466 j > mddev->recovery_cp) 7471 7467 mddev->recovery_cp = j; 7468 + update_time = jiffies; 7472 7469 set_bit(MD_CHANGE_CLEAN, &mddev->flags); 7473 7470 sysfs_notify(&mddev->kobj, NULL, "sync_completed"); 7474 7471 }