Received: by 2002:ac0:b08d:0:0:0:0:0 with SMTP id l13csp4718698imc; Mon, 25 Feb 2019 09:43:29 -0800 (PST) X-Google-Smtp-Source: AHgI3IaJBiQgkzDDYfH1AydpwWNJwhFFrXRsgJvT7GwY5j+M/rYHLL4BtvPdplZUZFrhB9OwleM4 X-Received: by 2002:a63:2ccb:: with SMTP id s194mr19949004pgs.214.1551116608974; Mon, 25 Feb 2019 09:43:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551116608; cv=none; d=google.com; s=arc-20160816; b=c/PtNn1nbl7EXuRO+xTbnlGg+0a9g4mqhlw9ncXw0c5UAXjdX0USpvtzSVxVGr9RBp LA1kat6CrcABya9gliGdobKzlS6UWokyy1gEw1L2v9NXtcAo6zfffkyjsXs391ywi6FF VFiUsuwtkWwWdrvg1t2mWz5F6TqGHreURQjwNBJaeeryAWiYE9pEN6+kwP+Daa1OhXCk abY5uEw32T+EYy8ulHa+DFlbDlBK9ioEbs9G8V/aRExeM3HPLolO2NINm+sIMyRTuEnd WdY+B9wJmko9AO2HHRePUCYkZuMoujDPASeEWZYVhX4ualE/XtFKWI2Eaj9UlHkA0SLT m93Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=3QXZYWew8IS5duJTYMMg7giB7FIyrESO6Kom3POFPYw=; b=P4c33attfJZ0rtrM8HDG4k8cEwLiaBEbrhRRNYJC0T91OunRflDLVHEcQVDvpjWjna yKAI2qSNx7/I7AQPL7XHIkBRQtDBqTbRZ0ZmfgiprW1GG4NnBeLYUS7HHgpcHgzyffc5 IqNpRyshazJFfNWCohKxRQqsd301gqM0nyGtAkoi5P8ry99VV20Quk5fwxClQiZpX65m /mJ0TNjf6ARwMDiFAx7eTnx9drtLWOIngbgl9mP2JOPoWjAHqTZSKg0n2hMo+TROctc+ EWiTxj8JhW7fDwAbj49Ua/HoMg2uJbwpDMHvmuxxK2qVVOw25xSQrVPD+C/57jrf/8x7 WHCg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p18si10444093plq.130.2019.02.25.09.43.13; Mon, 25 Feb 2019 09:43:28 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728787AbfBYRli (ORCPT + 99 others); Mon, 25 Feb 2019 12:41:38 -0500 Received: from mx2.suse.de ([195.135.220.15]:37688 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728761AbfBYRlh (ORCPT ); Mon, 25 Feb 2019 12:41:37 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id BB9AFAEBD; Mon, 25 Feb 2019 17:41:35 +0000 (UTC) Received: by localhost (Postfix, from userid 1000) id 994C710A8C0; Mon, 25 Feb 2019 09:41:32 -0800 (PST) From: Lee Duncan To: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, cleech@redhat.com Cc: hare@suse.de, Lee Duncan Subject: [PATCH v2] scsi:libiscsi: Hold back_lock when calling iscsi_complete_task Date: Mon, 25 Feb 2019 09:41:30 -0800 Message-Id: <20190225174130.29496-1-leeman.duncan@gmail.com> X-Mailer: git-send-email 2.16.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lee Duncan If there is an error queueing an iscsi command in iscsi_queuecommand(), for example if the transport fails to take the command in sessuin->tt->xmit_task(), then the error path can call iscsi_complete_task() without first aquiring the back_lock as required. This can lead to things like ITT pool can get corrupt, resulting in duplicate ITTs being sent out. The solution is to hold the back_lock around iscsi_complete_task() calls, and to add a little commenting to help others understand when back_lock must be held. Signed-off-by: Lee Duncan --- drivers/scsi/libiscsi.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index b8d325ce8754..ef7871e8c6bd 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -838,7 +838,7 @@ EXPORT_SYMBOL_GPL(iscsi_conn_send_pdu); * @datalen: len of buffer * * iscsi_cmd_rsp sets up the scsi_cmnd fields based on the PDU and - * then completes the command and task. + * then completes the command and task. called under back_lock **/ static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, struct iscsi_task *task, char *data, @@ -941,6 +941,9 @@ static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, * @conn: iscsi connection * @hdr: iscsi pdu * @task: scsi command task + * + * iscsi_data_in_rsp sets up the scsi_cmnd fields based on the data received + * then completes the command and task. called under back_lock **/ static void iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr, @@ -1025,6 +1028,16 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr) return 0; } +/** + * iscsi_nop_out_rsp - SCSI NOP Response processing + * @task: scsi command task + * @nop: the nop structure + * @data: where to put the data + * @datalen: length of data + * + * iscsi_nop_out_rsp handles nop response from use or + * from user space. called under back_lock + **/ static int iscsi_nop_out_rsp(struct iscsi_task *task, struct iscsi_nopin *nop, char *data, int datalen) { @@ -1791,7 +1804,9 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc) return 0; prepd_reject: + spin_lock_bh(&session->back_lock); iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ); + spin_unlock_bh(&session->back_lock); reject: spin_unlock_bh(&session->frwd_lock); ISCSI_DBG_SESSION(session, "cmd 0x%x rejected (%d)\n", @@ -1799,7 +1814,9 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc) return SCSI_MLQUEUE_TARGET_BUSY; prepd_fault: + spin_lock_bh(&session->back_lock); iscsi_complete_task(task, ISCSI_TASK_REQUEUE_SCSIQ); + spin_unlock_bh(&session->back_lock); fault: spin_unlock_bh(&session->frwd_lock); ISCSI_DBG_SESSION(session, "iscsi: cmd 0x%x is not queued (%d)\n", @@ -3121,8 +3138,9 @@ fail_mgmt_tasks(struct iscsi_session *session, struct iscsi_conn *conn) state = ISCSI_TASK_ABRT_SESS_RECOV; if (task->state == ISCSI_TASK_PENDING) state = ISCSI_TASK_COMPLETED; + spin_lock_bh(&session->back_lock); iscsi_complete_task(task, state); - + spin_unlock_bh(&session->back_lock); } } -- 2.16.4