From patchwork Wed Feb 22 18:48:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 9587363 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6BE9B6020B for ; Wed, 22 Feb 2017 18:48:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5D51628640 for ; Wed, 22 Feb 2017 18:48:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 503BD2864C; Wed, 22 Feb 2017 18:48:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C967228640 for ; Wed, 22 Feb 2017 18:48:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754838AbdBVSs1 (ORCPT ); Wed, 22 Feb 2017 13:48:27 -0500 Received: from mail-it0-f66.google.com ([209.85.214.66]:36511 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754828AbdBVSs1 (ORCPT ); Wed, 22 Feb 2017 13:48:27 -0500 Received: by mail-it0-f66.google.com with SMTP id w185so1436580ita.3 for ; Wed, 22 Feb 2017 10:48:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=xuSyyG6hVbpi99d053uD/M37j0jlEeQQQ5gj+Fi6o5M=; b=uk4pHoEKoNSYD3+9N3m+9TPfD5P5MK+00DPe1bd6cNmKW1UpZbMHZ7ab6ZH4jYThxm KHRtSYhNH2bmXC2wN9SG7U51LT8QKDlPyml0mf3yRxL6ZQHlZngOSr97eaLix7kVs/wx OVYEqskunpHdZXaRYD+OfPrLQkMVYCJSrrHnGviLVXcSGqMqPWkjUg069S5mQLfOyEj/ WCDnlAz4TerwHCDNwfdtW8HulRiLPJXJPgKk/Ve3FJmcWnilPFUW4MMUruBDbhfQr/DL T7v3AcCHKifwNtVI+ID78/8eK6mepuVsvvMeOthdE7c0zAaeMWucDJPUL8ViLSUuqfMc r1pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=xuSyyG6hVbpi99d053uD/M37j0jlEeQQQ5gj+Fi6o5M=; b=YLqJbvgVodQ4QZKEOT9842BjzyTLaeMS1LH13/91PLzFG3ldTc3pVUCBU54B6oXHOV ZF5p7mj7NcL+qa/V5ZPyjRhJ8jS4JfbWpzcyzjRCCkcMJK/MWheT6S7N7PBbGeS973J3 AZmSoeG1G+ZyOtB0xiPp5koy6NChxCcXmVpHCsBMm4bWwZ+HG7sL5shgIC1kuMVeeTko jkJQnu6X2d3v32bMbsAfpfNd8IPS66wR1ct3Z6P0Oen3SmhM3PRE+OAhslJi2voATXW8 VMKKc97gILwTD8bsTsaZnXmT7y1M6wV2xLQLSMEat8PUG/wV6vK2/nbP0vCqOJbif5mM cVfQ== X-Gm-Message-State: AMke39kyHK7Jp/K7Jqm2p2chL/Rl7Qmmv2QV9VI2XpkSZSC3m0hwFn19naIUVUGHzf2xQA== X-Received: by 10.36.103.9 with SMTP id u9mr3284908itc.91.1487789306337; Wed, 22 Feb 2017 10:48:26 -0800 (PST) Received: from localhost.localdomain ([50.124.63.84]) by smtp.gmail.com with ESMTPSA id d12sm847074iog.53.2017.02.22.10.48.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 22 Feb 2017 10:48:25 -0800 (PST) From: Trond Myklebust To: bfields@fieldses.org Cc: linux-nfs@vger.kernel.org Subject: [PATCH] nfsd: Allow enabling NFSv4.x without also requiring NFSv4.0 Date: Wed, 22 Feb 2017 13:48:22 -0500 Message-Id: <20170222184822.4658-1-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.9.3 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP For some setups, we may want to allow clients to fall back to NFSv3, or even to fail, if a specific minor version of NFSv4 is not enabled. For instance, an application that relies on NFSv4.2 CLONE functionality is simply not going to work when it falls back to NFSv4.1 or NFSv4. Signed-off-by: Trond Myklebust --- fs/nfsd/nfsctl.c | 16 ++++++++-------- fs/nfsd/nfssvc.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index f3b2f34b10a3..81b6a0aa4b92 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -561,6 +561,7 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size) len = qword_get(&mesg, vers, size); if (len <= 0) return -EINVAL; do { + enum vers_op cmd; sign = *vers; if (sign == '+' || sign == '-') num = simple_strtol((vers+1), &minorp, 0); @@ -572,21 +573,20 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size) minor = simple_strtoul(minorp+1, NULL, 0); if (minor == 0) return -EINVAL; - if (nfsd_minorversion(minor, sign == '-' ? - NFSD_CLEAR : NFSD_SET) < 0) - return -EINVAL; - goto next; - } + } else + minor = 0; + cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET; switch(num) { case 2: case 3: - case 4: - nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET); + nfsd_vers(num, cmd); break; + case 4: + if (nfsd_minorversion(minor, cmd) >= 0) + break; default: return -EINVAL; } - next: vers += len + 1; } while ((len = qword_get(&mesg, vers, size)) > 0); /* If all get turned off, turn them back on, as diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index e6bfd96734c0..07bf3bd9687b 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -153,6 +153,18 @@ int nfsd_vers(int vers, enum vers_op change) return 0; } +static void +nfsd_adjust_nfsd_versions4(void) +{ + unsigned i; + + for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++) { + if (nfsd_supported_minorversions[i]) + return; + } + nfsd_vers(4, NFSD_CLEAR); +} + int nfsd_minorversion(u32 minorversion, enum vers_op change) { if (minorversion > NFSD_SUPPORTED_MINOR_VERSION) @@ -160,9 +172,11 @@ int nfsd_minorversion(u32 minorversion, enum vers_op change) switch(change) { case NFSD_SET: nfsd_supported_minorversions[minorversion] = true; + nfsd_vers(4, NFSD_SET); break; case NFSD_CLEAR: nfsd_supported_minorversions[minorversion] = false; + nfsd_adjust_nfsd_versions4(); break; case NFSD_TEST: return nfsd_supported_minorversions[minorversion];