• Ming Lei's avatar
    dm: add two stage requeue mechanism · 8b211aac
    Ming Lei authored
    Commit 61b6e2e5 ("dm: fix BLK_STS_DM_REQUEUE handling when dm_io
    represents split bio") reverted DM core's bio splitting back to using
    bio_split()+bio_chain() because it was found that otherwise DM's
    BLK_STS_DM_REQUEUE would trigger a live-lock waiting for bio
    completion that would never occur.
    
    Restore using bio_trim()+bio_inc_remaining(), like was done in commit
    7dd76d1f ("dm: improve bio splitting and associated IO
    accounting"), but this time with proper handling for the above
    scenario that is covered in more detail in the commit header for
    61b6e2e5.
    
    Solve this issue by adding a two staged dm_io requeue mechanism that
    uses the new dm_bio_rewind() via dm_io_rewind():
    
    1) requeue the dm_io into the requeue_list added to struct
       mapped_device, and schedule it via new added requeue work. This
       workqueue just clones the dm_io->orig_bio (which DM saves and
       ensures its end sector isn't modified). dm_io_rewind() uses the
       sectors and sectors_offset members of the dm_io that are recorded
       relative to the end of orig_bio: dm_bio_rewind()+bio_trim() are
       then used to make that cloned bio reflect the subset of the
       original bio that is represented by the dm_io that is being
       requeued.
    
    2) the 2nd stage requeue is same with original requeue, but
       io->orig_bio points to new cloned bio (which matches the requeued
       dm_io as described above).
    
    This allows DM core to shift the need for bio cloning from bio-split
    time (during IO submission) to the less likely BLK_STS_DM_REQUEUE
    handling (after IO completes with that error).
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    8b211aac
dm-io-rewind.c 4.01 KB