From nobody Thu Apr 2 15:41:45 2026 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47284199949 for ; Sat, 28 Mar 2026 00:46:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774658764; cv=none; b=XttnaN3N3pU/RpNrUc9W3jdKJl/5HFBbGacTuhbMAm6kv9V7LIEpUjbywvg3bRlCoHfOY7cm6iGXLzFkwbWcXyF4AVIoBcM1C/OamMzaODFcexGiaU9ptUPdEruXO5h7vTxhFh2VqZDZ9UXPuQzwh81h06ehXdk+LfzkbeDZHh4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774658764; c=relaxed/simple; bh=JfRjWSh3fGE6CuX2wYVsLvI7h9H5gjFJEgAZriEnmQU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TY1hat/fIZv5mImGhE9rTJTIbbNIVyeGTxTqPI0BShC+sVqcKa7kTXORqIRE9KS1Pycxfd91oGabw8gJVaBhaQSLK/IPbK9/XXrdaf56lCLXCDfQsgsm/ze5QQUt2lIQEtmEWRacy0fdm5TYIaiZ0vIMn4D3aF1rXf9MsOvff4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com; spf=fail smtp.mailfrom=purestorage.com; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b=O2qcCCuE; arc=none smtp.client-ip=209.85.215.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=purestorage.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=purestorage.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=purestorage.com header.i=@purestorage.com header.b="O2qcCCuE" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-c742882d2a4so1186519a12.0 for ; Fri, 27 Mar 2026 17:46:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=purestorage.com; s=google2022; t=1774658759; x=1775263559; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ddfbk2XDqKMxw3Haokga/Yx24j2zOVvDwNay846hLWQ=; b=O2qcCCuE10iTvPE6QSo2UZ2VQjVGaVVNoQtpJja7YHcP4i5G2pCyAJFXgv+H+Ak7vM e04ZdqrVJXyquMCPPUIi7M4KRH4eESEjKOFnkFZBZuHe2VEoj4HgCHXCEUCEdGYKV4lZ iMsDlOR+9R9Fm6NGeompxivrMWixM+oWTdaZDqf+zwxc/4CinnwMQGDYymwgE0TQc83k dfMw24p3rHvMPHZqy2FjaMxM5VxrZULnsTJtxuxAftK7PhdHUcnGjmLr0aa8qexPu57U 9wUGqGRvkihOnq0QUCC4tpU59Zrk2ZHwvHKEgjzSngbZOP3uerYfTlaEiz9F+3c3X9M+ M7fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774658759; x=1775263559; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ddfbk2XDqKMxw3Haokga/Yx24j2zOVvDwNay846hLWQ=; b=bNZGn6gjOU3hZlW3khlJvD9ofJnpVrOa31WnBRTL9iIyzjxRIWKKuRCCAZxyNhTmSS 45GgldlG7DOXEhzTf2TYQe4V3LlW+BJXQTZI0WYiGVuvR7QVTqme2MCwyazFy5gfGsJ0 DlIdseHPfTTSzwyRC/+dvPyB+9sKQF9kAuqGk0FG17E9UFRzzDhfeHDN+5WORIBkf9a+ nXjFDqe8wi3LUgODPGHpnAGCgLl367oPx5e3NJS67bGC1xK6wfhVHo6/m8QUOpUz7TRM gC8396pVnS6sbtZdNaGca3fGGZDWOC3A2gGSgx4ywFp01NeHh6h59eWA0npL7uk9Y5Zv /Aew== X-Forwarded-Encrypted: i=1; AJvYcCWFWZzTJYpncjMGM0g8f+zjPvQRXPwSIwr1y6g1XvP2dU2npwJI6mr4L9cFZP8FVAWT+BN+H4xJPt/3DLg=@vger.kernel.org X-Gm-Message-State: AOJu0Yzo4D2O6kQJSED0CMc83Rsym2+7eRpVCYBp+kVJkp32dQ3Soaae b2/tEr5RkQ/i0IZYMA1cqUwwZQ1JmUhDIxTaXvcNlEpyZGIwaU8hBt5M33Wdr7G5rXs= X-Gm-Gg: ATEYQzyYwHWcKvLdW3MSpa5GNiGRziq5SIHwYh1ei0g6xqfA23tZWX/gfYQBZ5sxjUc 1SgtWZv3ME4GDiewe85STpxQ4jZL0lltt9IF/Awj1G2Ki9YScUxEIpW+6mvMKZBQgKuhA+HW7K0 mxr6jeHXxkHIk+SVZT2JG5XxpsIZWKnaUfN+p4KMiz3pqILI3m5Z8ZlsB6+ISWa0TBBJAX9mGQ7 HZIK4doijgDWjy8t/UtFUTUXqV4QsHu4hE0ZcXanEksiD29vTUx0R3rbfi3RCVOLCzsPdYVWpSQ bE8IETSsv8/DCwynZVZaUOYvoKICEQS7WfBN0ymzM1e1c29Vf/1OESP2Q4ARLmh55USO+bxrTXN 7fHf1PodDTX3FX4nUvEHEWHqv/PwXFcm2g8FPZg4st16Xm9g9HCyy0hqX7MSEB567NsdSZIFdaz lXA5VTVvA= X-Received: by 2002:a17:902:e809:b0:2b0:5cb4:d89d with SMTP id d9443c01a7336-2b0cdcb05c7mr47028665ad.29.1774658759359; Fri, 27 Mar 2026 17:45:59 -0700 (PDT) Received: from ceto ([2601:640:8202:6fb0::9c63]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2b242683064sm5342705ad.33.2026.03.27.17.45.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Mar 2026 17:45:58 -0700 (PDT) From: Mohamed Khalfella To: Justin Tee , Naresh Gottumukkala , Paul Ely , Chaitanya Kulkarni , Jens Axboe , Keith Busch , Sagi Grimberg , James Smart , Hannes Reinecke Cc: Aaron Dailey , Randy Jennings , Dhaval Giani , linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org, Mohamed Khalfella Subject: [PATCH v4 07/15] nvme: Introduce FENCING and FENCED controller states Date: Fri, 27 Mar 2026 17:43:38 -0700 Message-ID: <20260328004518.1729186-8-mkhalfella@purestorage.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260328004518.1729186-1-mkhalfella@purestorage.com> References: <20260328004518.1729186-1-mkhalfella@purestorage.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" FENCING is a new controller state that a LIVE controller enters when an error is encountered. While in FENCING state, inflight IOs that timeout are not canceled because they should be held until either CCR succeeds or time-based recovery completes. While the queues remain alive, requests are not allowed to be sent in this state, and the controller cannot be reset or deleted. This is intentional because resetting or deleting the controller results in canceling inflight IOs. FENCED is a short-term state the controller enters before it is reset. It exists only to prevent manual resets from happening while controller is in FENCING state. Signed-off-by: Mohamed Khalfella Reviewed-by: Hannes Reinecke --- drivers/nvme/host/core.c | 27 +++++++++++++++++++++++++-- drivers/nvme/host/nvme.h | 4 ++++ drivers/nvme/host/sysfs.c | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 7a07c23aefdb..824a1193bec8 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -574,10 +574,29 @@ bool nvme_change_ctrl_state(struct nvme_ctrl *ctrl, break; } break; + case NVME_CTRL_FENCING: + switch (old_state) { + case NVME_CTRL_LIVE: + changed =3D true; + fallthrough; + default: + break; + } + break; + case NVME_CTRL_FENCED: + switch (old_state) { + case NVME_CTRL_FENCING: + changed =3D true; + fallthrough; + default: + break; + } + break; case NVME_CTRL_RESETTING: switch (old_state) { case NVME_CTRL_NEW: case NVME_CTRL_LIVE: + case NVME_CTRL_FENCED: changed =3D true; fallthrough; default: @@ -760,6 +779,8 @@ blk_status_t nvme_fail_nonready_command(struct nvme_ctr= l *ctrl, =20 if (state !=3D NVME_CTRL_DELETING_NOIO && state !=3D NVME_CTRL_DELETING && + state !=3D NVME_CTRL_FENCING && + state !=3D NVME_CTRL_FENCED && state !=3D NVME_CTRL_DEAD && !test_bit(NVME_CTRL_FAILFAST_EXPIRED, &ctrl->flags) && !blk_noretry_request(rq) && !(rq->cmd_flags & REQ_NVME_MPATH)) @@ -802,10 +823,12 @@ bool __nvme_check_ready(struct nvme_ctrl *ctrl, struc= t request *rq, req->cmd->fabrics.fctype =3D=3D nvme_fabrics_type_auth_receive)) return true; break; - default: - break; + case NVME_CTRL_FENCING: + case NVME_CTRL_FENCED: case NVME_CTRL_DEAD: return false; + default: + break; } } =20 diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 234f3872a212..45e58434cf30 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -305,6 +305,8 @@ static inline u16 nvme_req_qid(struct request *req) enum nvme_ctrl_state { NVME_CTRL_NEW, NVME_CTRL_LIVE, + NVME_CTRL_FENCING, + NVME_CTRL_FENCED, NVME_CTRL_RESETTING, NVME_CTRL_CONNECTING, NVME_CTRL_DELETING, @@ -831,6 +833,8 @@ static inline bool nvme_state_terminal(struct nvme_ctrl= *ctrl) switch (nvme_ctrl_state(ctrl)) { case NVME_CTRL_NEW: case NVME_CTRL_LIVE: + case NVME_CTRL_FENCING: + case NVME_CTRL_FENCED: case NVME_CTRL_RESETTING: case NVME_CTRL_CONNECTING: return false; diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c index f182a26b38b0..6ae29fe431dc 100644 --- a/drivers/nvme/host/sysfs.c +++ b/drivers/nvme/host/sysfs.c @@ -443,6 +443,8 @@ static ssize_t nvme_sysfs_show_state(struct device *dev, static const char *const state_name[] =3D { [NVME_CTRL_NEW] =3D "new", [NVME_CTRL_LIVE] =3D "live", + [NVME_CTRL_FENCING] =3D "fencing", + [NVME_CTRL_FENCED] =3D "fenced", [NVME_CTRL_RESETTING] =3D "resetting", [NVME_CTRL_CONNECTING] =3D "connecting", [NVME_CTRL_DELETING] =3D "deleting", --=20 2.52.0