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 --- |