Skip to content
  • Mikulas Patocka's avatar
    dm snapshot: skip reading origin when overwriting complete chunk · a6e50b40
    Mikulas Patocka authored
    
    
    If we write a full chunk in the snapshot, skip reading the origin device
    because the whole chunk will be overwritten anyway.
    
    This patch changes the snapshot write logic when a full chunk is written.
    In this case:
      1. allocate the exception
      2. dispatch the bio (but don't report the bio completion to device mapper)
      3. write the exception record
      4. report bio completed
    
    Callbacks must be done through the kcopyd thread, because callbacks must not
    race with each other.  So we create two new functions:
    
      dm_kcopyd_prepare_callback: allocate a job structure and prepare the callback.
      (This function must not be called from interrupt context.)
    
      dm_kcopyd_do_callback: submit callback.
      (This function may be called from interrupt context.)
    
    Performance test (on snapshots with 4k chunk size):
      without the patch:
        non-direct-io sequential write (dd):    17.7MB/s
        direct-io sequential write (dd):        20.9MB/s
        non-direct-io random write (mkfs.ext2): 0.44s
    
      with the patch:
        non-direct-io sequential write (dd):    26.5MB/s
        direct-io sequential write (dd):        33.2MB/s
        non-direct-io random write (mkfs.ext2): 0.27s
    
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
    a6e50b40