md: skip resync for raid array with journal
authorShaohua Li <shli@fb.com>
Wed, 2 Sep 2015 20:49:50 +0000 (13:49 -0700)
committerNeilBrown <neilb@suse.com>
Sun, 1 Nov 2015 02:48:26 +0000 (13:48 +1100)
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>
drivers/md/md.c
drivers/md/md.h

index 3592beb..89149ac 100644 (file)
@@ -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);
 
index 2b0f62f..e14e667 100644 (file)
@@ -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;