• F
    block: fix sg SG_DXFER_TO_FROM_DEV regression · ecb554a8
    FUJITA Tomonori 提交于
    I overlooked SG_DXFER_TO_FROM_DEV support when I converted sg to use
    the block layer mapping API (2.6.28).
    
    Douglas Gilbert explained SG_DXFER_TO_FROM_DEV:
    
    http://www.spinics.net/lists/linux-scsi/msg37135.html
    
    =
    The semantics of SG_DXFER_TO_FROM_DEV were:
       - copy user space buffer to kernel (LLD) buffer
       - do SCSI command which is assumed to be of the DATA_IN
         (data from device) variety. This would overwrite
         some or all of the kernel buffer
       - copy kernel (LLD) buffer back to the user space.
    
    The idea was to detect short reads by filling the original
    user space buffer with some marker bytes ("0xec" it would
    seem in this report). The "resid" value is a better way
    of detecting short reads but that was only added this century
    and requires co-operation from the LLD.
    =
    
    This patch changes the block layer mapping API to support this
    semantics. This simply adds another field to struct rq_map_data and
    enables __bio_copy_iov() to copy data from user space even with READ
    requests.
    
    It's better to add the flags field and kills null_mapped and the new
    from_user fields in struct rq_map_data but that approach makes it
    difficult to send this patch to stable trees because st and osst
    drivers use struct rq_map_data (they were converted to use the block
    layer in 2.6.29 and 2.6.30). Well, I should clean up the block layer
    mapping API.
    
    zhou sf reported this regiression and tested this patch:
    
    http://www.spinics.net/lists/linux-scsi/msg37128.html
    http://www.spinics.net/lists/linux-scsi/msg37168.htmlReported-by: Nzhou sf <sxzzsf@gmail.com>
    Tested-by: Nzhou sf <sxzzsf@gmail.com>
    Cc: stable@kernel.org
    Signed-off-by: NFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
    Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
    ecb554a8
bio.c 39.1 KB