summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormm <mm@FreeBSD.org>2012-02-26 16:30:39 +0000
committermm <mm@FreeBSD.org>2012-02-26 16:30:39 +0000
commitd974ef7be1504142ccd2be94e834e3593558ab87 (patch)
tree84f0b28d51d1352b9703ae77258c3c31d0eaf1d3 /sys
parentb160a2190c63686eb12f922151a5d021ec93634d (diff)
downloadFreeBSD-src-d974ef7be1504142ccd2be94e834e3593558ab87.zip
FreeBSD-src-d974ef7be1504142ccd2be94e834e3593558ab87.tar.gz
Analogous to r232059, add a parameter for the ZFS file system:
allow.mount.zfs: allow mounting the zfs filesystem inside a jail This way the permssions for mounting all current VFCF_JAIL filesystems inside a jail are controlled wia allow.mount.* jail parameters. Update sysctl descriptions. Update jail(8) and zfs(8) manpages. TODO: document the connection of allow.mount.* and VFCF_JAIL for kernel developers MFC after: 10 days
Diffstat (limited to 'sys')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c4
-rw-r--r--sys/kern/kern_jail.c16
-rw-r--r--sys/sys/jail.h3
3 files changed, 18 insertions, 5 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
index 211d73f..467b6a6 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
@@ -60,6 +60,7 @@
#include <sys/dmu_objset.h>
#include <sys/spa_boot.h>
#include <sys/sa.h>
+#include <sys/jail.h>
#include "zfs_comutil.h"
struct mtx zfs_debug_mtx;
@@ -1533,6 +1534,9 @@ zfs_mount(vfs_t *vfsp)
int error = 0;
int canwrite;
+ if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_ZFS))
+ return (EPERM);
+
if (vfs_getopt(vfsp->mnt_optnew, "from", (void **)&osname, NULL))
return (EINVAL);
diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c
index 3ba565b..372e0b8 100644
--- a/sys/kern/kern_jail.c
+++ b/sys/kern/kern_jail.c
@@ -203,6 +203,7 @@ static char *pr_allow_names[] = {
"allow.socket_af",
"allow.mount.devfs",
"allow.mount.nullfs",
+ "allow.mount.zfs",
};
const size_t pr_allow_names_size = sizeof(pr_allow_names);
@@ -216,6 +217,7 @@ static char *pr_allow_nonames[] = {
"allow.nosocket_af",
"allow.mount.nodevfs",
"allow.mount.nonullfs",
+ "allow.mount.nozfs",
};
const size_t pr_allow_nonames_size = sizeof(pr_allow_nonames);
@@ -4199,11 +4201,15 @@ SYSCTL_PROC(_security_jail, OID_AUTO, mount_allowed,
SYSCTL_PROC(_security_jail, OID_AUTO, mount_devfs_allowed,
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
NULL, PR_ALLOW_MOUNT_DEVFS, sysctl_jail_default_allow, "I",
- "Processes in jail can mount/unmount the devfs file system");
+ "Processes in jail can mount the devfs file system");
SYSCTL_PROC(_security_jail, OID_AUTO, mount_nullfs_allowed,
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
NULL, PR_ALLOW_MOUNT_NULLFS, sysctl_jail_default_allow, "I",
- "Processes in jail can mount/unmount the nullfs file system");
+ "Processes in jail can mount the nullfs file system");
+SYSCTL_PROC(_security_jail, OID_AUTO, mount_zfs_allowed,
+ CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+ NULL, PR_ALLOW_MOUNT_ZFS, sysctl_jail_default_allow, "I",
+ "Processes in jail can mount the zfs file system");
static int
sysctl_jail_default_level(SYSCTL_HANDLER_ARGS)
@@ -4347,9 +4353,11 @@ SYSCTL_JAIL_PARAM_SUBNODE(allow, mount, "Jail mount/unmount permission flags");
SYSCTL_JAIL_PARAM(_allow_mount, , CTLTYPE_INT | CTLFLAG_RW,
"B", "Jail may mount/unmount jail-friendly file systems in general");
SYSCTL_JAIL_PARAM(_allow_mount, devfs, CTLTYPE_INT | CTLFLAG_RW,
- "B", "Jail may mount/unmount the devfs file system");
+ "B", "Jail may mount the devfs file system");
SYSCTL_JAIL_PARAM(_allow_mount, nullfs, CTLTYPE_INT | CTLFLAG_RW,
- "B", "Jail may mount/unmount the nullfs file system");
+ "B", "Jail may mount the nullfs file system");
+SYSCTL_JAIL_PARAM(_allow_mount, zfs, CTLTYPE_INT | CTLFLAG_RW,
+ "B", "Jail may mount the zfs file system");
void
prison_racct_foreach(void (*callback)(struct racct *racct,
diff --git a/sys/sys/jail.h b/sys/sys/jail.h
index 7d87b84..2e8edc6 100644
--- a/sys/sys/jail.h
+++ b/sys/sys/jail.h
@@ -225,7 +225,8 @@ struct prison_racct {
#define PR_ALLOW_SOCKET_AF 0x0040
#define PR_ALLOW_MOUNT_DEVFS 0x0080
#define PR_ALLOW_MOUNT_NULLFS 0x0100
-#define PR_ALLOW_ALL 0x01ff
+#define PR_ALLOW_MOUNT_ZFS 0x0200
+#define PR_ALLOW_ALL 0x03ff
/*
* OSD methods
OpenPOWER on IntegriCloud