• Neil Brown's avatar
    Improve setting of "events_cleared" for write-intent bitmaps. · a0da84f3
    Neil Brown authored
    When an array is degraded, bits in the write-intent bitmap are not
    cleared, so that if the missing device is re-added, it can be synced
    by only updated those parts of the device that have changed since
    it was removed.
    
    The enable this a 'events_cleared' value is stored. It is the event
    counter for the array the last time that any bits were cleared.
    
    Sometimes - if a device disappears from an array while it is 'clean' -
    the events_cleared value gets updated incorrectly (there are subtle
    ordering issues between updateing events in the main metadata and the
    bitmap metadata) resulting in the missing device appearing to require
    a full resync when it is re-added.
    
    With this patch, we update events_cleared precisely when we are about
    to clear a bit in the bitmap.  We record events_cleared when we clear
    the bit internally, and copy that to the superblock which is written
    out before the bit on storage.  This makes it more "obviously correct".
    
    We also need to update events_cleared when the event_count is going
    backwards (as happens on a dirty->clean transition of a non-degraded
    array).
    
    Thanks to Mike Snitzer for identifying this problem and testing early
    "fixes".
    
    Cc:  "Mike Snitzer" <snitzer@gmail.com>
    Signed-off-by: default avatarNeil Brown <neilb@suse.de>
    a0da84f3
bitmap.c 41.9 KB