Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3867215pxv; Mon, 19 Jul 2021 10:38:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxg85Q8G85MBULyKS3B1kTFhkSFYqvk7362IwmrXkE/f/pskm+C8Ffwh9VmjGQ9Ejig72yq X-Received: by 2002:a17:906:3c14:: with SMTP id h20mr28654079ejg.176.1626716229802; Mon, 19 Jul 2021 10:37:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626716229; cv=none; d=google.com; s=arc-20160816; b=Lw9YlaVG1lUMQJ02PA7vf3rfLCle21SECmxdZ6GUmV6B6oBDO68H0u0rZ3n/wWzKfB RySSXiMhApnC7u6PKCLqn6Hqqh0JExIVDxET5XQy6wIjjAFuuIiKvd8yxG3r0oMH6D5q Ws5UFI/ZkScRqub8CZyBV0ECLS8z3+/X1sbJBRo/BOyp0aeZjjDT5ttUKgrD4cuoQ6SM eFI+ZgSbLHS25oZt0C4I2GAvqCBavtMKPkWf+SdtG8DjytPyAVyeLvJ4UrBbUfDZT6JX CHb/UROB4V1sOnEuAqGzVtXWjilMW4+XZonZTKusd3vsC280FKneHdYW7jFrY9Em5iw6 2Z4A== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=/0ZrcEXbgt+ozsGoS6DTqntxAUhyElqRmLZn15fdGBA=; b=TIBE/v2N35aRdHjhmJBTjLXDHL0rkt3xNkM/F2cOqArp22mBzohr2PVHf+Ig//zS4e XP6pxHgL2N+qn6zolQoWEHp1T5RoZah1V/22BkOcgQqjlN7sICq/Xr8Yn3noIG12Jfqb 2vSbdv4/4PneoOWTLtidwfwYKlPtxjHicOgEufmCbY4zs1AT5oDfc4lXcLjj1YYwCq8I o6d5iPTPyNg7KJIWg+FAh+vZMfoAeQC/zCGi+24Rtq3/vT1fmFqWejgoy0kbMhZqEcwK qsL2mOO/g4IBR/3w1IGCX2CMXM0MRvrXXjD0W+4kt4mBcFKQOYsZubOCPbQMQVvqm/+C bSJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=IafVxC1z; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u24si20324749eju.585.2021.07.19.10.36.46; Mon, 19 Jul 2021 10:37:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-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=@linuxfoundation.org header.s=korg header.b=IafVxC1z; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1357387AbhGSQvj (ORCPT + 99 others); Mon, 19 Jul 2021 12:51:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:39206 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348018AbhGSPYR (ORCPT ); Mon, 19 Jul 2021 11:24:17 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DA5C66124B; Mon, 19 Jul 2021 16:00:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626710440; bh=DyTMdCdsxsbTLR7vRnnYoeE6C/G6Kd7Q4U0wr8X/eWE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IafVxC1zmoGRuHEgRXkewTUH2z21p0yi87MxRAGX2x0ifuP3lKYvg1sv8wVVSL0S1 7mYSM9U9CX3dVj7v0XbADtGjO2qFx2F6rSu02ebZaZje5Hn+WHcRmZ8Fd0C9UXcrg+ BXd4Kemrs5gbzzPm2rb9XzDu85A5UXbywTEG5OuE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Sasha Levin Subject: [PATCH 5.10 183/243] NFSv4/pNFS: Dont call _nfs4_pnfs_v3_ds_connect multiple times Date: Mon, 19 Jul 2021 16:53:32 +0200 Message-Id: <20210719144946.831800649@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144940.904087935@linuxfoundation.org> References: <20210719144940.904087935@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust [ Upstream commit f46f84931a0aa344678efe412d4b071d84d8a805 ] After we grab the lock in nfs4_pnfs_ds_connect(), there is no check for whether or not ds->ds_clp has already been initialised, so we can end up adding the same transports multiple times. Fixes: fc821d59209d ("pnfs/NFSv4.1: Add multipath capabilities to pNFS flexfiles servers over NFSv3") Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/pnfs_nfs.c | 52 +++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index e3b25822e0bb..251c4a3aef9a 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -791,19 +791,16 @@ out: } EXPORT_SYMBOL_GPL(nfs4_pnfs_ds_add); -static void nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds) +static int nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds) { might_sleep(); - wait_on_bit(&ds->ds_state, NFS4DS_CONNECTING, - TASK_KILLABLE); + return wait_on_bit(&ds->ds_state, NFS4DS_CONNECTING, TASK_KILLABLE); } static void nfs4_clear_ds_conn_bit(struct nfs4_pnfs_ds *ds) { smp_mb__before_atomic(); - clear_bit(NFS4DS_CONNECTING, &ds->ds_state); - smp_mb__after_atomic(); - wake_up_bit(&ds->ds_state, NFS4DS_CONNECTING); + clear_and_wake_up_bit(NFS4DS_CONNECTING, &ds->ds_state); } static struct nfs_client *(*get_v3_ds_connect)( @@ -969,30 +966,33 @@ int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds, { int err; -again: - err = 0; - if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) { - if (version == 3) { - err = _nfs4_pnfs_v3_ds_connect(mds_srv, ds, timeo, - retrans); - } else if (version == 4) { - err = _nfs4_pnfs_v4_ds_connect(mds_srv, ds, timeo, - retrans, minor_version); - } else { - dprintk("%s: unsupported DS version %d\n", __func__, - version); - err = -EPROTONOSUPPORT; - } + do { + err = nfs4_wait_ds_connect(ds); + if (err || ds->ds_clp) + goto out; + if (nfs4_test_deviceid_unavailable(devid)) + return -ENODEV; + } while (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) != 0); - nfs4_clear_ds_conn_bit(ds); - } else { - nfs4_wait_ds_connect(ds); + if (ds->ds_clp) + goto connect_done; - /* what was waited on didn't connect AND didn't mark unavail */ - if (!ds->ds_clp && !nfs4_test_deviceid_unavailable(devid)) - goto again; + switch (version) { + case 3: + err = _nfs4_pnfs_v3_ds_connect(mds_srv, ds, timeo, retrans); + break; + case 4: + err = _nfs4_pnfs_v4_ds_connect(mds_srv, ds, timeo, retrans, + minor_version); + break; + default: + dprintk("%s: unsupported DS version %d\n", __func__, version); + err = -EPROTONOSUPPORT; } +connect_done: + nfs4_clear_ds_conn_bit(ds); +out: /* * At this point the ds->ds_clp should be ready, but it might have * hit an error. -- 2.30.2