On Tue, Apr 07, 2020 at 04:22:43PM +0200, Max Kellermann wrote: > This sets SB_POSIXACL only if ACL support is really enabled, instead > of always setting SB_POSIXACL if the NFS protocol version > theoretically supports ACL. > > The code comment says "We will [apply the umask] ourselves", but that > happens in posix_acl_create() only if the kernel has POSIX ACL > support. Without it, posix_acl_create() is an empty dummy function. > > So let's not pretend we will apply the umask if we can already know > that we will never. > > This fixes a problem where the umask is always ignored in the NFS > client when compiled without CONFIG_FS_POSIX_ACL. This is a 4 year > old regression caused by commit 013cdf1088d723 which itself was not > completely wrong, but failed to consider all the side effects by > misdesigned VFS code. > > Signed-off-by: Max Kellermann <mk@xxxxxxxxxx> > Reviewed-by: J. Bruce Fields <bfields@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > --- > fs/nfs/super.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/fs/nfs/super.c b/fs/nfs/super.c > index dada09b391c6..dab79193f641 100644 > --- a/fs/nfs/super.c > +++ b/fs/nfs/super.c > @@ -977,11 +977,14 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx) > if (ctx && ctx->bsize) > sb->s_blocksize = nfs_block_size(ctx->bsize, &sb->s_blocksize_bits); > > - if (server->nfs_client->rpc_ops->version != 2) { > + if (NFS_SB(sb)->caps & NFS_CAP_ACLS) { > /* The VFS shouldn't apply the umask to mode bits. We will do > * so ourselves when necessary. > */ > sb->s_flags |= SB_POSIXACL; > + } Looks good, but I'd use the opportunity to also fix up the commen to be a little less cryptic: /* * If the server supports ACLs, the VFS shouldn't apply the umask to * the mode bits as we'll do it ourselves when necessary. */ if (NFS_SB(sb)->caps & NFS_CAP_ACLS) sb->s_flags |= SB_POSIXACL;