• Boaz Harrosh's avatar
    [SCSI] scsi_lib: Fix bug in completion of bidi commands · 63c43b0e
    Boaz Harrosh authored
    Because of the terrible structuring of scsi-bidi-commands
    it breaks some of the life time rules of a scsi-command.
    It is now not allowed to free up the block-request before
    cleanup and partial deallocation of the scsi-command. (Which
    is not so for none bidi commands)
    
    The right fix to this problem would be to make bidi command
    a first citizen by allocating a scsi_sdb pointer at scsi command
    just like cmd->prot_sdb. The bidi sdb should be allocated/deallocated
    as part of the get/put_command (Again like the prot_sdb) and the
    current decoupling of scsi_cmnd and blk-request should be kept.
    
    For now make sure scsi_release_buffers() is called before the
    call to blk_end_request_all() which might cause the suicide of
    the block requests. At best the leak of bidi buffers, at worse
    a crash, as there is a race between the existence of the bidi_request
    and the free of the associated bidi_sdb.
    
    The reason this was never hit before is because only OSD has the potential
    of doing asynchronous bidi commands. (So does bsg but it is never used)
    And OSD clients just happen to do all their bidi commands synchronously, up
    until recently.
    
    CC: Stable Tree <stable@kernel.org>
    Signed-off-by: default avatarBoaz Harrosh <bharrosh@panasas.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    63c43b0e
scsi_lib.c 64.2 KB