From patchwork Tue Jul 7 08:50:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nicholas A. Bellinger" X-Patchwork-Id: 6731341 Return-Path: X-Original-To: patchwork-linux-scsi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C19059F38C for ; Tue, 7 Jul 2015 08:54:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C801720694 for ; Tue, 7 Jul 2015 08:54:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AB74220691 for ; Tue, 7 Jul 2015 08:54:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753980AbbGGIyj (ORCPT ); Tue, 7 Jul 2015 04:54:39 -0400 Received: from mail-ob0-f180.google.com ([209.85.214.180]:32931 "EHLO mail-ob0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754540AbbGGIyf (ORCPT ); Tue, 7 Jul 2015 04:54:35 -0400 Received: by obbgp5 with SMTP id gp5so11958977obb.0 for ; Tue, 07 Jul 2015 01:54:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=PLleC1zZdjeX9gAxcU7JIm8pFozvYhPy4HADaW+/T0M=; b=k5QvCI7yB4LWXmiaUAL6OUt4m8PgKA6u58wRgF8Z8x6o0mqLBuGEHZ5uKgy3oYM+D8 MWtrJRMXeGZHAxsU4eqP0A6hjgOtYROJ8gU3xEgL9fPQf+o9s3UwT3oW5D68oL/j+xeA 2OhWH1YpCFg/Ee9WPQVmhwTR62Xfn1bzjPwmFhawmvnkb2IIzFqM2M2hfIMBKfurkgCg 0PltuyyKDu9uoCwB1oE+wkwdxhfO1YhQ8zMPGQhjAdgO1JQcLNNj7bAzwhwH+puuoKqT M6+HdUfNzZ/dqj5tzc+HI94mNO812MS2/3cnRjYqcght1bZQB1bvQuZNTKsu3/Wy9PRH 35Mw== X-Gm-Message-State: ALoCoQlTWuw7jzEfF7QHF1Ix+9tWo0HD3vAnr1Rukzt/c4hjMlhmJn+rfVDNib3BDXQxX4jEjnh1 X-Received: by 10.60.134.19 with SMTP id pg19mr3187663oeb.12.1436259274995; Tue, 07 Jul 2015 01:54:34 -0700 (PDT) Received: from localhost.localdomain (mail.linux-iscsi.org. [67.23.28.174]) by mx.google.com with ESMTPSA id f5sm11402715oes.2.2015.07.07.01.54.33 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 07 Jul 2015 01:54:34 -0700 (PDT) From: "Nicholas A. Bellinger" To: target-devel Cc: linux-scsi , Nicholas Bellinger , Sagi Grimberg Subject: [PATCH] iscsi-target: Fix iscsit_start_kthreads failure OOPs Date: Tue, 7 Jul 2015 08:50:23 +0000 Message-Id: <1436259023-1561-1-git-send-email-nab@daterainc.com> X-Mailer: git-send-email 1.7.2.5 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nicholas Bellinger This patch fixes a regression introduced with the following commit in v4.0-rc1 code: commit 88dcd2dab5c23b1c9cfc396246d8f476c872f0ca Author: Nicholas Bellinger Date: Thu Feb 26 22:19:15 2015 -0800 iscsi-target: Convert iscsi_thread_set usage to kthread.h where iscsit_start_kthreads() failure would result in a NULL pointer dereference OOPs. To address this bug, it adds a iscsit_kthread_err() helper to cleanup both zero_tsih and !zero_tsih cases, and a iscsi_target_tx_thread() special case to avoid iscsit_take_action_for_connection_exit() during the late iscsit_start_kthreads() -> kthread_run() failure case for iscsi_target_rx_thread(). Cc: Sagi Grimberg Cc: # v3.10+ Signed-off-by: Nicholas Bellinger --- drivers/target/iscsi/iscsi_target.c | 3 ++- drivers/target/iscsi/iscsi_target_login.c | 39 +++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 4e68b62..66655b7 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -3998,7 +3998,8 @@ get_immediate: } transport_err: - iscsit_take_action_for_connection_exit(conn); + if (conn->rx_thread_active) + iscsit_take_action_for_connection_exit(conn); out: return 0; } diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 3d0fe4f..76dedb6 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c @@ -679,6 +679,7 @@ static int iscsit_start_kthreads(struct iscsi_conn *conn) return 0; out_tx: + send_sig(SIGINT, conn->tx_thread, 1); kthread_stop(conn->tx_thread); conn->tx_thread_active = false; out_bitmap: @@ -689,6 +690,23 @@ out_bitmap: return ret; } +static void iscsit_kthread_err(struct iscsi_session *sess, + struct iscsi_conn *conn, bool new_sess) +{ + spin_lock_bh(&sess->conn_lock); + list_del(&conn->conn_list); + if (atomic_dec_and_test(&sess->nconn)) + sess->session_state = TARG_SESS_STATE_FAILED; + spin_unlock_bh(&sess->conn_lock); + + if (!new_sess) + return; + + transport_deregister_session_configfs(sess->se_sess); + transport_deregister_session(sess->se_sess); + sess->se_sess = NULL; +} + int iscsi_post_login_handler( struct iscsi_np *np, struct iscsi_conn *conn, @@ -740,8 +758,10 @@ int iscsi_post_login_handler( spin_unlock_bh(&sess->conn_lock); rc = iscsit_start_kthreads(conn); - if (rc) - return rc; + if (rc) { + iscsit_kthread_err(sess, conn, false); + goto out_old_sess; + } iscsi_post_login_start_timers(conn); /* @@ -751,7 +771,7 @@ int iscsi_post_login_handler( iscsit_thread_get_cpumask(conn); conn->conn_rx_reset_cpumask = 1; conn->conn_tx_reset_cpumask = 1; - +out_old_sess: iscsit_dec_conn_usage_count(conn); if (stop_timer) { spin_lock_bh(&se_tpg->session_lock); @@ -759,7 +779,7 @@ int iscsi_post_login_handler( spin_unlock_bh(&se_tpg->session_lock); } iscsit_dec_session_usage_count(sess); - return 0; + return rc; } iscsi_set_session_parameters(sess->sess_ops, conn->param_list, 1); @@ -801,8 +821,17 @@ int iscsi_post_login_handler( spin_unlock_bh(&se_tpg->session_lock); rc = iscsit_start_kthreads(conn); - if (rc) + if (rc) { + spin_lock_bh(&se_tpg->session_lock); + if (tpg->tpg_tiqn) + tpg->tpg_tiqn->tiqn_nsessions--; + tpg->nsessions--; + spin_unlock_bh(&se_tpg->session_lock); + + iscsit_kthread_err(sess, conn, true); + iscsit_dec_conn_usage_count(conn); return rc; + } iscsi_post_login_start_timers(conn); /*