Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp8043335ybl; Thu, 16 Jan 2020 09:39:39 -0800 (PST) X-Google-Smtp-Source: APXvYqzS3YZpVY+bdXDvqr+DWEQ/heHTcF79jKO1808Wcbth+1KBPg46CitmsZbrpzDLPlrmX5Mw X-Received: by 2002:aca:1c09:: with SMTP id c9mr143679oic.85.1579196378982; Thu, 16 Jan 2020 09:39:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579196378; cv=none; d=google.com; s=arc-20160816; b=xLfr0COho/Ide1kGnyA+FzBQ6butLkhhRLlDPNAcspr2VwFD7I7e2IbdLSRrhjr47g OmqH007PWN9TQ7/69F+n5c83ehSqz5CI8v44oRDd8UOrbw+5MiUyO6Ggxg3hgSO+V7H4 Y9lzFAyzRro4djgUnxy8dPYFTc+D49PNiZlVyzam5MaC8vndF/4b9GdY3mG+K/YQXcpg 1ZHsJZ8QwDPYyyy9SMpNYhr0B0IUsZ+aBUx+7UE7AwRVrGjj1dkFEGZ8yLhGBVNDHl30 EnU2MAAPSIPXPvVBUswh5LHJQtQlugTJb7lF6I8S1GmzfORPp0dqTc9oCkFfq51QOR+s h0Ig== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=kjicldvKU1q8gxYAPxWpYMS3Yfo01LFEAG/eIZoOai4=; b=wteLqc+vAbjNa++NbR/Z/pQD9HJsnHNfYFMbZB9g19N5pOHwmIw2d8cmZ0QfvLAdpk PG4IykzSLK5zrcgfL4kkgbBVYIou/UJBRGoV3UmhVPrLRAIk/S3fXfaCjS/S7kx+W0XX L9X4NrgBcQXry0uvyttZMgwPCgC1swH4f1QASE6cyXieUcpZ2yUjq8RryFiu5vEE8ykB elW1tDRYAQtEHw0o+T4KE7JtBALTjpYzAySr63seaUitcF21q9t+tTvYz6yZxsl2WmKV Iez/sr+li0APRf8MGvvnQB/JAThZCIANDz/niCJcW83B7Vs4qL/Wo0/i0cIgiOzeuKvX 3I0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=uL1h02Ax; 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 v67si12684477oia.26.2020.01.16.09.39.26; Thu, 16 Jan 2020 09:39:38 -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=uL1h02Ax; 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 S1731572AbgAPRiM (ORCPT + 99 others); Thu, 16 Jan 2020 12:38:12 -0500 Received: from mail.kernel.org ([198.145.29.99]:53076 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405425AbgAPRhk (ORCPT ); Thu, 16 Jan 2020 12:37:40 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (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 71FC7246C6; Thu, 16 Jan 2020 17:37:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579196259; bh=vpXMA70GMULzu8hHCJ5fBHkANPQkjGgDAgfAbdUdYY0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uL1h02AxOeGs9imN6vDC+dpynkgmybsDV5GC4VcstE4uk4ads6+3/uLuHmCL5x93U JkTWGbNkjJUqIW9A7WalPJxkU0mgDD7H9pTruDjJKuiUgnVdKddShlvDahXNPBWQIR uCVC6W4XcsUhxWi101uUvnorPW2YHXAaX28rT8Ag= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Trond Myklebust , Sasha Levin , linux-nfs@vger.kernel.org Subject: [PATCH AUTOSEL 4.9 084/251] NFS: Fix a soft lockup in the delegation recovery code Date: Thu, 16 Jan 2020 12:33:53 -0500 Message-Id: <20200116173641.22137-44-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200116173641.22137-1-sashal@kernel.org> References: <20200116173641.22137-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust [ Upstream commit 6f9449be53f3ce383caed797708b332ede8d952c ] Fix a soft lockup when NFS client delegation recovery is attempted but the inode is in the process of being freed. When the igrab(inode) call fails, and we have to restart the recovery process, we need to ensure that we won't attempt to recover the same delegation again. Fixes: 45870d6909d5a ("NFSv4.1: Test delegation stateids when server...") Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/delegation.c | 20 ++++++++++++-------- fs/nfs/delegation.h | 1 + 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index 9a8830a0f31f..014039618cff 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -234,6 +234,8 @@ static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation spin_lock(&delegation->lock); if (delegation->inode != NULL) inode = igrab(delegation->inode); + if (!inode) + set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags); spin_unlock(&delegation->lock); return inode; } @@ -867,10 +869,11 @@ void nfs_delegation_reap_unclaimed(struct nfs_client *clp) list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { list_for_each_entry_rcu(delegation, &server->delegations, super_list) { - if (test_bit(NFS_DELEGATION_RETURNING, - &delegation->flags)) - continue; - if (test_bit(NFS_DELEGATION_NEED_RECLAIM, + if (test_bit(NFS_DELEGATION_INODE_FREEING, + &delegation->flags) || + test_bit(NFS_DELEGATION_RETURNING, + &delegation->flags) || + test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0) continue; if (!nfs_sb_active(server->super)) @@ -975,10 +978,11 @@ void nfs_reap_expired_delegations(struct nfs_client *clp) list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { list_for_each_entry_rcu(delegation, &server->delegations, super_list) { - if (test_bit(NFS_DELEGATION_RETURNING, - &delegation->flags)) - continue; - if (test_bit(NFS_DELEGATION_TEST_EXPIRED, + if (test_bit(NFS_DELEGATION_INODE_FREEING, + &delegation->flags) || + test_bit(NFS_DELEGATION_RETURNING, + &delegation->flags) || + test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags) == 0) continue; if (!nfs_sb_active(server->super)) diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h index 2c6cb7fb7d5e..f72095bf9e10 100644 --- a/fs/nfs/delegation.h +++ b/fs/nfs/delegation.h @@ -33,6 +33,7 @@ enum { NFS_DELEGATION_RETURNING, NFS_DELEGATION_REVOKED, NFS_DELEGATION_TEST_EXPIRED, + NFS_DELEGATION_INODE_FREEING, }; int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); -- 2.20.1