diff options
author | Shaohua Li <shli@fb.com> | 2015-09-02 22:49:50 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.com> | 2015-11-01 03:48:26 +0100 |
commit | bd18f6462f3d167a9b3ec27851c98f82694b2adf (patch) | |
tree | 8c844bcfd5985c9f2f27183f38eca68dbef8318e /drivers | |
parent | raid5-cache: optimize FLUSH IO with log enabled (diff) | |
download | linux-bd18f6462f3d167a9b3ec27851c98f82694b2adf.tar.xz linux-bd18f6462f3d167a9b3ec27851c98f82694b2adf.zip |
md: skip resync for raid array with journal
If a raid array has journal, the journal can guarantee the consistency,
we can skip resync after a unclean shutdown. The exception is raid
creation or user initiated resync, which we still do a raid resync.
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/md.c | 4 | ||||
-rw-r--r-- | drivers/md/md.h | 1 |
2 files changed, 5 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 3592beb6931e..89149acd8a5e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1647,6 +1647,8 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) } set_bit(Journal, &rdev->flags); rdev->journal_tail = le64_to_cpu(sb->journal_tail); + if (mddev->recovery_cp == MaxSector) + set_bit(MD_JOURNAL_CLEAN, &mddev->flags); break; default: rdev->saved_raid_disk = role; @@ -1689,6 +1691,8 @@ static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev) sb->events = cpu_to_le64(mddev->events); if (mddev->in_sync) sb->resync_offset = cpu_to_le64(mddev->recovery_cp); + else if (test_bit(MD_JOURNAL_CLEAN, &mddev->flags)) + sb->resync_offset = cpu_to_le64(MaxSector); else sb->resync_offset = cpu_to_le64(0); diff --git a/drivers/md/md.h b/drivers/md/md.h index 2b0f62fb6146..e14e667a20e9 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -232,6 +232,7 @@ struct mddev { #define MD_STILL_CLOSED 4 /* If set, then array has not been opened since * md_ioctl checked on it. */ +#define MD_JOURNAL_CLEAN 5 /* A raid with journal is already clean */ int suspended; atomic_t active_io; |