2022-08-25 19:29:08

by Trond Myklebust

[permalink] [raw]
Subject: [PATCH] NFSv4: Turn off open-by-filehandle and NFS re-export for NFSv4.0

From: Trond Myklebust <[email protected]>

The NFSv4.0 protocol only supports open() by name. It cannot therefore
be used with open_by_handle() and friends, nor can it be re-exported by
knfsd.

Reported-by: Chuck Lever III <[email protected]>
Fixes: 20fa19027286 ("nfs: add export operations")
Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfs/super.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 6ab5eeb000dc..5e4bacb77bfc 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1051,22 +1051,31 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx)
if (ctx->bsize)
sb->s_blocksize = nfs_block_size(ctx->bsize, &sb->s_blocksize_bits);

- if (server->nfs_client->rpc_ops->version != 2) {
- /* The VFS shouldn't apply the umask to mode bits. We will do
- * so ourselves when necessary.
+ switch (server->nfs_client->rpc_ops->version) {
+ case 2:
+ sb->s_time_gran = 1000;
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
+ break;
+ case 3:
+ /*
+ * The VFS shouldn't apply the umask to mode bits.
+ * We will do so ourselves when necessary.
*/
sb->s_flags |= SB_POSIXACL;
sb->s_time_gran = 1;
- sb->s_export_op = &nfs_export_ops;
- } else
- sb->s_time_gran = 1000;
-
- if (server->nfs_client->rpc_ops->version != 4) {
sb->s_time_min = 0;
sb->s_time_max = U32_MAX;
- } else {
+ sb->s_export_op = &nfs_export_ops;
+ break;
+ case 4:
+ sb->s_flags |= SB_POSIXACL;
+ sb->s_time_gran = 1;
sb->s_time_min = S64_MIN;
sb->s_time_max = S64_MAX;
+ if (server->caps & NFS_CAP_ATOMIC_OPEN_V1)
+ sb->s_export_op = &nfs_export_ops;
+ break;
}

sb->s_magic = NFS_SUPER_MAGIC;
--
2.37.2


2022-08-25 19:31:28

by Chuck Lever

[permalink] [raw]
Subject: Re: [PATCH] NFSv4: Turn off open-by-filehandle and NFS re-export for NFSv4.0



> On Aug 25, 2022, at 3:00 PM, [email protected] wrote:
>
> From: Trond Myklebust <[email protected]>
>
> The NFSv4.0 protocol only supports open() by name. It cannot therefore
> be used with open_by_handle() and friends, nor can it be re-exported by
> knfsd.
>
> Reported-by: Chuck Lever III <[email protected]>
> Fixes: 20fa19027286 ("nfs: add export operations")
> Signed-off-by: Trond Myklebust <[email protected]>

No objection to this approach. You can run generic/426 as easily
as I can to test it...

Bonus points: the use of switch() here makes the code easier to
understand and modify.


> ---
> fs/nfs/super.c | 27 ++++++++++++++++++---------
> 1 file changed, 18 insertions(+), 9 deletions(-)
>
> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
> index 6ab5eeb000dc..5e4bacb77bfc 100644
> --- a/fs/nfs/super.c
> +++ b/fs/nfs/super.c
> @@ -1051,22 +1051,31 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx)
> if (ctx->bsize)
> sb->s_blocksize = nfs_block_size(ctx->bsize, &sb->s_blocksize_bits);
>
> - if (server->nfs_client->rpc_ops->version != 2) {
> - /* The VFS shouldn't apply the umask to mode bits. We will do
> - * so ourselves when necessary.
> + switch (server->nfs_client->rpc_ops->version) {
> + case 2:
> + sb->s_time_gran = 1000;
> + sb->s_time_min = 0;
> + sb->s_time_max = U32_MAX;
> + break;
> + case 3:
> + /*
> + * The VFS shouldn't apply the umask to mode bits.
> + * We will do so ourselves when necessary.
> */
> sb->s_flags |= SB_POSIXACL;
> sb->s_time_gran = 1;
> - sb->s_export_op = &nfs_export_ops;
> - } else
> - sb->s_time_gran = 1000;
> -
> - if (server->nfs_client->rpc_ops->version != 4) {
> sb->s_time_min = 0;
> sb->s_time_max = U32_MAX;
> - } else {
> + sb->s_export_op = &nfs_export_ops;
> + break;
> + case 4:
> + sb->s_flags |= SB_POSIXACL;
> + sb->s_time_gran = 1;
> sb->s_time_min = S64_MIN;
> sb->s_time_max = S64_MAX;
> + if (server->caps & NFS_CAP_ATOMIC_OPEN_V1)
> + sb->s_export_op = &nfs_export_ops;
> + break;
> }
>
> sb->s_magic = NFS_SUPER_MAGIC;
> --
> 2.37.2
>

--
Chuck Lever