Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3889637pxv; Mon, 19 Jul 2021 11:12:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJztZ5eqV/Zq7cUgqM0Ro/HiWgKYc7n76muSFsN4rAQmFOoYtcjLjmQW7bKfh35DHgqF2IT+ X-Received: by 2002:a92:7a12:: with SMTP id v18mr17439576ilc.27.1626718350494; Mon, 19 Jul 2021 11:12:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626718350; cv=none; d=google.com; s=arc-20160816; b=XvYTSFS3I6vtvgHx3Uh63pVIQnsIe3Jbdlp4Hu+KXo9lUP6J1U5YZTQ+VMWv2zVRQ8 elXrOSwJwyUlHnOWYp95X3mHiPi9jSk2UQ3De4nR+kSvR5tcAIYCRk9AKMwdTqmtcU37 5uudby995/XIS+pzuN39lsQv/SFfeMwXzHt0gPJzFkQGwInd+tHl3jn2AYl1qCaJ4aX+ Gymtoy+wPs3IJYEzeAaqZsSNdDV6AiZWEvhwmcGwm5XjsWURjNV+W7eXD4yRRdzjJlMS GpUMVNTSU4vBjRD1edYGYx2lzalPV6YB+jD6rLbR52h0QqoiIKhWrMURpYROUI4Fy9XF TDPw== 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=LSJnfZCGC6v9rn5yCFn5n4R/QT3xEf/bosELmO74dV8=; b=AoaJMK0cPy1+PN3D/ZnF9QFlRGYuWXKtgh5gHPFmylNPvIwtlNcrJ0MA52gaNi6E8h xi4zEkmsTJJu2uBEIcBLIOeIKxIN9TJ+Otsrh5s3UabNoj8sqaRcBptrQU91xRPubGx0 E/p8r80ok+kzBxhU+skUcL7biUGV7Q4hnUFhmmsPiv/+jpmZk5wDWVl8wS/U8kU9l1N2 OwUSEESFirU2fuxfFxaIXQwonGwcWfJu/2flNTXa6b/UvX5jixksj1HKOCal5oVHKpSO 8QyQ/YTSDU9mAbOsm6y22mutYvGsYQWvTlyz0Zf2c4XhZ8beV7SUVaePwiqQ6HvMejjG 7UEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=x5prX5bh; 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 b39si11185444jav.0.2021.07.19.11.12.18; Mon, 19 Jul 2021 11:12:30 -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=x5prX5bh; 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 S1355501AbhGSRaY (ORCPT + 99 others); Mon, 19 Jul 2021 13:30:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:48214 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245373AbhGSPq3 (ORCPT ); Mon, 19 Jul 2021 11:46:29 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0C3156143E; Mon, 19 Jul 2021 16:27:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626712027; bh=qAOrF9B0QCnF2sSl9P3Z0vFbu1w7HEbgskEF8O8ND3w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=x5prX5bhPz0lPscz1eQpS5A0YwdXZnAUn58ekt7OwZluqq2moQcg8oiNwQycCvMuc EC0Tt/w5+i8PZsFeb4fcD8rfGRogNGcO6DC+aKw2AbtLV4Jot2jGStOiw4fer2pSHj 2Ig8wCfc45hKjm/RSpXXqbmM2JVsLQIeRnq5Gkao= 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.12 221/292] NFSv4/pNFS: Dont call _nfs4_pnfs_v3_ds_connect multiple times Date: Mon, 19 Jul 2021 16:54:43 +0200 Message-Id: <20210719144950.243350238@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144942.514164272@linuxfoundation.org> References: <20210719144942.514164272@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 49d3389bd813..1c2c0d08614e 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -805,19 +805,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)( @@ -993,30 +990,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