Merge branch 'work.mount' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs mount infrastructure updates from Al Viro: "The rest of core infrastructure; no new syscalls in that pile, but the old parts are switched to new infrastructure. At that point conversions of individual filesystems can happen independently; some are done here (afs, cgroup, procfs, etc.), there's also a large series outside of that pile dealing with NFS (quite a bit of option-parsing stuff is getting used there - it's one of the most convoluted filesystems in terms of mount-related logics), but NFS bits are the next cycle fodder. It got seriously simplified since the last cycle; documentation is probably the weakest bit at the moment - I considered dropping the commit introducing Documentation/filesystems/mount_api.txt (cutting the size increase by quarter ;-), but decided that it would be better to fix it up after -rc1 instead. That pile allows to do followup work in independent branches, which should make life much easier for the next cycle. fs/super.c size increase is unpleasant; there's a followup series that allows to shrink it considerably, but I decided to leave that until the next cycle" * 'work.mount' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (41 commits) afs: Use fs_context to pass parameters over automount afs: Add fs_context support vfs: Add some logging to the core users of the fs_context log vfs: Implement logging through fs_context vfs: Provide documentation for new mount API vfs: Remove kern_mount_data() hugetlbfs: Convert to fs_context cpuset: Use fs_context kernfs, sysfs, cgroup, intel_rdt: Support fs_context cgroup: store a reference to cgroup_ns into cgroup_fs_context cgroup1_get_tree(): separate "get cgroup_root to use" into a separate helper cgroup_do_mount(): massage calling conventions cgroup: stash cgroup_root reference into cgroup_fs_context cgroup2: switch to option-by-option parsing cgroup1: switch to option-by-option parsing cgroup: take options parsing into ->parse_monolithic() cgroup: fold cgroup1_mount() into cgroup1_get_tree() cgroup: start switching to fs_context ipc: Convert mqueue fs to fs_context proc: Add fs_context support to procfs ...
This commit is contained in:
@@ -43,6 +43,8 @@
|
||||
#include <linux/shm.h>
|
||||
#include <linux/binfmts.h>
|
||||
#include <linux/parser.h>
|
||||
#include <linux/fs_context.h>
|
||||
#include <linux/fs_parser.h>
|
||||
#include "smack.h"
|
||||
|
||||
#define TRANS_TRUE "TRUE"
|
||||
@@ -526,7 +528,6 @@ static int smack_syslog(int typefrom_file)
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Superblock Hooks.
|
||||
*/
|
||||
@@ -631,6 +632,92 @@ out_opt_err:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* smack_fs_context_dup - Duplicate the security data on fs_context duplication
|
||||
* @fc: The new filesystem context.
|
||||
* @src_fc: The source filesystem context being duplicated.
|
||||
*
|
||||
* Returns 0 on success or -ENOMEM on error.
|
||||
*/
|
||||
static int smack_fs_context_dup(struct fs_context *fc,
|
||||
struct fs_context *src_fc)
|
||||
{
|
||||
struct smack_mnt_opts *dst, *src = src_fc->security;
|
||||
|
||||
if (!src)
|
||||
return 0;
|
||||
|
||||
fc->security = kzalloc(sizeof(struct smack_mnt_opts), GFP_KERNEL);
|
||||
if (!fc->security)
|
||||
return -ENOMEM;
|
||||
dst = fc->security;
|
||||
|
||||
if (src->fsdefault) {
|
||||
dst->fsdefault = kstrdup(src->fsdefault, GFP_KERNEL);
|
||||
if (!dst->fsdefault)
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (src->fsfloor) {
|
||||
dst->fsfloor = kstrdup(src->fsfloor, GFP_KERNEL);
|
||||
if (!dst->fsfloor)
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (src->fshat) {
|
||||
dst->fshat = kstrdup(src->fshat, GFP_KERNEL);
|
||||
if (!dst->fshat)
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (src->fsroot) {
|
||||
dst->fsroot = kstrdup(src->fsroot, GFP_KERNEL);
|
||||
if (!dst->fsroot)
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (src->fstransmute) {
|
||||
dst->fstransmute = kstrdup(src->fstransmute, GFP_KERNEL);
|
||||
if (!dst->fstransmute)
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct fs_parameter_spec smack_param_specs[] = {
|
||||
fsparam_string("fsdefault", Opt_fsdefault),
|
||||
fsparam_string("fsfloor", Opt_fsfloor),
|
||||
fsparam_string("fshat", Opt_fshat),
|
||||
fsparam_string("fsroot", Opt_fsroot),
|
||||
fsparam_string("fstransmute", Opt_fstransmute),
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct fs_parameter_description smack_fs_parameters = {
|
||||
.name = "smack",
|
||||
.specs = smack_param_specs,
|
||||
};
|
||||
|
||||
/**
|
||||
* smack_fs_context_parse_param - Parse a single mount parameter
|
||||
* @fc: The new filesystem context being constructed.
|
||||
* @param: The parameter.
|
||||
*
|
||||
* Returns 0 on success, -ENOPARAM to pass the parameter on or anything else on
|
||||
* error.
|
||||
*/
|
||||
static int smack_fs_context_parse_param(struct fs_context *fc,
|
||||
struct fs_parameter *param)
|
||||
{
|
||||
struct fs_parse_result result;
|
||||
int opt, rc;
|
||||
|
||||
opt = fs_parse(fc, &smack_fs_parameters, param, &result);
|
||||
if (opt < 0)
|
||||
return opt;
|
||||
|
||||
rc = smack_add_opt(opt, param->string, &fc->security);
|
||||
if (!rc)
|
||||
param->string = NULL;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int smack_sb_eat_lsm_opts(char *options, void **mnt_opts)
|
||||
{
|
||||
char *from = options, *to = options;
|
||||
@@ -4495,6 +4582,9 @@ static struct security_hook_list smack_hooks[] __lsm_ro_after_init = {
|
||||
LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme),
|
||||
LSM_HOOK_INIT(syslog, smack_syslog),
|
||||
|
||||
LSM_HOOK_INIT(fs_context_dup, smack_fs_context_dup),
|
||||
LSM_HOOK_INIT(fs_context_parse_param, smack_fs_context_parse_param),
|
||||
|
||||
LSM_HOOK_INIT(sb_alloc_security, smack_sb_alloc_security),
|
||||
LSM_HOOK_INIT(sb_free_security, smack_sb_free_security),
|
||||
LSM_HOOK_INIT(sb_free_mnt_opts, smack_free_mnt_opts),
|
||||
|
Reference in New Issue
Block a user