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. --- 25 unchanged lines hidden (view full) --- 34 * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 35 */ 36 37/* 38 * External virtual filesystem routines 39 */ 40 41#include <sys/cdefs.h> |
42__FBSDID("$FreeBSD: head/sys/kern/vfs_subr.c 130640 2004-06-17 17:16:53Z phk $"); |
43 44#include "opt_ddb.h" 45#include "opt_mac.h" 46 47#include <sys/param.h> 48#include <sys/systm.h> 49#include <sys/bio.h> 50#include <sys/buf.h> --- 311 unchanged lines hidden (view full) --- 362 fsid_t tfsid; 363 int mtype; 364 365 mtx_lock(&mntid_mtx); 366 mtype = mp->mnt_vfc->vfc_typenum; 367 tfsid.val[1] = mtype; 368 mtype = (mtype & 0xFF) << 24; 369 for (;;) { |
370 tfsid.val[0] = makedev(255, |
371 mtype | ((mntid_base & 0xFF00) << 8) | (mntid_base & 0xFF)); 372 mntid_base++; 373 if (vfs_getvfs(&tfsid) == NULL) 374 break; 375 } 376 mp->mnt_stat.f_fsid.val[0] = tfsid.val[0]; 377 mp->mnt_stat.f_fsid.val[1] = tfsid.val[1]; 378 mtx_unlock(&mntid_mtx); --- 1360 unchanged lines hidden (view full) --- 1739bdevvp(dev, vpp) 1740 struct cdev *dev; 1741 struct vnode **vpp; 1742{ 1743 register struct vnode *vp; 1744 struct vnode *nvp; 1745 int error; 1746 |
1747 if (dev == NULL) { |
1748 *vpp = NULLVP; 1749 return (ENXIO); 1750 } 1751 if (vfinddev(dev, vpp)) 1752 return (0); 1753 1754 error = getnewvnode("none", (struct mount *)0, spec_vnodeop_p, &nvp); 1755 if (error) { --- 25 unchanged lines hidden (view full) --- 1781 * The reason for this gunk is that multiple vnodes can reference 1782 * the same physical device, so checking vp->v_usecount to see 1783 * how many users there are is inadequate; the v_usecount for 1784 * the vnodes need to be accumulated. vcount() does that. 1785 */ 1786struct vnode * 1787addaliasu(nvp, nvp_rdev) 1788 struct vnode *nvp; |
1789 dev_t nvp_rdev; |
1790{ 1791 struct vnode *ovp; 1792 vop_t **ops; 1793 struct cdev *dev; 1794 1795 if (nvp->v_type == VBLK) 1796 return (nvp); 1797 if (nvp->v_type != VCHR) 1798 panic("addaliasu on non-special vnode"); |
1799 dev = findcdev(nvp_rdev); 1800 if (dev == NULL) |
1801 return (nvp); 1802 /* 1803 * Check to see if we have a bdevvp vnode with no associated 1804 * filesystem. If so, we want to associate the filesystem of 1805 * the new newly instigated vnode with the bdevvp vnode and 1806 * discard the newly created vnode rather than leaving the 1807 * bdevvp vnode lying around with no associated filesystem. 1808 */ --- 22 unchanged lines hidden (view full) --- 1831 nvp->v_op = ops; 1832 insmntque(ovp, nvp->v_mount); 1833 vrele(nvp); 1834 vgone(nvp); 1835 return (ovp); 1836} 1837 1838/* This is a local helper function that do the same as addaliasu, but for a |
1839 * struct cdev *instead of an dev_t. */ |
1840static void 1841addalias(nvp, dev) 1842 struct vnode *nvp; 1843 struct cdev *dev; 1844{ 1845 1846 KASSERT(nvp->v_type == VCHR, ("addalias on non-special vnode")); 1847 dev_ref(dev); --- 728 unchanged lines hidden (view full) --- 2576 vclean(vp, DOCLOSE, td); 2577 VI_UNLOCK(vp); 2578 2579 /* 2580 * If special device, remove it from special device alias list 2581 * if it is on one. 2582 */ 2583 VI_LOCK(vp); |
2584 if (vp->v_type == VCHR && vp->v_rdev != NULL) { |
2585 mtx_lock(&spechash_mtx); 2586 SLIST_REMOVE(&vp->v_rdev->si_hlist, vp, vnode, v_specnext); 2587 vp->v_rdev->si_usecount -= vp->v_usecount; 2588 mtx_unlock(&spechash_mtx); 2589 dev_rel(vp->v_rdev); 2590 vp->v_rdev = NULL; 2591 } 2592 --- 809 unchanged lines hidden (view full) --- 3402 * extract the struct cdev *from a VCHR 3403 */ 3404struct cdev * 3405vn_todev(vp) 3406 struct vnode *vp; 3407{ 3408 3409 if (vp->v_type != VCHR) |
3410 return (NULL); |
3411 return (vp->v_rdev); 3412} 3413 3414/* 3415 * Check if vnode represents a disk device 3416 */ 3417int 3418vn_isdisk(vp, errp) --- 430 unchanged lines hidden --- |