Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2079860imu; Wed, 28 Nov 2018 22:01:23 -0800 (PST) X-Google-Smtp-Source: AFSGD/VHe8pJcpbRWIMaDTeTlsxnl7VJC3hFzhVx2/W8nhgY6XSR7bsRtRezFjFUBK2rjFX95Czb X-Received: by 2002:a63:193:: with SMTP id 141mr175813pgb.136.1543471283834; Wed, 28 Nov 2018 22:01:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543471283; cv=none; d=google.com; s=arc-20160816; b=XfBfONwLzaN6g9G7/G1Qgj0B2+499uVOo32CTkY+iQAxSsCpb6lfSgnZ/o635Rkp7i Rec83CFLlYYKAv15sCXWYjhVdGeXPPVp50lVvvUDXefxPaiRXWc/7frWpS5irDpDQ5gJ g+Xri/Gbu7SK4xIhLAixex8IxxKUUZ86y9ECCBSYMmHmAhiqsfNuiyxO2sFlMpImDqvJ HgGguuMmPB0AiMte1++5yYfrIGCkNuSLMQIlQgmNAbNa7gTlPHSuHEBmhUrkt/m3GZta fINXmE1y2flUkpP6g+j+dwk1+zQtplIpQPPEPR74+0H2osZbneDqqgOmlrcdye8MJMMv Q1+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=hk2bdatAPJybIvzm1hbchx07xcNcDMvQmrjIyBY6VzE=; b=iKV1oHB+pFKITTMhEYl4O6r1UIKBQUCF6W2YqzheC942qC5a2mcfaIo/92L7ta/EJo xOc3YaUWqVdLPgc6eChWCtnNGfvKiNNvRkniiWcw9Ej1vwsPH39Z4Qsm/N+z7BAnhpcc 6/GmqMYYhtmYoHKAcUXqR1ZReybWQkQjCclAoKHioz+mm8ju14QOSd+4ZdAvtKAenjqK 4fKlywdRYNK9/eEGKBT1kSgamJW6/cmeK4Y+azamr8Y1sU+201zBMp8GbcX/UQ8J+x54 LCznblf6M21ZP3xAG+OQ+mk9FjN+g+llnalNVQwSCadlnaFhVzlSVD9ySwTibq4r0EoF VdVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HrYHqPnv; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o12si1021836pgn.145.2018.11.28.22.01.08; Wed, 28 Nov 2018 22:01:23 -0800 (PST) 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=HrYHqPnv; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728923AbeK2RDw (ORCPT + 99 others); Thu, 29 Nov 2018 12:03:52 -0500 Received: from mail.kernel.org ([198.145.29.99]:38210 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728107AbeK2RDw (ORCPT ); Thu, 29 Nov 2018 12:03:52 -0500 Received: from sasha-vm.mshome.net (unknown [37.142.5.207]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 05708208E7; Thu, 29 Nov 2018 05:59:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1543471181; bh=XZIMpldLM58zbtDq4L6xLhMKLPBlcBIuG/V0QQiwxFY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HrYHqPnvgZjDTqMkWU2e7SYBevvDgvipGP/lz6Ue+rrM3fiRFOOxbI53xc21em+ug pyTzb5wUKcCU0LwnRtjKPyV+mj1ELkrl53SNctb+pG4b6ZEPiOYqrjhahBhkTq+2Mt a2QzYbuoTJ/d328JonSpunUIGfINvs8y3jWoIj1c= From: Sasha Levin To: stable@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Trond Myklebust , Sasha Levin , linux-nfs@vger.kernel.org Subject: [PATCH AUTOSEL 4.19 46/68] NFSv4: Fix a NFSv4 state manager deadlock Date: Thu, 29 Nov 2018 00:55:37 -0500 Message-Id: <20181129055559.159228-46-sashal@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181129055559.159228-1-sashal@kernel.org> References: <20181129055559.159228-1-sashal@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust [ Upstream commit aeabb3c96186a0f944fc2b1f25c84d5eb3a93fa9 ] Fix a deadlock whereby the NFSv4 state manager can get stuck in the delegation return code, waiting for a layout return to complete in another thread. If the server reboots before that other thread completes, then we need to be able to start a second state manager thread in order to perform recovery. Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/nfs4_fs.h | 2 ++ fs/nfs/nfs4state.c | 16 +++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 3a6904173214..63287d911c08 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -41,6 +41,8 @@ enum nfs4_client_state { NFS4CLNT_MOVED, NFS4CLNT_LEASE_MOVED, NFS4CLNT_DELEGATION_EXPIRED, + NFS4CLNT_RUN_MANAGER, + NFS4CLNT_DELEGRETURN_RUNNING, }; #define NFS4_RENEW_TIMEOUT 0x01 diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 18920152da14..d2f645d34eb1 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -1210,6 +1210,7 @@ void nfs4_schedule_state_manager(struct nfs_client *clp) struct task_struct *task; char buf[INET6_ADDRSTRLEN + sizeof("-manager") + 1]; + set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) return; __module_get(THIS_MODULE); @@ -2485,6 +2486,7 @@ static void nfs4_state_manager(struct nfs_client *clp) /* Ensure exclusive access to NFSv4 state */ do { + clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) { section = "purge state"; status = nfs4_purge_lease(clp); @@ -2575,14 +2577,18 @@ static void nfs4_state_manager(struct nfs_client *clp) } nfs4_end_drain_session(clp); - if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) { - nfs_client_return_marked_delegations(clp); - continue; + nfs4_clear_state_manager_bit(clp); + + if (!test_and_set_bit(NFS4CLNT_DELEGRETURN_RUNNING, &clp->cl_state)) { + if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) { + nfs_client_return_marked_delegations(clp); + set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); + } + clear_bit(NFS4CLNT_DELEGRETURN_RUNNING, &clp->cl_state); } - nfs4_clear_state_manager_bit(clp); /* Did we race with an attempt to give us more work? */ - if (clp->cl_state == 0) + if (!test_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state)) return; if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) return; -- 2.17.1