Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp3022444rwb; Mon, 15 Aug 2022 16:19:56 -0700 (PDT) X-Google-Smtp-Source: AA6agR7M8IznjUEYY/WT1LbI6P7zBfGPlTFml0SsYaSTPS5+Gus7lDhy/RgMIAnwSOp9pD+DSuXq X-Received: by 2002:a17:90b:1d02:b0:1f5:8526:303 with SMTP id on2-20020a17090b1d0200b001f585260303mr30723060pjb.79.1660605585450; Mon, 15 Aug 2022 16:19:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660605585; cv=none; d=google.com; s=arc-20160816; b=CmWrOZ3D/lkM2z8C+obSazSk9Ei40JgVCzYhY6uYIKsAdW4ZyiphqfoET+D66nXX7m +TUJAEi7hKCRC50Kx2Dw48R6QxMbiIpsQyJg32Q1x32YegTztoq2/gm5Frp1dnkWYytb 8f7vCOF3VTdxWMFZNxHlykWBFRmQPCNpvhECvsxZWzD2499aw5MFb8/3GfKd4oDvmgox jS9k6uECgig35gwZn+YWMXKQBicCMELDTx0F009tnNmiq6lSjGrxdEDi0jpwv9wV3mck bxorhch/oavdl+A1bTOXnMqFLMGsSQrKIZeFTtQOT7AX2izZFvMkwXS8ah0WsmEaas8h P+Gg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=HB+F1th33jdQFLTLhY4ci0Ku0d4QcNBkPmrkPMain/Q=; b=W+Eki+DZrv+ywSWto5j/MfHuu2C2X/zuS2TCMPFXGleCctHHSQMozklBW4m48wn/PE XsPHZmeEckBcxKGB9TgRshUTXDB/4oyI/4rtl3ydKimEVQ+tZh3waloFpzlw51ThOndI lyUukamLIMgYjBoTmfUEWIc6u/VjZUgjA92Sn+3JtqtxGUIKlraNhE1SScAmhJNy81I0 aK+SLxlFLwOwXT+LSBB6RbK6JyvCavWfo+gEzRrf5qo2MVMfrVNtcRYl1KJ3wgjVta6p UAy/dzYwcD3wpwCDy7ZkXSa3iBZ+MRg9bDXQbYrH5su+pWZUwvrOrADMKfXfUF4rYEKX 4CVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UcsreZF6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id cp8-20020a056a00348800b005352c29b979si611925pfb.290.2022.08.15.16.19.34; Mon, 15 Aug 2022 16:19:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UcsreZF6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349980AbiHOVt2 (ORCPT + 99 others); Mon, 15 Aug 2022 17:49:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60596 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349939AbiHOVqz (ORCPT ); Mon, 15 Aug 2022 17:46:55 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7DCDC1707B; Mon, 15 Aug 2022 12:30:33 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id A270FB810C6; Mon, 15 Aug 2022 19:30:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 04B4BC433C1; Mon, 15 Aug 2022 19:30:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1660591830; bh=SHvDN0xdtf/T4fnzzE6qjyxX6hjji2NDLwj2gXivZOc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UcsreZF6ODK1H+1L7r5rRc3/nKblFjHiVittOfleeC02mlw8sW20Jz+OvIOL6qify rZgkC8IPvHOCNzybHRFp8DAHegs5uPiOkdbMRqLQ63NeSBC7HCDB6arYpF3dY/PsKn RztelUHV/i2W9uBlPB73P/sbBWU45MNZGja1cxCw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nilesh Javali , Mike Christie , "Martin K. Petersen" , Sasha Levin Subject: [PATCH 5.18 0687/1095] scsi: iscsi: Add helper to remove a session from the kernel Date: Mon, 15 Aug 2022 20:01:26 +0200 Message-Id: <20220815180457.799825797@linuxfoundation.org> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220815180429.240518113@linuxfoundation.org> References: <20220815180429.240518113@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mike Christie [ Upstream commit bb42856bfd54fda1cbc7c470fcf5db1596938f4f ] During qedi shutdown we need to stop the iSCSI layer from sending new nops as pings and from responding to target ones and make sure there is no running connection cleanups. Commit d1f2ce77638d ("scsi: qedi: Fix host removal with running sessions") converted the driver to use the libicsi helper to drive session removal, so the above issues could be handled. The problem is that during system shutdown iscsid will not be running so when we try to remove the root session we will hang waiting for userspace to reply. Add a helper that will drive the destruction of sessions like these during system shutdown. Link: https://lore.kernel.org/r/20220616222738.5722-5-michael.christie@oracle.com Tested-by: Nilesh Javali Reviewed-by: Nilesh Javali Signed-off-by: Mike Christie Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/scsi_transport_iscsi.c | 49 +++++++++++++++++++++++++++++ include/scsi/scsi_transport_iscsi.h | 1 + 2 files changed, 50 insertions(+) diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index a410d0b8a445..2a38cd2d24ef 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -2341,6 +2341,55 @@ static void iscsi_cleanup_conn_work_fn(struct work_struct *work) ISCSI_DBG_TRANS_CONN(conn, "cleanup done.\n"); } +static int iscsi_iter_force_destroy_conn_fn(struct device *dev, void *data) +{ + struct iscsi_transport *transport; + struct iscsi_cls_conn *conn; + + if (!iscsi_is_conn_dev(dev)) + return 0; + + conn = iscsi_dev_to_conn(dev); + transport = conn->transport; + + if (READ_ONCE(conn->state) != ISCSI_CONN_DOWN) + iscsi_if_stop_conn(conn, STOP_CONN_TERM); + + transport->destroy_conn(conn); + return 0; +} + +/** + * iscsi_force_destroy_session - destroy a session from the kernel + * @session: session to destroy + * + * Force the destruction of a session from the kernel. This should only be + * used when userspace is no longer running during system shutdown. + */ +void iscsi_force_destroy_session(struct iscsi_cls_session *session) +{ + struct iscsi_transport *transport = session->transport; + unsigned long flags; + + WARN_ON_ONCE(system_state == SYSTEM_RUNNING); + + spin_lock_irqsave(&sesslock, flags); + if (list_empty(&session->sess_list)) { + spin_unlock_irqrestore(&sesslock, flags); + /* + * Conn/ep is already freed. Session is being torn down via + * async path. For shutdown we don't care about it so return. + */ + return; + } + spin_unlock_irqrestore(&sesslock, flags); + + device_for_each_child(&session->dev, NULL, + iscsi_iter_force_destroy_conn_fn); + transport->destroy_session(session); +} +EXPORT_SYMBOL_GPL(iscsi_force_destroy_session); + void iscsi_free_session(struct iscsi_cls_session *session) { ISCSI_DBG_TRANS_SESSION(session, "Freeing session\n"); diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 9acb8422f680..d6eab7cb221a 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h @@ -442,6 +442,7 @@ extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *t, int dd_size, unsigned int target_id); +extern void iscsi_force_destroy_session(struct iscsi_cls_session *session); extern void iscsi_remove_session(struct iscsi_cls_session *session); extern void iscsi_free_session(struct iscsi_cls_session *session); extern struct iscsi_cls_conn *iscsi_alloc_conn(struct iscsi_cls_session *sess, -- 2.35.1