Deleted Added
full compact
devfs_vfsops.c (231267) devfs_vfsops.c (232059)
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 *
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 $
34 * $FreeBSD: head/sys/fs/devfs/devfs_vfsops.c 232059 2012-02-23 18:51:24Z 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;
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;
74 int injail, 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
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 if (!prison_allow(td->td_ucred, PR_ALLOW_MOUNT_DEVFS))
85 return (EPERM);
86
84 rsnum = 0;
87 rsnum = 0;
88 injail = jailed(td->td_ucred);
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",
89
90 if (mp->mnt_optnew != NULL) {
91 if (vfs_filteropt(mp->mnt_optnew, devfs_opts))
92 return (EINVAL);
93
94 if (vfs_getopt(mp->mnt_optnew, "ruleset", NULL, NULL) == 0 &&
95 (vfs_scanopt(mp->mnt_optnew, "ruleset", "%d",
92 &rsnum) != 1 || rsnum < 0 || rsnum > 65535))
93 error = EINVAL;
94 }
96 &rsnum) != 1 || rsnum < 0 || rsnum > 65535)) {
97 vfs_mount_error(mp, "%s",
98 "invalid ruleset specification");
99 return (EINVAL);
100 }
95
101
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)
102 if (injail && rsnum != 0 &&
103 rsnum != td->td_ucred->cr_prison->pr_devfs_rsnum)
100 return (EPERM);
104 return (EPERM);
101 /* check rsnum for sanity, devfs_rsnum is uint16_t */
102 if (rsnum < 0 || rsnum > 65535)
103 error = EINVAL;
104 }
105
105 }
106
106 if (error) {
107 vfs_mount_error(mp, "%s", "invalid ruleset specification");
108 return (error);
109 }
107 /* jails enforce their ruleset */
108 if (injail)
109 rsnum = td->td_ucred->cr_prison->pr_devfs_rsnum;
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 ---
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 ---