Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp9929468ybi; Wed, 24 Jul 2019 12:30:57 -0700 (PDT) X-Google-Smtp-Source: APXvYqyxy1Q/lvyw5W8VU3KHvEcZiGSce8odEeIn+12avpy+ZyVEPBaFYKZ8L6ybOICK+FpPyRDg X-Received: by 2002:a63:7b4d:: with SMTP id k13mr81106333pgn.182.1563996657155; Wed, 24 Jul 2019 12:30:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563996657; cv=none; d=google.com; s=arc-20160816; b=YKbwPsWHKpnhV6rYmzttljf0+FerEhFecktYVDATIWx7HOorHp0zFciooEK+CeXrQz ICedSIg8YLni3QWB4OeFS0QCffKtx7C3Z7C6dsE+PB+hJFWp2EIwizpSw6N+b6N8ugtZ g5OP1caST0uohQMJv0ycrOIu/ABHMUQr/cmIpw7hyXRNOUdU6BS1Ylq4c4CVkINR92a/ N0fEsHlXjdLzlavAyKHURRXqCzsBIalc8+une85K/U3g0ySgYt6pvM5lSxDNIYW3OyJX F78ExKyGbRerWL1+DfXnYrsHxWSLsEAu1+lPq02kLkwM7QSz+dfuadawY2n3zFSSIFSB uppw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=tlesgdCsMxAtfKd7hzjlEvkL3PkhilN+Kx3FoZMLX0Q=; b=BzLthI1Z3E7D0ogADqe2WnJtMohOq56Fbru3kdsTl5pLCf4FGEYfU6LrLTPF+zc9GT aZJZ0VrM2gQV7Ez2dPMrZw0jKa7LjRThEIYpqcpvrDmNC/SomFSU9m3OTOLYUNPQokO/ QaoC1JaE8U5wKyfCU51xx++iNWQZvY2FZPMAr5l1Ehz1zzJ/JX7joHDwgfLuhz+jsIlg xWSZ+ivwJyg7Aolu7srdI9DpZh125nfzVaekGo5X6vC//lZXZso8VGJu4y5Q4dNY3xzW wVp5OkKxh4wrZCbcRc1O1eKMwdqhdHJ/NsJ9aFTu6APbJ5x+TYkvmH5CiCyfjCgf/UVf rglg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yIGo9BXA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q187si17851105pga.220.2019.07.24.12.30.39; Wed, 24 Jul 2019 12:30:57 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yIGo9BXA; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387728AbfGXT24 (ORCPT + 99 others); Wed, 24 Jul 2019 15:28:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:47632 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387658AbfGXT2y (ORCPT ); Wed, 24 Jul 2019 15:28:54 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 11D4B21951; Wed, 24 Jul 2019 19:28:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1563996534; bh=HbCgqF6bGb1VpavFzRsrl9BDL729eKpjMkUS1uh2Qt4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yIGo9BXA+BhGjxWN2kTrRkHSDgU4tQefygU9fkyUVLn5l0yTrKPiKXel8DyQvFoUX fjgOnf8kv07EaSeT9mgR7kl9a95xVg9Y+Mw0A0+O1Mue4G+gu1X/FzA5iRt6pmgsko KjAL6NSg6y7tiXXPFheGlzlRLB/f+h6PrvFjS4tQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Anton Eidelman , Sagi Grimberg , Christoph Hellwig , Sasha Levin Subject: [PATCH 5.2 131/413] nvme: fix possible io failures when removing multipathed ns Date: Wed, 24 Jul 2019 21:17:02 +0200 Message-Id: <20190724191744.423076284@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190724191735.096702571@linuxfoundation.org> References: <20190724191735.096702571@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit 2181e455612a8db2761eabbf126640552a451e96 ] When a shared namespace is removed, we call blk_cleanup_queue() when the device can still be accessed as the current path and this can result in submission to a dying queue. Hence, direct_make_request() called by our mpath device may fail (propagating the failure to userspace). Instead, we want to failover this I/O to a different path if one exists. Thus, before we cleanup the request queue, we make sure that the device is cleared from the current path nor it can be selected again as such. Fix this by: - clear the ns from the head->list and synchronize rcu to make sure there is no concurrent path search that restores it as the current path - clear the mpath current path in order to trigger a subsequent path search and sync srcu to wait for any ongoing request submissions - safely continue to namespace removal and blk_cleanup_queue Signed-off-by: Anton Eidelman Signed-off-by: Sagi Grimberg Signed-off-by: Christoph Hellwig Signed-off-by: Sasha Levin --- drivers/nvme/host/core.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 120fb593d1da..22c68e3b71d5 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -3344,6 +3344,14 @@ static void nvme_ns_remove(struct nvme_ns *ns) return; nvme_fault_inject_fini(ns); + + mutex_lock(&ns->ctrl->subsys->lock); + list_del_rcu(&ns->siblings); + mutex_unlock(&ns->ctrl->subsys->lock); + synchronize_rcu(); /* guarantee not available in head->list */ + nvme_mpath_clear_current_path(ns); + synchronize_srcu(&ns->head->srcu); /* wait for concurrent submissions */ + if (ns->disk && ns->disk->flags & GENHD_FL_UP) { del_gendisk(ns->disk); blk_cleanup_queue(ns->queue); @@ -3351,16 +3359,10 @@ static void nvme_ns_remove(struct nvme_ns *ns) blk_integrity_unregister(ns->disk); } - mutex_lock(&ns->ctrl->subsys->lock); - list_del_rcu(&ns->siblings); - nvme_mpath_clear_current_path(ns); - mutex_unlock(&ns->ctrl->subsys->lock); - down_write(&ns->ctrl->namespaces_rwsem); list_del_init(&ns->list); up_write(&ns->ctrl->namespaces_rwsem); - synchronize_srcu(&ns->head->srcu); nvme_mpath_check_last_path(ns); nvme_put_ns(ns); } -- 2.20.1