Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3048878pxk; Mon, 21 Sep 2020 04:05:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLPuSAEtImrIPuCGnr4mfoVeN832bUgRd2kgh74hqXYZxxolbdu33QUz+EUqXxFkB1n6fv X-Received: by 2002:a50:eb92:: with SMTP id y18mr50452901edr.373.1600686323619; Mon, 21 Sep 2020 04:05:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600686323; cv=none; d=google.com; s=arc-20160816; b=XnkjKgQj71Y4bYlQMcVxVUFG8iiHcJYGY8CDhMi0RP3Tq8+wz0KGoYo5GDKW/XS31a IRNCA/TWRk0qiJLykl2c09ru/64p1DDFZ1l9oW0WygGBl/KvB9iSO9Xc+Thjh/7SRnab xV5/Qb4A5eyJmXnNefJgvoEyrjfPK1vi9TyL44cBL85mMReOwArO60iwQNsP9U/qIicR LnBKWmKknlW1mVl76wcl6+bOr6UoLl1cu0GXA2qrHgzUqBYIz4cCsVF+hkHOPY/XsGTN YO32DAmtlreLJ25Munwq+euF3NEqlHdIPyv6H+kK1Ob/RcIYZwBY4JWntnlIAL4f1WBP KGng== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=oSBnktT2kTPcVmUcg+sTRFLjfY2yslyu8lr49XNhb+k=; b=s4izdUeLrA4DCiNE1hD/fIRmEuPw0le8Ku39RbYQfjZFOnzli/GsyY31QDKh0CLHFa XDzbLj+SF+dxFpejeWYx5qmud4tVqVdYv4+W3pd3WLoJar+rTwkMjo9BJclHF+NAmjlH H6+IIQNxQlOwMsTXrvbB5Bc+2cZR3Jb/uycdYg0wpAZjq4/5LnX/01AFjk/ORwnRdxXc Gk2MMiPgNkm6+9z359UZKAiwVa4hqFvdBSnRbE3x9q3w8MA6iMFjgiBLYdpnq8HINSdq QB/or8eLO+xvIO2f3Wx+G9YFpgJXETREv9KfJX6nJfLyOKw9Noe045+64EC9XYk1Lbbo ubJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=T3zu3tcB; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c9si6876346edm.284.2020.09.21.04.04.48; Mon, 21 Sep 2020 04:05:23 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-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=@redhat.com header.s=mimecast20190719 header.b=T3zu3tcB; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726454AbgIULEq (ORCPT + 99 others); Mon, 21 Sep 2020 07:04:46 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:46824 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726367AbgIULEq (ORCPT ); Mon, 21 Sep 2020 07:04:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600686285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=oSBnktT2kTPcVmUcg+sTRFLjfY2yslyu8lr49XNhb+k=; b=T3zu3tcBVlnD9GpEXQMrg/6nt3ckSE1NjAeeVlGuXFBSINTB3mXZrEI+DhpXOhk6VmXgoa h1AkORf1RtfpE15UmRt6nd04rIufDj9PHXA6IloELRrn6X7bH1nGod+Qu2w86pZCCXWAot ogm+6G707V2liPq5dRl2TjYG397qQaM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-425-LuJdFMW9PgC1Gy7DhLGFHw-1; Mon, 21 Sep 2020 07:04:43 -0400 X-MC-Unique: LuJdFMW9PgC1Gy7DhLGFHw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C47B3800688; Mon, 21 Sep 2020 11:04:42 +0000 (UTC) Received: from bcodding.csb (ovpn-64-66.rdu2.redhat.com [10.10.64.66]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6B43319C4F; Mon, 21 Sep 2020 11:04:42 +0000 (UTC) Received: by bcodding.csb (Postfix, from userid 24008) id DAF2710C311B; Mon, 21 Sep 2020 07:04:41 -0400 (EDT) From: Benjamin Coddington To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com Cc: linux-nfs@vger.kernel.org Subject: [PATCH 1/3] NFSv4: Fix a livelock when CLOSE pre-emptively bumps state sequence Date: Mon, 21 Sep 2020 07:04:39 -0400 Message-Id: <5a7f6bbf4cf2038634a572f42ad80e95a8d0ae9c.1600686204.git.bcodding@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Since commit 0e0cb35b417f ("NFSv4: Handle NFS4ERR_OLD_STATEID in CLOSE/OPEN_DOWNGRADE") the following livelock may occur if a CLOSE races with the update of the nfs_state: Process 1 Process 2 Server ========= ========= ======== OPEN file OPEN file Reply OPEN (1) Reply OPEN (2) Update state (1) CLOSE file (1) Reply OLD_STATEID (1) CLOSE file (2) Reply CLOSE (-1) Update state (2) wait for state change OPEN file wake CLOSE file OPEN file wake CLOSE file ... ... As long as the first process continues updating state, the second process will fail to exit the loop in nfs_set_open_stateid_locked(). This livelock has been observed in generic/168. Fix this by detecting the case in nfs_need_update_open_stateid() and then exit the loop if: - the state is NFS_OPEN_STATE, and - the stateid sequence is > 1, and - the stateid doesn't match the current open stateid Fixes: 0e0cb35b417f ("NFSv4: Handle NFS4ERR_OLD_STATEID in CLOSE/OPEN_DOWNGRADE") Cc: stable@vger.kernel.org # v5.4+ Signed-off-by: Benjamin Coddington --- fs/nfs/nfs4proc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 45e0585e0667..9ced7a62c05e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1570,10 +1570,14 @@ static bool nfs_need_update_open_stateid(struct nfs4_state *state, { if (test_bit(NFS_OPEN_STATE, &state->flags) == 0 || !nfs4_stateid_match_other(stateid, &state->open_stateid)) { - if (stateid->seqid == cpu_to_be32(1)) + if (stateid->seqid == cpu_to_be32(1)) { nfs_state_log_update_open_stateid(state); - else - set_bit(NFS_STATE_CHANGE_WAIT, &state->flags); + } else { + if (!nfs4_stateid_match_other(stateid, &state->open_stateid)) + return false; + else + set_bit(NFS_STATE_CHANGE_WAIT, &state->flags); + } return true; } -- 2.20.1