Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3839355pxv; Mon, 19 Jul 2021 09:59:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzuGamrAYnJK6IqcJjV9fAfeGdgtuK7JDQRfh9JnGwYGlJLBiQ81lkNHQSfGFUIC9/Wp2jA X-Received: by 2002:a05:6402:26c5:: with SMTP id x5mr18959854edd.237.1626713965723; Mon, 19 Jul 2021 09:59:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626713965; cv=none; d=google.com; s=arc-20160816; b=UzOVJHw0yIhG3ZmBCmCTKm/cev00ULOgy/qrAf5/h16sQGmGlFTODVVfbqxf73eqVw jeLEWb5aE9c+7vImL2rVXhiG35zg2432Sx5Fp1sAP+KYFCcELvtd59zaAq50Bdt/pZUc AhGkiIQWiyPc8Y492YxLVa0Q1XP0lGCUZPURWh8x01QMYQOULjEiGJDkiXwUORdxgZFK bm3XsUqRwKB68ieMWmuMm0cQOPLOkW69FzW0rGd8bjZ5iYJ/7cdwp+6O6w0sjI4TdaYV 97P6gGlFBx8XMyBquLLaFg7vP7KI+HeBIuedMarK/KeVCTF1owN6ISZ5m6Fx/xvOjnQq bL8Q== 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=7PXfukMJRfwnmb/1Lntz8iviohemx0q6WVJZic4hvbw=; b=WoYyJCWbaIqlnbazrTvUsc1dmcOVOQa9AWIScznkQKN0pt/0Ts3ey3Hf8iJaZOUpKL vOaMl1ZoDuPXYxSqLUunjG+vrQMbys1dueZbJyA12+0QHW7vTkYKi2ZeBnQEAlUM4G2f MxUklK2B+XLvlMnY766ilJSFKkExuQvfJxBDxz6SJ1x+4gRWmi9Zbkp7hUqcShvOeIPt Mirt42wE+ADCrfxbcjjGHeaVliXjPppshm/+x8P33g6mLVmRI0AzUqqGZ/jv2B+q2AFj fTH04Ksxg9YwXllSsgkeKdfxfL+QEMcsakqozKkaGFlSIq5e25hDVr1+cTXouz9HrXoN 4QUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=FCraE19j; 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 j13si3082627edw.399.2021.07.19.09.59.02; Mon, 19 Jul 2021 09:59:25 -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=FCraE19j; 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 S1351033AbhGSQMz (ORCPT + 99 others); Mon, 19 Jul 2021 12:12:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:39126 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346058AbhGSPKA (ORCPT ); Mon, 19 Jul 2021 11:10:00 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D6EB0606A5; Mon, 19 Jul 2021 15:50:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626709825; bh=tbiOlfmABFXttJJ+Fv02yuub1GSccbcasOq5KTMKJsc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FCraE19jfLuYZ9lGKDZ9H/Bh7Jpsl+tlj8CXbjsl3r6lMUrT/x3Fo6wR1ukGktjjR WdkhqeK2qC1/TjahTE2iflA7GUksACwyuTB50JBnweg36U7wIyeRpTkO8kUO+QF4al +INAQfDDNvL+SaaZvK9K4lcP+m1uVxn8DxuO0OKo= 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.4 113/149] NFSv4/pNFS: Dont call _nfs4_pnfs_v3_ds_connect multiple times Date: Mon, 19 Jul 2021 16:53:41 +0200 Message-Id: <20210719144928.133333355@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144901.370365147@linuxfoundation.org> References: <20210719144901.370365147@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 8b37e7f8e789..249cf9037dbd 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -556,19 +556,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)( @@ -734,30 +731,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