• Joe Thornber's avatar
    dm thin: fix discard support to a previously shared block · 19fa1a67
    Joe Thornber authored
    If a snapshot is created and later deleted the origin dm_thin_device's
    snapshotted_time will have been updated to reflect the snapshot's
    creation time.  The 'shared' flag in the dm_thin_lookup_result struct
    returned from dm_thin_find_block() is an approximation based on
    snapshotted_time -- this is done to avoid 0(n), or worse, time
    complexity.  In this case, the shared flag would be true.
    
    But because the 'shared' flag reflects an approximation a block can be
    incorrectly assumed to be shared (e.g. false positive for 'shared'
    because the snapshot no longer exists).  This could result in discards
    issued to a thin device not being passed down to the pool's underlying
    data device.
    
    To fix this we double check that a thin block is really still in-use
    after a mapping is removed using dm_pool_block_is_used().  If the
    reference count for a block is now zero the discard is allowed to be
    passed down.
    
    Also add a 'definitely_not_shared' member to the dm_thin_new_mapping
    structure -- reflects that the 'shared' flag in the response from
    dm_thin_find_block() can only be held as definitive if false is
    returned.
    
    Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1043527Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Cc: stable@vger.kernel.org
    19fa1a67
dm-thin-metadata.c 39 KB