From patchwork Mon Feb 27 03:04:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Christie X-Patchwork-Id: 9592661 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5A92E604AB for ; Mon, 27 Feb 2017 03:05:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4CD0027FA8 for ; Mon, 27 Feb 2017 03:05:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 41C4E2811C; Mon, 27 Feb 2017 03:05:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E919427FA8 for ; Mon, 27 Feb 2017 03:05:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751314AbdB0DFb (ORCPT ); Sun, 26 Feb 2017 22:05:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:43694 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751318AbdB0DF3 (ORCPT ); Sun, 26 Feb 2017 22:05:29 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1ED0664467; Mon, 27 Feb 2017 03:04:06 +0000 (UTC) Received: from rh2.redhat.com (ovpn-120-121.rdu2.redhat.com [10.10.120.121] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1R342kv007727; Sun, 26 Feb 2017 22:04:05 -0500 From: Mike Christie To: target-devel@vger.kernel.org, nab@linux-iscsi.org Cc: Mike Christie Subject: [PATCH 4/4] iscsi target: check for state change before sending login pdu Date: Sun, 26 Feb 2017 21:04:00 -0600 Message-Id: <1488164640-8751-5-git-send-email-mchristi@redhat.com> In-Reply-To: <1488164640-8751-1-git-send-email-mchristi@redhat.com> References: <1488164640-8751-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 27 Feb 2017 03:04:06 +0000 (UTC) Sender: target-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Try to shorten the race window where the initiator could drop the connection while we are performing login operations. Signed-off-by: Mike Christie --- drivers/target/iscsi/iscsi_target_login.c | 13 +++++++++++++ drivers/target/iscsi/iscsi_target_nego.c | 2 +- include/target/iscsi/iscsi_transport.h | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index d7d406e..dacb773 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c @@ -1119,6 +1119,19 @@ int iscsit_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login) int iscsit_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login, u32 length) { + struct sock *sk = conn->sock->sk; + bool state; + + read_lock_bh(&sk->sk_callback_lock); + state = iscsi_target_sk_state_check(sk); + read_unlock_bh(&sk->sk_callback_lock); + + if (!state) { + pr_debug("iscsit_put_login_tx() failed state for conn: %p\n", + conn); + return -1; + } + if (iscsi_login_tx_data(conn, login->rsp, login->rsp_buf, length) < 0) return -1; diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c index 9edac16..b81017f 100644 --- a/drivers/target/iscsi/iscsi_target_nego.c +++ b/drivers/target/iscsi/iscsi_target_nego.c @@ -492,7 +492,7 @@ static void iscsi_target_restore_sock_callbacks(struct iscsi_conn *conn) static int iscsi_target_do_login(struct iscsi_conn *, struct iscsi_login *); -static bool iscsi_target_sk_state_check(struct sock *sk) +bool iscsi_target_sk_state_check(struct sock *sk) { if (sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) { pr_debug("iscsi_target_sk_state_check: TCP_CLOSE_WAIT|TCP_CLOSE," diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h index b9a76ed..25d8b87 100644 --- a/include/target/iscsi/iscsi_transport.h +++ b/include/target/iscsi/iscsi_transport.h @@ -138,6 +138,7 @@ extern void iscsit_add_cmd_to_immediate_queue(struct iscsi_cmd *, */ extern int iscsi_target_check_login_request(struct iscsi_conn *, struct iscsi_login *); +extern bool iscsi_target_sk_state_check(struct sock *); /* * From iscsi_target_login.c