• Nikos Tsironis's avatar
    dm era: Recover committed writeset after crash · de89afc1
    Nikos Tsironis authored
    Following a system crash, dm-era fails to recover the committed writeset
    for the current era, leading to lost writes. That is, we lose the
    information about what blocks were written during the affected era.
    
    dm-era assumes that the writeset of the current era is archived when the
    device is suspended. So, when resuming the device, it just moves on to
    the next era, ignoring the committed writeset.
    
    This assumption holds when the device is properly shut down. But, when
    the system crashes, the code that suspends the target never runs, so the
    writeset for the current era is not archived.
    
    There are three issues that cause the committed writeset to get lost:
    
    1. dm-era doesn't load the committed writeset when opening the metadata
    2. The code that resizes the metadata wipes the information about the
       committed writeset (assuming it was loaded at step 1)
    3. era_preresume() starts a new era, without taking into account that
       the current era might not have been archived, due to a system crash.
    
    To fix this:
    
    1. Load the committed writeset when opening the metadata
    2. Fix the code that resizes the metadata to make sure it doesn't wipe
       the loaded writeset
    3. Fix era_preresume() to check for a loaded writeset and archive it,
       before starting a new era.
    
    Fixes: eec40579 ("dm: add era target")
    Cc: stable@vger.kernel.org # v3.15+
    Signed-off-by: default avatarNikos Tsironis <ntsironis@arrikto.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    de89afc1
dm-era-target.c 37.6 KB