• Mike Snitzer's avatar
    dm crypt: constrain crypt device's max_segment_size to PAGE_SIZE · 586b286b
    Mike Snitzer authored
    Setting the dm-crypt device's max_segment_size to PAGE_SIZE is an
    unfortunate constraint that is required to avoid the potential for
    exceeding dm-crypt's underlying device's max_segments limits -- due to
    crypt_alloc_buffer() possibly allocating pages for the encryption bio
    that are not as physically contiguous as the original bio.
    
    It is interesting to note that this problem was already fixed back in
    2007 via commit 91e10625 ("dm crypt: use bio_add_page").  But Linux 4.0
    commit cf2f1abf ("dm crypt: don't allocate pages for a partial
    request") regressed dm-crypt back to _not_ using bio_add_page().  But
    given dm-crypt's cpu parallelization changes all depend on commit
    cf2f1abf's abandoning of the more complex io fragments processing that
    dm-crypt previously had we cannot easily go back to using
    bio_add_page().
    
    So all said the cleanest way to resolve this issue is to fix dm-crypt to
    properly constrain the original bios entering dm-crypt so the encryption
    bios that dm-crypt generates from the original bios are always
    compatible with the underlying device's max_segments queue limits.
    
    It should be noted that technically Linux 4.3 does _not_ need this fix
    because of the block core's new late bio-splitting capability.  But, it
    is reasoned, there is little to be gained by having the block core split
    the encrypted bio that is composed of PAGE_SIZE segments.  That said, in
    the future we may revert this change.
    
    Fixes: cf2f1abf ("dm crypt: don't allocate pages for a partial request")
    Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=104421Suggested-by: default avatarJeff Moyer <jmoyer@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Cc: stable@vger.kernel.org # 4.0+
    586b286b
dm-crypt.c 50.2 KB