diff options
Diffstat (limited to 'drivers/scsi/virtio_scsi.c')
| -rw-r--r-- | drivers/scsi/virtio_scsi.c | 24 | 
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index efccd72c4a3..1b384311726 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c @@ -175,7 +175,8 @@ static void virtscsi_complete_free(void *buf)  	if (cmd->comp)  		complete_all(cmd->comp); -	mempool_free(cmd, virtscsi_cmd_pool); +	else +		mempool_free(cmd, virtscsi_cmd_pool);  }  static void virtscsi_ctrl_done(struct virtqueue *vq) @@ -311,21 +312,22 @@ out:  static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)  {  	DECLARE_COMPLETION_ONSTACK(comp); -	int ret; +	int ret = FAILED;  	cmd->comp = ∁ -	ret = virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd, -			       sizeof cmd->req.tmf, sizeof cmd->resp.tmf, -			       GFP_NOIO); -	if (ret < 0) -		return FAILED; +	if (virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd, +			      sizeof cmd->req.tmf, sizeof cmd->resp.tmf, +			      GFP_NOIO) < 0) +		goto out;  	wait_for_completion(&comp); -	if (cmd->resp.tmf.response != VIRTIO_SCSI_S_OK && -	    cmd->resp.tmf.response != VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) -		return FAILED; +	if (cmd->resp.tmf.response == VIRTIO_SCSI_S_OK || +	    cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED) +		ret = SUCCESS; -	return SUCCESS; +out: +	mempool_free(cmd, virtscsi_cmd_pool); +	return ret;  }  static int virtscsi_device_reset(struct scsi_cmnd *sc)  |