NFSD: Replace /proc/fs/nfsd/supported_krb5_enctypes with a symlink
Now that I've added a file under /proc/net/rpc that is managed by the SunRPC's Kerberos mechanism, replace NFSD's supported_krb5_enctypes file with a symlink to the new SunRPC proc file, which contains exactly the same content. Remarkably, commit b0b0c0a26e84 ("nfsd: add proc file listing kernel's gss_krb5 enctypes") added the nfsd_supported_krb5_enctypes file in 2011, but this file has never been documented in nfsd(7). Tested-by: Scott Mayhew <smayhew@redhat.com> Reviewed-by: Simo Sorce <simo@redhat.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
bdb12fb157
commit
4df750c924
@ -14,7 +14,6 @@
|
||||
#include <linux/lockd/lockd.h>
|
||||
#include <linux/sunrpc/addr.h>
|
||||
#include <linux/sunrpc/gss_api.h>
|
||||
#include <linux/sunrpc/gss_krb5_enctypes.h>
|
||||
#include <linux/sunrpc/rpc_pipe_fs.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/fsnotify.h>
|
||||
@ -47,7 +46,6 @@ enum {
|
||||
NFSD_MaxBlkSize,
|
||||
NFSD_MaxConnections,
|
||||
NFSD_Filecache,
|
||||
NFSD_SupportedEnctypes,
|
||||
/*
|
||||
* The below MUST come last. Otherwise we leave a hole in nfsd_files[]
|
||||
* with !CONFIG_NFSD_V4 and simple_fill_super() goes oops
|
||||
@ -187,16 +185,6 @@ static int export_features_show(struct seq_file *m, void *v)
|
||||
|
||||
DEFINE_SHOW_ATTRIBUTE(export_features);
|
||||
|
||||
#if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)
|
||||
static int supported_enctypes_show(struct seq_file *m, void *v)
|
||||
{
|
||||
seq_printf(m, KRB5_SUPPORTED_ENCTYPES);
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SHOW_ATTRIBUTE(supported_enctypes);
|
||||
#endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */
|
||||
|
||||
static const struct file_operations pool_stats_operations = {
|
||||
.open = nfsd_pool_stats_open,
|
||||
.read = seq_read,
|
||||
@ -1150,6 +1138,9 @@ static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode)
|
||||
inode->i_op = &simple_dir_inode_operations;
|
||||
inc_nlink(inode);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
inode->i_op = &simple_symlink_inode_operations;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -1195,6 +1186,59 @@ out_err:
|
||||
goto out;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_SUNRPC_GSS)
|
||||
static int __nfsd_symlink(struct inode *dir, struct dentry *dentry,
|
||||
umode_t mode, const char *content)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
||||
inode = nfsd_get_inode(dir->i_sb, mode);
|
||||
if (!inode)
|
||||
return -ENOMEM;
|
||||
|
||||
inode->i_link = (char *)content;
|
||||
inode->i_size = strlen(content);
|
||||
|
||||
d_add(dentry, inode);
|
||||
inc_nlink(dir);
|
||||
fsnotify_create(dir, dentry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @content is assumed to be a NUL-terminated string that lives
|
||||
* longer than the symlink itself.
|
||||
*/
|
||||
static void nfsd_symlink(struct dentry *parent, const char *name,
|
||||
const char *content)
|
||||
{
|
||||
struct inode *dir = parent->d_inode;
|
||||
struct dentry *dentry;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
inode_lock(dir);
|
||||
dentry = d_alloc_name(parent, name);
|
||||
if (!dentry)
|
||||
goto out_err;
|
||||
ret = __nfsd_symlink(d_inode(parent), dentry, S_IFLNK | 0777, content);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
out:
|
||||
inode_unlock(dir);
|
||||
return;
|
||||
out_err:
|
||||
dput(dentry);
|
||||
dentry = ERR_PTR(ret);
|
||||
goto out;
|
||||
}
|
||||
#else
|
||||
static inline void nfsd_symlink(struct dentry *parent, const char *name,
|
||||
const char *content)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void clear_ncl(struct inode *inode)
|
||||
{
|
||||
struct nfsdfs_client *ncl = inode->i_private;
|
||||
@ -1355,10 +1399,6 @@ static int nfsd_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
[NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
|
||||
[NFSD_MaxConnections] = {"max_connections", &transaction_ops, S_IWUSR|S_IRUGO},
|
||||
[NFSD_Filecache] = {"filecache", &nfsd_file_cache_stats_fops, S_IRUGO},
|
||||
#if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)
|
||||
[NFSD_SupportedEnctypes] = {"supported_krb5_enctypes",
|
||||
&supported_enctypes_fops, S_IRUGO},
|
||||
#endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
[NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR},
|
||||
[NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR},
|
||||
@ -1371,6 +1411,8 @@ static int nfsd_fill_super(struct super_block *sb, struct fs_context *fc)
|
||||
ret = simple_fill_super(sb, 0x6e667364, nfsd_files);
|
||||
if (ret)
|
||||
return ret;
|
||||
nfsd_symlink(sb->s_root, "supported_krb5_enctypes",
|
||||
"/proc/net/rpc/gss_krb5_enctypes");
|
||||
dentry = nfsd_mkdir(sb->s_root, NULL, "clients");
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
Loading…
x
Reference in New Issue
Block a user