Date:2009-08-13 01:54:02 (14 years 1 month ago)
Message:md: never advance 'events' counter by more than 1.

When assembling arrays, md allows two devices to have different event
counts as long as the difference is only '1'. This is to cope with
a system failure between updating the metadata on two difference

However there are currently times when we update the event count by
2. This was done to keep the event count even when the array is clean
and odd when it is dirty, which allows us to avoid writing common
update to spare devices and so allow those spares to go to sleep.

This is bad for the above reason. So change it to never increase by
two. This means that the alignment between 'odd/even' and
'clean/dirty' might take a little longer to attain, but that is only a
small cost. The spares will get a few more updates but that will
still be spared (;-) most updates and can still go to sleep.

Prior to this patch there was a small chance that after a crash an
array would fail to assemble due to the overly large event count

Signed-off-by: NeilBrown <>
Files: drivers/md/md.c (1 diff)

Change Details

19751975        /* otherwise we have to go forward and ... */
19761976        mddev->events ++;
19771977        if (!mddev->in_sync || mddev->recovery_cp != MaxSector) { /* not clean */
1978            /* .. if the array isn't clean, insist on an odd 'events' */
1979            if ((mddev->events&1)==0) {
1980                mddev->events++;
1978            /* .. if the array isn't clean, an 'even' event must also go
1979             * to spares. */
1980            if ((mddev->events&1)==0)
19811981                nospares = 0;
1982            }
19831982        } else {
1984            /* otherwise insist on an even 'events' (for clean states) */
1985            if ((mddev->events&1)) {
1986                mddev->events++;
1983            /* otherwise an 'odd' event must go to spares */
1984            if ((mddev->events&1))
19871985                nospares = 0;
1988            }
19891986        }
19901987    }

Archive Download the corresponding diff file