vnodes referencing this device. Details: cdevsw->d_parms has been removed, the specinfo is available now (== dev_t) and the driver should modify it directly when applicable, and the only driver doing so, does so: vn.c. I am not sure the logic in checking for "<" was right before, and it looks even less so now. An intial pool of 50 struct specinfo are depleted during early boot, after that malloc had better work. It is likely that fewer than 50 would do. Hashing is done from udev_t to dev_t with a prime number remainder hash, experiments show no better hash available for decent cost (MD5 is only marginally better) The prime number used should not be close to a power of two, we use 83 for now. Add new checkalias2() to get around the loss of info from dev2udev() in bdevvp(); The aliased vnodes are hung on a list straight of the dev_t, and speclisth[SPECSZ] is unused. The sharing of struct specinfo means that the v_specnext moves into the vnode which grows by 4 bytes. Don't use a VBLK dev_t which doesn't make sense in MFS, now we hang a dummy cdevsw on B/Cmaj 253 so that things look sane. Storage overhead from all of this is O(50k). Bump __FreeBSD_version to 400009 The next step will add the stuff needed so device-drivers can start to hang things from struct specinfo
77 lines
2.8 KiB
C
77 lines
2.8 KiB
C
/*
|
|
* Copyright (c) 1990, 1993
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by the University of
|
|
* California, Berkeley and its contributors.
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* @(#)specdev.h 8.6 (Berkeley) 5/21/95
|
|
* $Id: specdev.h,v 1.17 1999/05/11 19:54:39 phk Exp $
|
|
*/
|
|
|
|
/*
|
|
* This structure defines the information maintained about
|
|
* special devices. It is allocated in checkalias and freed
|
|
* in vgone.
|
|
*/
|
|
struct specinfo {
|
|
struct mount *si_mountpoint;
|
|
int si_bsize_phys; /* minimum physical block size */
|
|
int si_bsize_best; /* optimal block size / VBLK */
|
|
int si_bsize_max; /* maximum block size */
|
|
|
|
udev_t si_udev;
|
|
SLIST_ENTRY(specinfo) si_hash;
|
|
struct vnode *si_hlist;
|
|
};
|
|
/*
|
|
* Exported shorthand
|
|
*/
|
|
#define v_hashchain v_specinfo->si_hlist
|
|
#define v_specmountpoint v_specinfo->si_mountpoint
|
|
|
|
/*
|
|
* Special device management
|
|
*/
|
|
#define SPECHSZ 64
|
|
#define SPECHASH(rdev) (((unsigned)(minor(rdev)))%SPECHSZ)
|
|
|
|
|
|
/*
|
|
* Prototypes for special file operations on vnodes.
|
|
*/
|
|
extern vop_t **spec_vnodeop_p;
|
|
struct nameidata;
|
|
struct componentname;
|
|
struct ucred;
|
|
struct flock;
|
|
struct buf;
|
|
struct uio;
|
|
|
|
int spec_vnoperate __P((struct vop_generic_args *));
|