Skip to content
  • Rich Ercolani's avatar
    Handle partial reads in zfs_read · 59eab109
    Rich Ercolani authored
    
    
    Currently, dmu_read_uio_dnode can read 64K of a requested 1M in one
    loop, get EFAULT back from zfs_uiomove() (because the iovec only holds
    64k), and return EFAULT, which turns into EAGAIN on the way out. EAGAIN
    gets interpreted as "I didn't read anything", the caller tries again
    without consuming the 64k we already read, and we're stuck.
    
    This apparently works on newer kernels because the caller which breaks
    on older Linux kernels by happily passing along a 1M read request and a
    64k iovec just requests 64k at a time.
    
    With this, we now won't return EFAULT if we got a partial read.
    
    Reviewed-by: default avatarBrian Behlendorf <behlendorf1@llnl.gov>
    Signed-off-by: default avatarRich Ercolani <rincebrain@gmail.com>
    Closes #12370 
    Closes #12509
    Closes #12516 
    59eab109