mdadm: set journal_clean after scanning all disks
Summary: In Incremental.c:count_active(), max_events is tracked to show to which devices are up to date. If a device has events==max_events+1, getinfo_super() is called to reload the superblock from this device. getinfo_super1() blindly set journal_clean to 0, which is wrong. This patch fixes this by tracking max_journal_events for all the disks. After scanning all disks, journal_clean is set if max_journal_events >= max_events-1. Signed-off-by: Song Liu <songliubraving@fb.com> Reviewed-by: NeilBrown <neilb@suse.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
52f6a11ec8
commit
3b8c712755
|
@ -684,6 +684,7 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
|
|||
int cnt = 0;
|
||||
int replcnt = 0;
|
||||
__u64 max_events = 0;
|
||||
__u64 max_journal_events = 0;
|
||||
char *avail = NULL;
|
||||
int *best = NULL;
|
||||
char *devmap = NULL;
|
||||
|
@ -714,8 +715,9 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
|
|||
|
||||
info.array.raid_disks = raid_disks;
|
||||
st->ss->getinfo_super(st, &info, devmap + raid_disks * devnum);
|
||||
if (info.disk.raid_disk == MD_DISK_ROLE_JOURNAL)
|
||||
bestinfo->journal_clean = 1;
|
||||
if (info.disk.raid_disk == MD_DISK_ROLE_JOURNAL &&
|
||||
info.events > max_journal_events)
|
||||
max_journal_events = info.events;
|
||||
if (!avail) {
|
||||
raid_disks = info.array.raid_disks;
|
||||
avail = xcalloc(raid_disks, 1);
|
||||
|
@ -765,6 +767,8 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
|
|||
replcnt++;
|
||||
st->ss->free_super(st);
|
||||
}
|
||||
if (max_journal_events >= max_events - 1)
|
||||
bestinfo->journal_clean = 1;
|
||||
|
||||
if (!avail)
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue