• Nicholas Bellinger's avatar
    target: Fix task SGL chaining breakage with transport_allocate_data_tasks · c3c74c7a
    Nicholas Bellinger authored
    This patch fixes two bugs associated with transport_do_task_sg_chain()
    operation where transport_allocate_data_tasks() was incorrectly setting
    task_padded_sg for all tasks, and causing bogus task->task_sg_nents
    assignments + OOPsen with fabrics depending upon this code.  The first bit
    here adds a task_sg_nents_padded check in transport_allocate_data_tasks()
    to include an extra SGL vector when necessary for tasks that expect to
    be linked using sg_chain().
    
    The second change involves making transport_do_task_sg_chain() properly
    account for the extra SGL vector when task->task_padded_sg is set for
    the non trailing ->task_sg or single ->task_sg allocations.  Note this
    patch also removes the BUG_ON(!task->task_padded_sg) check within
    transport_do_task_sg_chain() as we expect this to happen normally
    with the updated logic in transport_allocate_data_tasks(), along with
    being bogus for CONTROL_SG_IO_CDB type payloads.
    
    So far this bugfix has been tested with tcm_qla2xxx and iblock backends
    in (task_count > 1)( and (task_count == 1) operation.
    Reported-by: default avatarKiran Patil <kiran.patil@intel.com>
    Cc: Kiran Patil <kiran.patil@intel.com>
    Cc: Andy Grover <agrover@redhat.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    c3c74c7a
target_core_transport.c 143 KB