Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3648946pxf; Mon, 5 Apr 2021 18:37:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzhQjeT1WB9dov+DuZl8mktAzEyIKKV0M96yiJ9ec9O4kpB9ilCMQ9aOnYnWgidb5V6QJ5u X-Received: by 2002:a6b:1415:: with SMTP id 21mr22592017iou.147.1617673039238; Mon, 05 Apr 2021 18:37:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617673039; cv=none; d=google.com; s=arc-20160816; b=QHT6MxYIExsTGRsCoUoE9Po12qcueNWJ3RP3ses5xrViPbBOyNkJ2ahlZN+FvfNERH G59ZsjGrLsn1xEX8EYJCbytO7Q6y3AGcAUhqOIeG21GGkqG2hcGopcxOzI8NL0g7vBlt L2XTj4XmRLucTYUbYnLoJekTM7WmbZur1hkvCmQGp/Lfg3jztzLYUwFI4SqHvhObHelm MTY6cRuGJl8npLfCCYqa4jkPMS6HMCZ+LgSmFKotrsBJM15ZvylwPCubv5OW8xEzOJD4 57C09bj+gPD3Hi4niGAqFcW2laLUFlLiUvwXAe+6h42aYwJz5r1PIhCXXy6hy+OjMO64 Qzew== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=RQMBxLTRVIfe4uZ6/cSRw5uI3Bsz1ajY4aFJVFQ4olg=; b=Fmnti34LKlAE90/lcbiWdmrC1dZ4nSUZK6dzXfkuiPjL5opG+E2KO5uVdx7q4R9RJu yjRZ1yl8Mvk9gqmT6Y55CD5y69TiG8RMjcs1ns356E1ePye8QY1tPblTHhYm28oKPUKW pbEGJeWATHmawhWFHBDxB3Z8qn1pkLZnFK1L9qP8qrssYBrDPQg/xKI/JWo1T7my/l8F x80AFk0km+GR/slOgkJHEw7OYL+eu8cpVnxfZaJXLb5bSAz+gLjQdbMGWZ3ZArMD535u sPnxqeC48ESoQoE7XeamhIwWozUhmCFllwFkWbHR4+EV+8xvk0yglAlfcsk4MWHUmtIq Wmcg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=J9vqABgQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g20si4575248ilk.132.2021.04.05.18.37.06; Mon, 05 Apr 2021 18:37:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=J9vqABgQ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242099AbhDEQEm (ORCPT + 99 others); Mon, 5 Apr 2021 12:04:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:55614 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241981AbhDEQEV (ORCPT ); Mon, 5 Apr 2021 12:04:21 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4ED31613B8; Mon, 5 Apr 2021 16:04:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1617638655; bh=F71KHINfsuV/NDMgW/augmyJgjANPodoz4nNfQKfovM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J9vqABgQCefqafr9fJsHLPyb6F+Nt1DC4YB598QXHWFlIa0MAOdK/T7Ik4/t+0epI E6QbWwzedW64x5rGimxqsO0qBhTlYuKUZ/MXGgElhYCTnx7oFOIz73l4rFQt0B62+G jQXvw6tVI82v3Kr60Eah/RHbo/MsBLByNR0fscwiJDP5N7wjr4tfa7SltLPU0i9ZnY yD/g83aRE9H81efEt/YJMKZIv37rp7iYJJV8gtp1GSsPedeg8nODHQQAl9miFZ/pEd ZqJyroqeO9z+DVs0VK0RwdSrYhDa3Rpp3DPXosK7PbTvRSrg342Avx9u/widKi/rh5 VSkgHfa6qTEnQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Gulam Mohamed , Mike Christie , "Martin K . Petersen" , Sasha Levin , open-iscsi@googlegroups.com, linux-scsi@vger.kernel.org Subject: [PATCH AUTOSEL 5.11 07/22] scsi: iscsi: Fix race condition between login and sync thread Date: Mon, 5 Apr 2021 12:03:50 -0400 Message-Id: <20210405160406.268132-7-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210405160406.268132-1-sashal@kernel.org> References: <20210405160406.268132-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Gulam Mohamed [ Upstream commit 9e67600ed6b8565da4b85698ec659b5879a6c1c6 ] A kernel panic was observed due to a timing issue between the sync thread and the initiator processing a login response from the target. The session reopen can be invoked both from the session sync thread when iscsid restarts and from iscsid through the error handler. Before the initiator receives the response to a login, another reopen request can be sent from the error handler/sync session. When the initial login response is subsequently processed, the connection has been closed and the socket has been released. To fix this a new connection state, ISCSI_CONN_BOUND, is added: - Set the connection state value to ISCSI_CONN_DOWN upon iscsi_if_ep_disconnect() and iscsi_if_stop_conn() - Set the connection state to the newly created value ISCSI_CONN_BOUND after bind connection (transport->bind_conn()) - In iscsi_set_param(), return -ENOTCONN if the connection state is not either ISCSI_CONN_BOUND or ISCSI_CONN_UP Link: https://lore.kernel.org/r/20210325093248.284678-1-gulam.mohamed@oracle.com Reviewed-by: Mike Christie Signed-off-by: Gulam Mohamed Signed-off-by: Martin K. Petersen index 91074fd97f64..f4bf62b007a0 100644 Signed-off-by: Sasha Levin --- drivers/scsi/scsi_transport_iscsi.c | 14 +++++++++++++- include/scsi/scsi_transport_iscsi.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index c53c3f9fa526..f648452d8d66 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -2478,6 +2478,7 @@ static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag) */ mutex_lock(&conn_mutex); conn->transport->stop_conn(conn, flag); + conn->state = ISCSI_CONN_DOWN; mutex_unlock(&conn_mutex); } @@ -2904,6 +2905,13 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev) default: err = transport->set_param(conn, ev->u.set_param.param, data, ev->u.set_param.len); + if ((conn->state == ISCSI_CONN_BOUND) || + (conn->state == ISCSI_CONN_UP)) { + err = transport->set_param(conn, ev->u.set_param.param, + data, ev->u.set_param.len); + } else { + return -ENOTCONN; + } } return err; @@ -2963,6 +2971,7 @@ static int iscsi_if_ep_disconnect(struct iscsi_transport *transport, mutex_lock(&conn->ep_mutex); conn->ep = NULL; mutex_unlock(&conn->ep_mutex); + conn->state = ISCSI_CONN_DOWN; } transport->ep_disconnect(ep); @@ -3730,6 +3739,8 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) ev->r.retcode = transport->bind_conn(session, conn, ev->u.b_conn.transport_eph, ev->u.b_conn.is_leading); + if (!ev->r.retcode) + conn->state = ISCSI_CONN_BOUND; mutex_unlock(&conn_mutex); if (ev->r.retcode || !transport->ep_connect) @@ -3969,7 +3980,8 @@ iscsi_conn_attr(local_ipaddr, ISCSI_PARAM_LOCAL_IPADDR); static const char *const connection_state_names[] = { [ISCSI_CONN_UP] = "up", [ISCSI_CONN_DOWN] = "down", - [ISCSI_CONN_FAILED] = "failed" + [ISCSI_CONN_FAILED] = "failed", + [ISCSI_CONN_BOUND] = "bound" }; static ssize_t show_conn_state(struct device *dev, diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 8a26a2ffa952..fc5a39839b4b 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h @@ -193,6 +193,7 @@ enum iscsi_connection_state { ISCSI_CONN_UP = 0, ISCSI_CONN_DOWN, ISCSI_CONN_FAILED, + ISCSI_CONN_BOUND, }; struct iscsi_cls_conn { -- 2.30.2