Deleted Added
sdiff udiff text old ( 231267 ) new ( 232059 )
full compact
1/*-
2 * Copyright (c) 1992, 1993, 1995
3 * The Regents of the University of California. All rights reserved.
4 * Copyright (c) 2000
5 * Poul-Henning Kamp. All rights reserved.
6 *
7 * This code is derived from software donated to Berkeley by
8 * Jan-Simon Pendry.

--- 17 unchanged lines hidden (view full) ---

26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * @(#)kernfs_vfsops.c 8.10 (Berkeley) 5/14/95
32 * From: FreeBSD: src/sys/miscfs/kernfs/kernfs_vfsops.c 1.36
33 *
34 * $FreeBSD: head/sys/fs/devfs/devfs_vfsops.c 231267 2012-02-09 10:22:08Z mm $
35 */
36
37#include <sys/param.h>
38#include <sys/systm.h>
39#include <sys/kernel.h>
40#include <sys/lock.h>
41#include <sys/malloc.h>
42#include <sys/mount.h>

--- 23 unchanged lines hidden (view full) ---

66 */
67static int
68devfs_mount(struct mount *mp)
69{
70 int error;
71 struct devfs_mount *fmp;
72 struct vnode *rvp;
73 struct thread *td = curthread;
74 int rsnum;
75
76 if (devfs_unr == NULL)
77 devfs_unr = new_unrhdr(0, INT_MAX, NULL);
78
79 error = 0;
80
81 if (mp->mnt_flag & MNT_ROOTFS)
82 return (EOPNOTSUPP);
83
84 rsnum = 0;
85
86 if (mp->mnt_optnew != NULL) {
87 if (vfs_filteropt(mp->mnt_optnew, devfs_opts))
88 return (EINVAL);
89
90 if (vfs_getopt(mp->mnt_optnew, "ruleset", NULL, NULL) == 0 &&
91 (vfs_scanopt(mp->mnt_optnew, "ruleset", "%d",
92 &rsnum) != 1 || rsnum < 0 || rsnum > 65535))
93 error = EINVAL;
94 }
95
96 /* jails enforce their ruleset, prison0 has no restrictions */
97 if (td->td_ucred->cr_prison->pr_devfs_rsnum != 0) {
98 rsnum = td->td_ucred->cr_prison->pr_devfs_rsnum;
99 if (rsnum == -1)
100 return (EPERM);
101 /* check rsnum for sanity, devfs_rsnum is uint16_t */
102 if (rsnum < 0 || rsnum > 65535)
103 error = EINVAL;
104 }
105
106 if (error) {
107 vfs_mount_error(mp, "%s", "invalid ruleset specification");
108 return (error);
109 }
110
111 if (mp->mnt_flag & MNT_UPDATE) {
112 if (rsnum != 0) {
113 fmp = mp->mnt_data;
114 if (fmp != NULL) {
115 sx_xlock(&fmp->dm_lock);
116 devfs_ruleset_set((devfs_rsnum)rsnum, fmp);
117 devfs_ruleset_apply(fmp);

--- 125 unchanged lines hidden ---