devfs_vfsops.c (65051) | devfs_vfsops.c (65132) |
---|---|
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 65051 2000-08-24 15:36:55Z phk $ | 34 * $FreeBSD: head/sys/fs/devfs/devfs_vfsops.c 65132 2000-08-27 14:46:36Z phk $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> 40#include <sys/proc.h> 41#include <sys/vnode.h> 42#include <sys/mount.h> --- 19 unchanged lines hidden (view full) --- 62static int 63devfs_mount(mp, path, data, ndp, p) 64 struct mount *mp; 65 char *path; 66 caddr_t data; 67 struct nameidata *ndp; 68 struct proc *p; 69{ | 35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/kernel.h> 40#include <sys/proc.h> 41#include <sys/vnode.h> 42#include <sys/mount.h> --- 19 unchanged lines hidden (view full) --- 62static int 63devfs_mount(mp, path, data, ndp, p) 64 struct mount *mp; 65 char *path; 66 caddr_t data; 67 struct nameidata *ndp; 68 struct proc *p; 69{ |
70 int error = 0; | 70 int error; |
71 u_int size; 72 struct devfs_mount *fmp; 73 struct vnode *rvp; 74 | 71 u_int size; 72 struct devfs_mount *fmp; 73 struct vnode *rvp; 74 |
75 error = 0; |
|
75 /* | 76 /* |
76 * Update is a no-op | 77 * XXX: flag changes. |
77 */ 78 if (mp->mnt_flag & MNT_UPDATE) 79 return (EOPNOTSUPP); 80 | 78 */ 79 if (mp->mnt_flag & MNT_UPDATE) 80 return (EOPNOTSUPP); 81 |
81 MALLOC(fmp, struct devfs_mount *, sizeof(struct devfs_mount), M_DEVFS, M_WAITOK); 82 | 82 MALLOC(fmp, struct devfs_mount *, sizeof(struct devfs_mount), 83 M_DEVFS, M_WAITOK); |
83 bzero(fmp, sizeof(*fmp)); 84 | 84 bzero(fmp, sizeof(*fmp)); 85 |
85 error = getnewvnode(VT_DEVFS, mp, devfs_vnodeop_p, &rvp); 86 if (error) { 87 FREE(fmp, M_DEVFS); 88 return (error); 89 } 90 91 vhold(rvp); 92 rvp->v_type = VDIR; 93 rvp->v_flag |= VROOT; | |
94 mp->mnt_flag |= MNT_LOCAL; 95 mp->mnt_data = (qaddr_t) fmp; 96 vfs_getnewfsid(mp); 97 98 fmp->dm_inode = NDEVINO; | 86 mp->mnt_flag |= MNT_LOCAL; 87 mp->mnt_data = (qaddr_t) fmp; 88 vfs_getnewfsid(mp); 89 90 fmp->dm_inode = NDEVINO; |
99 fmp->dm_root = rvp; | |
100 101 fmp->dm_rootdir = devfs_vmkdir("(root)", 6, NULL); 102 fmp->dm_rootdir->de_inode = 2; | 91 92 fmp->dm_rootdir = devfs_vmkdir("(root)", 6, NULL); 93 fmp->dm_rootdir->de_inode = 2; |
103 rvp->v_data = fmp->dm_rootdir; 104 | |
105 fmp->dm_basedir = fmp->dm_rootdir; 106 | 94 fmp->dm_basedir = fmp->dm_rootdir; 95 |
96 error = devfs_root(mp, &rvp); 97 if (error) { 98 FREE(fmp, M_DEVFS); 99 return (error); 100 } 101 VOP_UNLOCK(rvp, 0, p); 102 |
|
107 if (path != NULL) { 108 (void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN - 1, &size); 109 } else { 110 strcpy(mp->mnt_stat.f_mntonname, "/"); 111 size = 1; 112 } 113 bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size); 114 bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); --- 7 unchanged lines hidden (view full) --- 122static int 123devfs_unmount(mp, mntflags, p) 124 struct mount *mp; 125 int mntflags; 126 struct proc *p; 127{ 128 int error; 129 int flags = 0; | 103 if (path != NULL) { 104 (void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN - 1, &size); 105 } else { 106 strcpy(mp->mnt_stat.f_mntonname, "/"); 107 size = 1; 108 } 109 bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size); 110 bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); --- 7 unchanged lines hidden (view full) --- 118static int 119devfs_unmount(mp, mntflags, p) 120 struct mount *mp; 121 int mntflags; 122 struct proc *p; 123{ 124 int error; 125 int flags = 0; |
130 struct vnode *rootvp = VFSTODEVFS(mp)->dm_root; | 126 struct vnode *rootvp; |
131 struct devfs_mount *fmp; 132 | 127 struct devfs_mount *fmp; 128 |
133 fmp = (struct devfs_mount*) mp->mnt_data; | 129 error = devfs_root(mp, &rootvp); 130 if (error) 131 return (error); 132 fmp = VFSTODEVFS(mp); |
134 if (mntflags & MNT_FORCE) 135 flags |= FORCECLOSE; | 133 if (mntflags & MNT_FORCE) 134 flags |= FORCECLOSE; |
136 137 /* 138 * Clear out buffer cache. I don't think we 139 * ever get anything cached at this level at the 140 * moment, but who knows... 141 */ | |
142 if (rootvp->v_usecount > 2) 143 return (EBUSY); 144 devfs_purge(fmp->dm_rootdir); 145 error = vflush(mp, rootvp, flags); 146 if (error) 147 return (error); | 135 if (rootvp->v_usecount > 2) 136 return (EBUSY); 137 devfs_purge(fmp->dm_rootdir); 138 error = vflush(mp, rootvp, flags); 139 if (error) 140 return (error); |
148 149 /* 150 * Release reference on underlying root vnode 151 */ | 141 vput(rootvp); |
152 vrele(rootvp); | 142 vrele(rootvp); |
153 /* 154 * And blow it away for future re-use 155 */ | |
156 vgone(rootvp); | 143 vgone(rootvp); |
157 /* 158 * Finally, throw away the devfs_mount structure 159 */ 160 free(mp->mnt_data, M_DEVFS); | |
161 mp->mnt_data = 0; | 144 mp->mnt_data = 0; |
145 free(fmp, M_DEVFS); |
|
162 return 0; 163} 164 | 146 return 0; 147} 148 |
149/* Return locked reference to root. */ 150 |
|
165static int 166devfs_root(mp, vpp) 167 struct mount *mp; 168 struct vnode **vpp; 169{ | 151static int 152devfs_root(mp, vpp) 153 struct mount *mp; 154 struct vnode **vpp; 155{ |
170 struct proc *p = curproc; /* XXX */ | 156 int error; 157 struct proc *p; |
171 struct vnode *vp; | 158 struct vnode *vp; |
159 struct devfs_mount *dmp; |
|
172 | 160 |
173 /* 174 * Return locked reference to root. 175 */ 176 vp = VFSTODEVFS(mp)->dm_root; 177 VREF(vp); 178 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); | 161 p = curproc; /* XXX */ 162 dmp = VFSTODEVFS(mp); 163 error = devfs_allocv(dmp->dm_rootdir, mp, &vp, p); 164 if (error) 165 return (error); 166 vp->v_flag |= VROOT; |
179 *vpp = vp; 180 return (0); 181} 182 183static int 184devfs_statfs(mp, sbp, p) 185 struct mount *mp; 186 struct statfs *sbp; --- 38 unchanged lines hidden --- | 167 *vpp = vp; 168 return (0); 169} 170 171static int 172devfs_statfs(mp, sbp, p) 173 struct mount *mp; 174 struct statfs *sbp; --- 38 unchanged lines hidden --- |