Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp4161783pxv; Mon, 19 Jul 2021 18:54:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzvA5C9abHIdm7p8uqNkXptyS2j0Hx7lwoakzuklzi0s5DFRFW9NDVIn198UfIi5tlukuP6 X-Received: by 2002:a17:906:1703:: with SMTP id c3mr30011105eje.64.1626746091214; Mon, 19 Jul 2021 18:54:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626746091; cv=none; d=google.com; s=arc-20160816; b=Mb1bQ1Eof7ZYEoylgmPCUr7TdG+QDzl+gc8qO/+M8LuN3DdNBL13cVg5J21NBGce5h toSsbS/AASIV7guQPocDhRG0cNWsrnJP4YO4lCzBeJ/7HHfnjK2/09JH8YxPd3x2IcuQ 4KWNk0UGfgv9nL8+usG9jHhCEzICrlTkTGKDfuncwa1RIELOaFmcje4UpLEjEyyAhnLr WKPvpfRI0wKNVjMZdsHksKzAORdIlTYmv8MvhVnWQ+POgnZNJa+N03LLNPmSXRKv1bc4 lOE2lS0ZTJvfG2kuBjObHVk2ZA4tC3SCUq0YmiML+0wErjiWyy4Nbe7CxfT3C1X4c1Pf Hhzg== 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=eBNlKGrBnb8PcvTV2OvfQ7Y068RLbnmweqzXOZDheWI=; b=0hCDE8YJEIhIC+e3F2XvBY8ikX7MziB0sbYfopT5FMX77OBiZJkJBdNufLme6Zkhhy 5vr5dRFWY9C5HUEp127uudiXTiiAGfRBhfGVH81fhHGN9C2uN3V/nagwrvPxd9uBaVkU F/85a44qHZB580NIUooNHSQ7TVMLF5vJRxH6YxqS1gMkCdm0egBwgQjvGMJx9ZEQ1nbV oiRcpymLfyf85X0WEACZZLcPvQtwqQLAPOdcxnQ33uJb/Moo7pnC439+sZ/JIC90l596 CNLf21fGd6oq5o9/hdg5HOlMTDTgxPliRP5Ex9ZRa67ups1MNpJz2YBN6GMsq5wJo7gg gTnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="FO7t/pVB"; 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 bf26si23995093edb.356.2021.07.19.18.54.29; Mon, 19 Jul 2021 18:54:51 -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="FO7t/pVB"; 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 S1346097AbhGSPNj (ORCPT + 99 others); Mon, 19 Jul 2021 11:13:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:40462 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344254AbhGSOsn (ORCPT ); Mon, 19 Jul 2021 10:48:43 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8BBAB61351; Mon, 19 Jul 2021 15:27:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626708473; bh=4yeDjT5D5euz2WWCVdMQo2mPVg1rCQ9V0ZvkE5GBJ3Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FO7t/pVBSVEMTNSirFlmIh6SrjaNWKoWe6bbSii/qyMe+afvklJmpmQ2PQqbJdaOu FBUMSodzGXS+iDRQuzkNplthuFV1iPLI8BJLLWRxEzNtJU8/Rl2ICxkLt3Ll5bk0LB 7Sp8fwXiLYIUDM9W49BwQK9aZawHT9aSEjIq/BZo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Sasha Levin Subject: [PATCH 4.14 297/315] NFSv4/pNFS: Dont call _nfs4_pnfs_v3_ds_connect multiple times Date: Mon, 19 Jul 2021 16:53:06 +0200 Message-Id: <20210719144953.239040175@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144942.861561397@linuxfoundation.org> References: <20210719144942.861561397@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 b0ef37f3e2dd..29bdf1525d82 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -555,19 +555,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)( @@ -728,30 +725,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