• Mikulas Patocka's avatar
    dm snapshot: suspend origin when doing exception handover · b735fede
    Mikulas Patocka authored
    In the function snapshot_resume we perform exception store handover.  If
    there is another active snapshot target, the exception store is moved
    from this target to the target that is being resumed.
    
    The problem is that if there is some pending exception, it will point to
    an incorrect exception store after that handover, causing a crash due to
    dm-snap-persistent.c:get_exception()'s BUG_ON.
    
    This bug can be triggered by repeatedly changing snapshot permissions
    with "lvchange -p r" and "lvchange -p rw" while there are writes on the
    associated origin device.
    
    To fix this bug, we must suspend the origin device when doing the
    exception store handover to make sure that there are no pending
    exceptions:
    - introduce _origin_hash that keeps track of dm_origin structures.
    - introduce functions __lookup_dm_origin, __insert_dm_origin and
      __remove_dm_origin that manipulate the origin hash.
    - modify snapshot_resume so that it calls dm_internal_suspend_fast() and
      dm_internal_resume_fast() on the origin device.
    
    NOTE to stable@ people:
    
    When backporting to kernels 3.12-3.18, use dm_internal_suspend and
    dm_internal_resume instead of dm_internal_suspend_fast and
    dm_internal_resume_fast.
    
    When backporting to kernels older than 3.12, you need to pick functions
    dm_internal_suspend and dm_internal_resume from the commit
    fd2ed4d2.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Cc: stable@vger.kernel.org
    b735fede
dm.c 76.3 KB