• Nicholas Bellinger's avatar
    target: Fix recursive COMPARE_AND_WRITE callback failure · d8855c15
    Nicholas Bellinger authored
    This patch addresses a bug when compare_and_write_callback() invoked from
    target_complete_ok_work() hits an failure from __target_execute_cmd() ->
    cmd->execute_cmd(), that ends up calling transport_generic_request_failure()
    -> compare_and_write_post(), thus causing SCF_COMPARE_AND_WRITE_POST to
    incorrectly be set.
    
    The result of this bug is that target_complete_ok_work() no longer hits
    the if (!rc && !(cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE_POST) check
    that forces an immediate return, and instead double completes the se_cmd
    in question, triggering an OOPs in the process.
    
    This patch changes compare_and_write_post() to only set this bit when a
    failure has not already occured to ensure the immediate return from within
    target_complete_ok_work(), and thus allow transport_generic_request_failure()
    to handle the sending of the CHECK_CONDITION exception status.
    Reported-by: default avatarThomas Glanzmann <thomas@glanzmann.de>
    Tested-by: default avatarThomas Glanzmann <thomas@glanzmann.de>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    d8855c15
target_core_sbc.c 25 KB