vfs_subr.c (46679) | vfs_subr.c (47028) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 22 unchanged lines hidden (view full) --- 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 22 unchanged lines hidden (view full) --- 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 |
39 * $Id: vfs_subr.c,v 1.192 1999/05/08 06:39:48 phk Exp $ | 39 * $Id: vfs_subr.c,v 1.193 1999/05/08 07:02:38 phk Exp $ |
40 */ 41 42/* 43 * External virtual filesystem routines 44 */ 45#include "opt_ddb.h" 46 47#include <sys/param.h> --- 1135 unchanged lines hidden (view full) --- 1183 } 1184 error = getnewvnode(VT_NON, (struct mount *)0, spec_vnodeop_p, &nvp); 1185 if (error) { 1186 *vpp = NULLVP; 1187 return (error); 1188 } 1189 vp = nvp; 1190 vp->v_type = VBLK; | 40 */ 41 42/* 43 * External virtual filesystem routines 44 */ 45#include "opt_ddb.h" 46 47#include <sys/param.h> --- 1135 unchanged lines hidden (view full) --- 1183 } 1184 error = getnewvnode(VT_NON, (struct mount *)0, spec_vnodeop_p, &nvp); 1185 if (error) { 1186 *vpp = NULLVP; 1187 return (error); 1188 } 1189 vp = nvp; 1190 vp->v_type = VBLK; |
1191 if ((nvp = checkalias(vp, dev, (struct mount *)0)) != NULL) { | 1191 if ((nvp = checkalias(vp, dev2udev(dev), (struct mount *)0)) != NULL) { |
1192 vput(vp); 1193 vp = nvp; 1194 } 1195 *vpp = vp; 1196 return (0); 1197} 1198 1199/* 1200 * Check to see if the new vnode represents a special device 1201 * for which we already have a vnode (either because of 1202 * bdevvp() or because of a different vnode representing 1203 * the same block device). If such an alias exists, deallocate 1204 * the existing contents and return the aliased vnode. The 1205 * caller is responsible for filling it with its new contents. 1206 */ 1207struct vnode * 1208checkalias(nvp, nvp_rdev, mp) 1209 register struct vnode *nvp; | 1192 vput(vp); 1193 vp = nvp; 1194 } 1195 *vpp = vp; 1196 return (0); 1197} 1198 1199/* 1200 * Check to see if the new vnode represents a special device 1201 * for which we already have a vnode (either because of 1202 * bdevvp() or because of a different vnode representing 1203 * the same block device). If such an alias exists, deallocate 1204 * the existing contents and return the aliased vnode. The 1205 * caller is responsible for filling it with its new contents. 1206 */ 1207struct vnode * 1208checkalias(nvp, nvp_rdev, mp) 1209 register struct vnode *nvp; |
1210 dev_t nvp_rdev; | 1210 udev_t nvp_rdev; |
1211 struct mount *mp; 1212{ 1213 struct proc *p = curproc; /* XXX */ 1214 struct vnode *vp; 1215 struct vnode **vpp; | 1211 struct mount *mp; 1212{ 1213 struct proc *p = curproc; /* XXX */ 1214 struct vnode *vp; 1215 struct vnode **vpp; |
1216 int rmaj = major(nvp_rdev); | 1216 int rmaj = umajor(nvp_rdev); 1217 dev_t dev; |
1217 1218 if (nvp->v_type != VBLK && nvp->v_type != VCHR) 1219 return (NULLVP); 1220 | 1218 1219 if (nvp->v_type != VBLK && nvp->v_type != VCHR) 1220 return (NULLVP); 1221 |
1222 dev = udev2dev(nvp_rdev, 2); 1223 |
|
1221 vpp = &speclisth[SPECHASH(nvp_rdev)]; 1222loop: 1223 simple_lock(&spechash_slock); 1224 for (vp = *vpp; vp; vp = vp->v_specnext) { | 1224 vpp = &speclisth[SPECHASH(nvp_rdev)]; 1225loop: 1226 simple_lock(&spechash_slock); 1227 for (vp = *vpp; vp; vp = vp->v_specnext) { |
1225 if (nvp_rdev != vp->v_rdev || nvp->v_type != vp->v_type) | 1228 if (dev != vp->v_rdev || nvp->v_type != vp->v_type) |
1226 continue; 1227 /* 1228 * Alias, but not in use, so flush it out. 1229 * Only alias active device nodes. 1230 * Not sure why we don't re-use this like we do below. 1231 */ 1232 simple_lock(&vp->v_interlock); 1233 if (vp->v_usecount == 0) { --- 23 unchanged lines hidden (view full) --- 1257 /* 1258 * Put the new vnode into the hash chain. 1259 * and if there was an alias, connect them. 1260 */ 1261 MALLOC(sinfo, struct specinfo *, 1262 sizeof(struct specinfo), M_VNODE, M_WAITOK); 1263 bzero(sinfo, sizeof(struct specinfo)); 1264 nvp->v_specinfo = sinfo; | 1229 continue; 1230 /* 1231 * Alias, but not in use, so flush it out. 1232 * Only alias active device nodes. 1233 * Not sure why we don't re-use this like we do below. 1234 */ 1235 simple_lock(&vp->v_interlock); 1236 if (vp->v_usecount == 0) { --- 23 unchanged lines hidden (view full) --- 1260 /* 1261 * Put the new vnode into the hash chain. 1262 * and if there was an alias, connect them. 1263 */ 1264 MALLOC(sinfo, struct specinfo *, 1265 sizeof(struct specinfo), M_VNODE, M_WAITOK); 1266 bzero(sinfo, sizeof(struct specinfo)); 1267 nvp->v_specinfo = sinfo; |
1265 sinfo->si_rdev = nvp_rdev; | 1268 sinfo->si_rdev = dev; |
1266 sinfo->si_hashchain = vpp; 1267 sinfo->si_specnext = *vpp; 1268 sinfo->si_bsize_phys = DEV_BSIZE; 1269 sinfo->si_bsize_best = BLKDEV_IOSIZE; 1270 sinfo->si_bsize_max = MAXBSIZE; 1271 1272 /* 1273 * Ask the device to fix up specinfo. Typically the 1274 * si_bsize_* parameters may need fixing up. 1275 */ 1276 1277 if (nvp->v_type == VBLK && rmaj < nblkdev) { | 1269 sinfo->si_hashchain = vpp; 1270 sinfo->si_specnext = *vpp; 1271 sinfo->si_bsize_phys = DEV_BSIZE; 1272 sinfo->si_bsize_best = BLKDEV_IOSIZE; 1273 sinfo->si_bsize_max = MAXBSIZE; 1274 1275 /* 1276 * Ask the device to fix up specinfo. Typically the 1277 * si_bsize_* parameters may need fixing up. 1278 */ 1279 1280 if (nvp->v_type == VBLK && rmaj < nblkdev) { |
1278 if (bdevsw(nvp_rdev) && bdevsw(nvp_rdev)->d_parms) | 1281 if (bdevsw(dev) && bdevsw(dev)->d_parms) |
1279 | 1282 |
1280 (*bdevsw(nvp_rdev)->d_parms)(nvp_rdev, sinfo, DPARM_GET); | 1283 (*bdevsw(dev)->d_parms)(dev, sinfo, DPARM_GET); |
1281 } else if (nvp->v_type == VCHR && rmaj < nchrdev) { | 1284 } else if (nvp->v_type == VCHR && rmaj < nchrdev) { |
1282 if (devsw(nvp_rdev) && devsw(nvp_rdev)->d_parms) 1283 (*devsw(nvp_rdev)->d_parms)(nvp_rdev, sinfo, DPARM_GET); | 1285 if (devsw(dev) && devsw(dev)->d_parms) 1286 (*devsw(dev)->d_parms)(dev, sinfo, DPARM_GET); |
1284 } 1285 1286 simple_unlock(&spechash_slock); 1287 *vpp = nvp; 1288 if (vp != NULLVP) { 1289 nvp->v_flag |= VALIASED; 1290 vp->v_flag |= VALIASED; 1291 vput(vp); --- 1629 unchanged lines hidden --- | 1287 } 1288 1289 simple_unlock(&spechash_slock); 1290 *vpp = nvp; 1291 if (vp != NULLVP) { 1292 nvp->v_flag |= VALIASED; 1293 vp->v_flag |= VALIASED; 1294 vput(vp); --- 1629 unchanged lines hidden --- |