Deleted Added
full compact
devfs_vfsops.c (160425) devfs_vfsops.c (162398)
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 160425 2006-07-17 09:07:02Z phk $
34 * $FreeBSD: head/sys/fs/devfs/devfs_vfsops.c 162398 2006-09-18 13:23:08Z kib $
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>

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

72 error = 0;
73
74 if (mp->mnt_flag & (MNT_UPDATE | MNT_ROOTFS))
75 return (EOPNOTSUPP);
76
77 fmp = malloc(sizeof *fmp, M_DEVFS, M_WAITOK | M_ZERO);
78 fmp->dm_idx = alloc_unr(devfs_unr);
79 sx_init(&fmp->dm_lock, "devfsmount");
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>

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

72 error = 0;
73
74 if (mp->mnt_flag & (MNT_UPDATE | MNT_ROOTFS))
75 return (EOPNOTSUPP);
76
77 fmp = malloc(sizeof *fmp, M_DEVFS, M_WAITOK | M_ZERO);
78 fmp->dm_idx = alloc_unr(devfs_unr);
79 sx_init(&fmp->dm_lock, "devfsmount");
80 fmp->dm_holdcnt = 1;
80
81 mp->mnt_flag |= MNT_LOCAL;
82 mp->mnt_kern_flag |= MNTK_MPSAFE;
83#ifdef MAC
84 mp->mnt_flag |= MNT_MULTILABEL;
85#endif
86 fmp->dm_mount = mp;
87 mp->mnt_data = (void *) fmp;

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

99
100 VOP_UNLOCK(rvp, 0, td);
101
102 vfs_mountedfrom(mp, "devfs");
103
104 return (0);
105}
106
81
82 mp->mnt_flag |= MNT_LOCAL;
83 mp->mnt_kern_flag |= MNTK_MPSAFE;
84#ifdef MAC
85 mp->mnt_flag |= MNT_MULTILABEL;
86#endif
87 fmp->dm_mount = mp;
88 mp->mnt_data = (void *) fmp;

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

100
101 VOP_UNLOCK(rvp, 0, td);
102
103 vfs_mountedfrom(mp, "devfs");
104
105 return (0);
106}
107
108void
109devfs_unmount_final(struct devfs_mount *fmp)
110{
111 sx_destroy(&fmp->dm_lock);
112 free(fmp, M_DEVFS);
113}
114
107static int
108devfs_unmount(struct mount *mp, int mntflags, struct thread *td)
109{
110 int error;
111 int flags = 0;
112 struct devfs_mount *fmp;
115static int
116devfs_unmount(struct mount *mp, int mntflags, struct thread *td)
117{
118 int error;
119 int flags = 0;
120 struct devfs_mount *fmp;
121 int hold;
122 u_int idx;
113
114 fmp = VFSTODEVFS(mp);
123
124 fmp = VFSTODEVFS(mp);
125 KASSERT(fmp->dm_mount != NULL,
126 ("devfs_unmount unmounted devfs_mount"));
115 /* There is 1 extra root vnode reference from devfs_mount(). */
116 error = vflush(mp, 1, flags, td);
117 if (error)
118 return (error);
119 sx_xlock(&fmp->dm_lock);
120 devfs_cleanup(fmp);
121 devfs_rules_cleanup(fmp);
127 /* There is 1 extra root vnode reference from devfs_mount(). */
128 error = vflush(mp, 1, flags, td);
129 if (error)
130 return (error);
131 sx_xlock(&fmp->dm_lock);
132 devfs_cleanup(fmp);
133 devfs_rules_cleanup(fmp);
122 sx_xunlock(&fmp->dm_lock);
134 fmp->dm_mount = NULL;
135 hold = --fmp->dm_holdcnt;
123 mp->mnt_data = NULL;
136 mp->mnt_data = NULL;
124 sx_destroy(&fmp->dm_lock);
125 free_unr(devfs_unr, fmp->dm_idx);
126 free(fmp, M_DEVFS);
137 idx = fmp->dm_idx;
138 sx_xunlock(&fmp->dm_lock);
139 free_unr(devfs_unr, idx);
140 if (hold == 0)
141 devfs_unmount_final(fmp);
127 return 0;
128}
129
130/* Return locked reference to root. */
131
132static int
133devfs_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
134{
135 int error;
136 struct vnode *vp;
137 struct devfs_mount *dmp;
138
139 dmp = VFSTODEVFS(mp);
142 return 0;
143}
144
145/* Return locked reference to root. */
146
147static int
148devfs_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
149{
150 int error;
151 struct vnode *vp;
152 struct devfs_mount *dmp;
153
154 dmp = VFSTODEVFS(mp);
155 sx_xlock(&dmp->dm_lock);
140 error = devfs_allocv(dmp->dm_rootdir, mp, &vp, td);
141 if (error)
142 return (error);
143 vp->v_vflag |= VV_ROOT;
144 *vpp = vp;
145 return (0);
146}
147

--- 23 unchanged lines hidden ---
156 error = devfs_allocv(dmp->dm_rootdir, mp, &vp, td);
157 if (error)
158 return (error);
159 vp->v_vflag |= VV_ROOT;
160 *vpp = vp;
161 return (0);
162}
163

--- 23 unchanged lines hidden ---