Put a version element in the VFS filesystem configuration structure

and refuse initializing filesystems with a wrong version.  This will
aid maintenance activites on the 5-stable branch.

s/vfs_mount/vfs_omount/

s/vfs_nmount/vfs_mount/

Name our filesystems mount function consistently.

Eliminate the namiedata argument to both vfs_mount and vfs_omount.
It was originally there to save stack space.  A few places abused
it to get hold of some credentials to pass around.  Effectively
it is unused.

Reorganize the root filesystem selection code.
This commit is contained in:
Poul-Henning Kamp 2004-07-30 22:08:52 +00:00
parent 483745339d
commit 5e8c582ac2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=132902
27 changed files with 221 additions and 222 deletions

View File

@ -83,6 +83,8 @@ struct coda_op_stats coda_vfsopstats[CODA_VFSOPS_SIZE];
extern int coda_nc_initialized; /* Set if cache has been initialized */
extern int vc_nb_open(struct cdev *, int, int, struct thread *);
static vfs_omount_t coda_omount;
int
coda_vfsopstats_init(void)
{
@ -105,11 +107,10 @@ coda_vfsopstats_init(void)
*/
/*ARGSUSED*/
int
coda_mount(vfsp, path, data, ndp, td)
coda_omount(vfsp, path, data, td)
struct mount *vfsp; /* Allocated and initialized by mount(2) */
char *path; /* path covered: ignored by the fs-layer */
caddr_t data; /* Need to define a data type for this in netbsd? */
struct nameidata *ndp; /* Clobber this to lookup the device name */
struct thread *td;
{
struct vnode *dvp;
@ -120,7 +121,7 @@ coda_mount(vfsp, path, data, ndp, td)
CodaFid rootfid = INVAL_FID;
CodaFid ctlfid = CTL_FID;
int error;
struct nameidata ndp;
ENTRY;
coda_vfsopstats_init();
@ -133,9 +134,9 @@ coda_mount(vfsp, path, data, ndp, td)
}
/* Validate mount device. Similar to getmdev(). */
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, data, td);
error = namei(ndp);
dvp = ndp->ni_vp;
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, data, td);
error = namei(&ndp);
dvp = ndp.ni_vp;
if (error) {
MARK_INT_FAIL(CODA_MOUNT_STATS);
@ -144,12 +145,12 @@ coda_mount(vfsp, path, data, ndp, td)
if (dvp->v_type != VCHR) {
MARK_INT_FAIL(CODA_MOUNT_STATS);
vrele(dvp);
NDFREE(ndp, NDF_ONLY_PNBUF);
NDFREE(&ndp, NDF_ONLY_PNBUF);
return(ENXIO);
}
dev = dvp->v_rdev;
vrele(dvp);
NDFREE(ndp, NDF_ONLY_PNBUF);
NDFREE(&ndp, NDF_ONLY_PNBUF);
/*
* See if the device table matches our expectations.
@ -216,7 +217,7 @@ coda_mount(vfsp, path, data, ndp, td)
/* error is currently guaranteed to be zero, but in case some
code changes... */
CODADEBUG(1,
myprintf(("coda_mount returned %d\n",error)););
myprintf(("coda_omount returned %d\n",error)););
if (error)
MARK_INT_FAIL(CODA_MOUNT_STATS);
else
@ -300,10 +301,10 @@ coda_root(vfsp, vpp, td)
/*
* Cache the root across calls. We only need to pass the request
* on to Venus if the root vnode is the dummy we installed in
* coda_mount() with all c_fid members zeroed.
* coda_omount() with all c_fid members zeroed.
*
* XXX In addition, if we are called between coda_mount() and
* coda_start(), we assume that the request is from vfs_mount()
* XXX In addition, if we are called between coda_omount() and
* coda_start(), we assume that the request is from vfs_omount()
* (before the call to checkdirs()) and return the dummy root
* node to avoid a deadlock. This bug is fixed in the Coda CVS
* repository but not in any released versions as of 6 Mar 2003.
@ -543,7 +544,7 @@ struct mount *devtomp(dev)
}
struct vfsops coda_vfsops = {
.vfs_mount = coda_mount,
.vfs_omount = coda_omount,
.vfs_root = coda_root,
.vfs_start = coda_start,
.vfs_statfs = coda_nb_statfs,

View File

@ -65,7 +65,7 @@ MALLOC_DEFINE(M_ISOFSNODE, "ISOFS node", "ISOFS vnode private part");
struct iconv_functions *cd9660_iconv = NULL;
static vfs_mount_t cd9660_mount;
static vfs_omount_t cd9660_omount;
static vfs_unmount_t cd9660_unmount;
static vfs_root_t cd9660_root;
static vfs_statfs_t cd9660_statfs;
@ -76,7 +76,7 @@ static vfs_vptofh_t cd9660_vptofh;
static struct vfsops cd9660_vfsops = {
.vfs_fhtovp = cd9660_fhtovp,
.vfs_init = cd9660_init,
.vfs_mount = cd9660_mount,
.vfs_omount = cd9660_omount,
.vfs_root = cd9660_root,
.vfs_statfs = cd9660_statfs,
.vfs_uninit = cd9660_uninit,
@ -179,11 +179,10 @@ iso_mountroot(mp, td)
* mount system call
*/
static int
cd9660_mount(mp, path, data, ndp, td)
cd9660_omount(mp, path, data, td)
struct mount *mp;
char *path;
caddr_t data;
struct nameidata *ndp;
struct thread *td;
{
struct vnode *devvp;
@ -192,6 +191,7 @@ cd9660_mount(mp, path, data, ndp, td)
int error;
mode_t accessmode;
struct iso_mnt *imp = 0;
struct nameidata ndp;
if (path == NULL) /* We are doing the initial root mount */
return (iso_mountroot(mp, td));
@ -214,11 +214,11 @@ cd9660_mount(mp, path, data, ndp, td)
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible block device.
*/
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
if ((error = namei(ndp)))
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
if ((error = namei(&ndp)))
return (error);
NDFREE(ndp, NDF_ONLY_PNBUF);
devvp = ndp->ni_vp;
NDFREE(&ndp, NDF_ONLY_PNBUF);
devvp = ndp.ni_vp;
if (!vn_isdisk(devvp, &error)) {
vrele(devvp);

View File

@ -83,6 +83,8 @@ struct coda_op_stats coda_vfsopstats[CODA_VFSOPS_SIZE];
extern int coda_nc_initialized; /* Set if cache has been initialized */
extern int vc_nb_open(struct cdev *, int, int, struct thread *);
static vfs_omount_t coda_omount;
int
coda_vfsopstats_init(void)
{
@ -105,11 +107,10 @@ coda_vfsopstats_init(void)
*/
/*ARGSUSED*/
int
coda_mount(vfsp, path, data, ndp, td)
coda_omount(vfsp, path, data, td)
struct mount *vfsp; /* Allocated and initialized by mount(2) */
char *path; /* path covered: ignored by the fs-layer */
caddr_t data; /* Need to define a data type for this in netbsd? */
struct nameidata *ndp; /* Clobber this to lookup the device name */
struct thread *td;
{
struct vnode *dvp;
@ -120,7 +121,7 @@ coda_mount(vfsp, path, data, ndp, td)
CodaFid rootfid = INVAL_FID;
CodaFid ctlfid = CTL_FID;
int error;
struct nameidata ndp;
ENTRY;
coda_vfsopstats_init();
@ -133,9 +134,9 @@ coda_mount(vfsp, path, data, ndp, td)
}
/* Validate mount device. Similar to getmdev(). */
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, data, td);
error = namei(ndp);
dvp = ndp->ni_vp;
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, data, td);
error = namei(&ndp);
dvp = ndp.ni_vp;
if (error) {
MARK_INT_FAIL(CODA_MOUNT_STATS);
@ -144,12 +145,12 @@ coda_mount(vfsp, path, data, ndp, td)
if (dvp->v_type != VCHR) {
MARK_INT_FAIL(CODA_MOUNT_STATS);
vrele(dvp);
NDFREE(ndp, NDF_ONLY_PNBUF);
NDFREE(&ndp, NDF_ONLY_PNBUF);
return(ENXIO);
}
dev = dvp->v_rdev;
vrele(dvp);
NDFREE(ndp, NDF_ONLY_PNBUF);
NDFREE(&ndp, NDF_ONLY_PNBUF);
/*
* See if the device table matches our expectations.
@ -216,7 +217,7 @@ coda_mount(vfsp, path, data, ndp, td)
/* error is currently guaranteed to be zero, but in case some
code changes... */
CODADEBUG(1,
myprintf(("coda_mount returned %d\n",error)););
myprintf(("coda_omount returned %d\n",error)););
if (error)
MARK_INT_FAIL(CODA_MOUNT_STATS);
else
@ -300,10 +301,10 @@ coda_root(vfsp, vpp, td)
/*
* Cache the root across calls. We only need to pass the request
* on to Venus if the root vnode is the dummy we installed in
* coda_mount() with all c_fid members zeroed.
* coda_omount() with all c_fid members zeroed.
*
* XXX In addition, if we are called between coda_mount() and
* coda_start(), we assume that the request is from vfs_mount()
* XXX In addition, if we are called between coda_omount() and
* coda_start(), we assume that the request is from vfs_omount()
* (before the call to checkdirs()) and return the dummy root
* node to avoid a deadlock. This bug is fixed in the Coda CVS
* repository but not in any released versions as of 6 Mar 2003.
@ -543,7 +544,7 @@ struct mount *devtomp(dev)
}
struct vfsops coda_vfsops = {
.vfs_mount = coda_mount,
.vfs_omount = coda_omount,
.vfs_root = coda_root,
.vfs_start = coda_start,
.vfs_statfs = coda_nb_statfs,

View File

@ -51,7 +51,7 @@
MALLOC_DEFINE(M_DEVFS, "DEVFS", "DEVFS data");
static vfs_nmount_t devfs_nmount;
static vfs_mount_t devfs_mount;
static vfs_unmount_t devfs_unmount;
static vfs_root_t devfs_root;
static vfs_statfs_t devfs_statfs;
@ -60,10 +60,7 @@ static vfs_statfs_t devfs_statfs;
* Mount the filesystem
*/
static int
devfs_nmount(mp, ndp, td)
struct mount *mp;
struct nameidata *ndp;
struct thread *td;
devfs_mount(struct mount *mp, struct thread *td)
{
int error;
struct devfs_mount *fmp;
@ -187,7 +184,7 @@ devfs_statfs(mp, sbp, td)
}
static struct vfsops devfs_vfsops = {
.vfs_nmount = devfs_nmount,
.vfs_mount = devfs_mount,
.vfs_root = devfs_root,
.vfs_statfs = devfs_statfs,
.vfs_unmount = devfs_unmount,

View File

@ -54,7 +54,7 @@
static MALLOC_DEFINE(M_FDESCMNT, "FDESC mount", "FDESC mount structure");
static vfs_nmount_t fdesc_mount;
static vfs_mount_t fdesc_mount;
static vfs_unmount_t fdesc_unmount;
static vfs_statfs_t fdesc_statfs;
@ -62,10 +62,7 @@ static vfs_statfs_t fdesc_statfs;
* Mount the per-process file descriptors (/dev/fd)
*/
static int
fdesc_mount(mp, ndp, td)
struct mount *mp;
struct nameidata *ndp;
struct thread *td;
fdesc_mount(struct mount *mp, struct thread *td)
{
int error = 0;
struct fdescmount *fmp;
@ -203,7 +200,7 @@ fdesc_statfs(mp, sbp, td)
static struct vfsops fdesc_vfsops = {
.vfs_init = fdesc_init,
.vfs_nmount = fdesc_mount,
.vfs_mount = fdesc_mount,
.vfs_root = fdesc_root,
.vfs_statfs = fdesc_statfs,
.vfs_unmount = fdesc_unmount,

View File

@ -62,7 +62,7 @@ static vfs_init_t hpfs_init;
static vfs_uninit_t hpfs_uninit;
static vfs_fhtovp_t hpfs_fhtovp;
static vfs_vget_t hpfs_vget;
static vfs_mount_t hpfs_mount;
static vfs_omount_t hpfs_omount;
static vfs_root_t hpfs_root;
static vfs_statfs_t hpfs_statfs;
static vfs_unmount_t hpfs_unmount;
@ -87,11 +87,10 @@ hpfs_uninit (vfsp)
}
static int
hpfs_mount (
hpfs_omount (
struct mount *mp,
char *path,
caddr_t data,
struct nameidata *ndp,
struct thread *td )
{
size_t size;
@ -99,8 +98,9 @@ hpfs_mount (
struct vnode *devvp;
struct hpfs_args args;
struct hpfsmount *hpmp = 0;
struct nameidata ndp;
dprintf(("hpfs_mount():\n"));
dprintf(("hpfs_omount():\n"));
/*
***
* Mounting non-root filesystem or updating a filesystem
@ -117,7 +117,7 @@ hpfs_mount (
* read/write; if there is no device name, that's all we do.
*/
if (mp->mnt_flag & MNT_UPDATE) {
dprintf(("hpfs_mount: MNT_UPDATE: "));
dprintf(("hpfs_omount: MNT_UPDATE: "));
hpmp = VFSTOHPFS(mp);
@ -125,7 +125,7 @@ hpfs_mount (
dprintf(("export 0x%x\n",args.export.ex_flags));
err = vfs_export(mp, &args.export);
if (err) {
printf("hpfs_mount: vfs_export failed %d\n",
printf("hpfs_omount: vfs_export failed %d\n",
err);
}
goto success;
@ -141,14 +141,14 @@ hpfs_mount (
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible block device.
*/
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
err = namei(ndp);
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
err = namei(&ndp);
if (err) {
/* can't get devvp!*/
goto error_1;
}
devvp = ndp->ni_vp;
devvp = ndp.ni_vp;
if (!vn_isdisk(devvp, &err))
goto error_2;
@ -163,7 +163,7 @@ hpfs_mount (
* Since this is a new mount, we want the names for
* the device and the mount point copied in. If an
* error occurs, the mountpoint is discarded by the
* upper level code. Note that vfs_mount() handles
* upper level code. Note that vfs_omount() handles
* copying the mountpoint f_mntonname for us, so we
* don't have to do it here unless we want to set it
* to something other than "path" for some rason.
@ -196,6 +196,7 @@ hpfs_mount (
vrele(devvp);
error_1: /* no state to back out*/
/* XXX: Missing NDFREE(&ndp, ...) */
success:
return( err);
@ -573,7 +574,7 @@ hpfs_vget(
static struct vfsops hpfs_vfsops = {
.vfs_fhtovp = hpfs_fhtovp,
.vfs_init = hpfs_init,
.vfs_mount = hpfs_mount,
.vfs_omount = hpfs_omount,
.vfs_root = hpfs_root,
.vfs_statfs = hpfs_statfs,
.vfs_uninit = hpfs_uninit,

View File

@ -96,7 +96,7 @@ static int update_mp(struct mount *mp, struct msdosfs_args *argp,
static int mountmsdosfs(struct vnode *devvp, struct mount *mp,
struct thread *td, struct msdosfs_args *argp);
static vfs_fhtovp_t msdosfs_fhtovp;
static vfs_mount_t msdosfs_mount;
static vfs_omount_t msdosfs_omount;
static vfs_root_t msdosfs_root;
static vfs_statfs_t msdosfs_statfs;
static vfs_sync_t msdosfs_sync;
@ -158,17 +158,17 @@ update_mp(mp, argp, td)
* special file to treat as a filesystem.
*/
static int
msdosfs_mount(mp, path, data, ndp, td)
msdosfs_omount(mp, path, data, td)
struct mount *mp;
char *path;
caddr_t data;
struct nameidata *ndp;
struct thread *td;
{
struct vnode *devvp; /* vnode for blk device to mount */
struct msdosfs_args args; /* will hold data from mount request */
/* msdosfs specific mount control block */
struct msdosfsmount *pmp = NULL;
struct nameidata ndp;
size_t size;
int error, flags;
mode_t accessmode;
@ -241,12 +241,12 @@ msdosfs_mount(mp, path, data, ndp, td)
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible disk device.
*/
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
error = namei(ndp);
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
error = namei(&ndp);
if (error)
return (error);
devvp = ndp->ni_vp;
NDFREE(ndp, NDF_ONLY_PNBUF);
devvp = ndp.ni_vp;
NDFREE(&ndp, NDF_ONLY_PNBUF);
if (!vn_isdisk(devvp, &error)) {
vrele(devvp);
@ -294,7 +294,7 @@ msdosfs_mount(mp, path, data, ndp, td)
bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
(void) msdosfs_statfs(mp, &mp->mnt_stat, td);
#ifdef MSDOSFS_DEBUG
printf("msdosfs_mount(): mp %p, pmp %p, inusemap %p\n", mp, pmp, pmp->pm_inusemap);
printf("msdosfs_omount(): mp %p, pmp %p, inusemap %p\n", mp, pmp, pmp->pm_inusemap);
#endif
return (0);
}
@ -900,7 +900,7 @@ msdosfs_vptofh(vp, fhp)
static struct vfsops msdosfs_vfsops = {
.vfs_fhtovp = msdosfs_fhtovp,
.vfs_init = msdosfs_init,
.vfs_mount = msdosfs_mount,
.vfs_omount = msdosfs_omount,
.vfs_root = msdosfs_root,
.vfs_statfs = msdosfs_statfs,
.vfs_sync = msdosfs_sync,

View File

@ -71,7 +71,7 @@ static vfs_init_t ntfs_init;
static vfs_uninit_t ntfs_uninit;
static vfs_vget_t ntfs_vget;
static vfs_fhtovp_t ntfs_fhtovp;
static vfs_mount_t ntfs_mount;
static vfs_omount_t ntfs_omount;
static vfs_root_t ntfs_root;
static vfs_statfs_t ntfs_statfs;
static vfs_unmount_t ntfs_unmount;
@ -96,17 +96,17 @@ ntfs_uninit (
}
static int
ntfs_mount (
ntfs_omount (
struct mount *mp,
char *path,
caddr_t data,
struct nameidata *ndp,
struct thread *td )
{
size_t size;
int err = 0;
struct vnode *devvp, *rootvp;
struct ntfs_args args;
struct nameidata ndp;
/*
* Use NULL path to flag a root mount
@ -174,14 +174,14 @@ ntfs_mount (
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible block device.
*/
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
err = namei(ndp);
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
err = namei(&ndp);
if (err) {
/* can't get devvp!*/
goto error_1;
}
NDFREE(ndp, NDF_ONLY_PNBUF);
devvp = ndp->ni_vp;
NDFREE(&ndp, NDF_ONLY_PNBUF);
devvp = ndp.ni_vp;
if (!vn_isdisk(devvp, &err))
goto error_2;
@ -256,6 +256,7 @@ ntfs_mount (
vrele(devvp);
error_1: /* no state to back out*/
/* XXX: missing NDFREE(&ndp, ...) */
success:
return(err);
@ -786,7 +787,7 @@ ntfs_vget(
static struct vfsops ntfs_vfsops = {
.vfs_fhtovp = ntfs_fhtovp,
.vfs_init = ntfs_init,
.vfs_mount = ntfs_mount,
.vfs_omount = ntfs_omount,
.vfs_root = ntfs_root,
.vfs_statfs = ntfs_statfs,
.vfs_uninit = ntfs_uninit,

View File

@ -57,7 +57,7 @@ static MALLOC_DEFINE(M_NULLFSMNT, "NULLFS mount", "NULLFS mount structure");
static vfs_fhtovp_t nullfs_fhtovp;
static vfs_checkexp_t nullfs_checkexp;
static vfs_nmount_t nullfs_mount;
static vfs_mount_t nullfs_mount;
static vfs_quotactl_t nullfs_quotactl;
static vfs_root_t nullfs_root;
static vfs_start_t nullfs_start;
@ -72,10 +72,7 @@ static vfs_extattrctl_t nullfs_extattrctl;
* Mount null layer
*/
static int
nullfs_mount(mp, ndp, td)
struct mount *mp;
struct nameidata *ndp;
struct thread *td;
nullfs_mount(struct mount *mp, struct thread *td)
{
int error = 0;
struct vnode *lowerrootvp, *vp;
@ -84,6 +81,7 @@ nullfs_mount(mp, ndp, td)
char *target;
size_t size;
int isvnunlocked = 0, len;
struct nameidata nd, *ndp = &nd;
NULLFSDEBUG("nullfs_mount(mp = %p)\n", (void *)mp);
@ -403,7 +401,7 @@ static struct vfsops null_vfsops = {
.vfs_extattrctl = nullfs_extattrctl,
.vfs_fhtovp = nullfs_fhtovp,
.vfs_init = nullfs_init,
.vfs_nmount = nullfs_mount,
.vfs_mount = nullfs_mount,
.vfs_quotactl = nullfs_quotactl,
.vfs_root = nullfs_root,
.vfs_start = nullfs_start,

View File

@ -70,7 +70,7 @@ SYSCTL_INT(_vfs_nwfs, OID_AUTO, debuglevel, CTLFLAG_RW, &nwfs_debuglevel, 0, "")
MODULE_DEPEND(nwfs, ncp, 1, 1, 1);
MODULE_DEPEND(nwfs, libmchain, 1, 1, 1);
static vfs_mount_t nwfs_mount;
static vfs_omount_t nwfs_omount;
static vfs_quotactl_t nwfs_quotactl;
static vfs_root_t nwfs_root;
static vfs_start_t nwfs_start;
@ -81,7 +81,7 @@ static vfs_uninit_t nwfs_uninit;
static struct vfsops nwfs_vfsops = {
.vfs_init = nwfs_init,
.vfs_mount = nwfs_mount,
.vfs_omount = nwfs_omount,
.vfs_quotactl = nwfs_quotactl,
.vfs_root = nwfs_root,
.vfs_start = nwfs_start,
@ -136,8 +136,8 @@ nwfs_initnls(struct nwmount *nmp) {
* mp - path - addr in user space of mount point (ie /usr or whatever)
* data - addr in user space of mount params
*/
static int nwfs_mount(struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct thread *td)
static int nwfs_omount(struct mount *mp, char *path, caddr_t data,
struct thread *td)
{
struct nwfs_args args; /* will hold data from mount request */
int error;

View File

@ -58,7 +58,7 @@
static MALLOC_DEFINE(M_PORTALFSMNT, "PORTAL mount", "PORTAL mount structure");
static vfs_mount_t portal_mount;
static vfs_omount_t portal_omount;
static vfs_unmount_t portal_unmount;
static vfs_root_t portal_root;
static vfs_statfs_t portal_statfs;
@ -67,11 +67,10 @@ static vfs_statfs_t portal_statfs;
* Mount the per-process file descriptors (/dev/fd)
*/
static int
portal_mount(mp, path, data, ndp, td)
portal_omount(mp, path, data, td)
struct mount *mp;
char *path;
caddr_t data;
struct nameidata *ndp;
struct thread *td;
{
struct file *fp;
@ -236,7 +235,7 @@ portal_statfs(mp, sbp, td)
}
static struct vfsops portal_vfsops = {
.vfs_mount = portal_mount,
.vfs_omount = portal_omount,
.vfs_root = portal_root,
.vfs_statfs = portal_statfs,
.vfs_unmount = portal_unmount,

View File

@ -257,8 +257,7 @@ pfs_destroy(struct pfs_node *node)
* Mount a pseudofs instance
*/
int
pfs_mount(struct pfs_info *pi, struct mount *mp, struct nameidata *ndp,
struct thread *td)
pfs_mount(struct pfs_info *pi, struct mount *mp, struct thread *td)
{
struct statfs *sbp;

View File

@ -198,7 +198,7 @@ struct pfs_node {
* VFS interface
*/
int pfs_mount (struct pfs_info *pi, struct mount *mp,
struct nameidata *ndp, struct thread *td);
struct thread *td);
int pfs_unmount (struct mount *mp, int mntflags,
struct thread *td);
int pfs_root (struct mount *mp, struct vnode **vpp,
@ -236,9 +236,8 @@ static struct pfs_info name##_info = { \
}; \
\
static int \
_##name##_mount(struct mount *mp, struct nameidata *ndp, \
struct thread *td) { \
return pfs_mount(&name##_info, mp, ndp, td); \
_##name##_mount(struct mount *mp, struct thread *td) { \
return pfs_mount(&name##_info, mp, td); \
} \
\
static int \
@ -253,7 +252,7 @@ _##name##_uninit(struct vfsconf *vfc) { \
\
static struct vfsops name##_vfsops = { \
.vfs_init = _##name##_init, \
.vfs_nmount = _##name##_mount, \
.vfs_mount = _##name##_mount, \
.vfs_root = pfs_root, \
.vfs_statfs = pfs_statfs, \
.vfs_uninit = _##name##_uninit, \

View File

@ -78,7 +78,7 @@ static MALLOC_DEFINE(M_SMBFSHASH, "SMBFS hash", "SMBFS hash table");
static vfs_init_t smbfs_init;
static vfs_uninit_t smbfs_uninit;
static vfs_mount_t smbfs_mount;
static vfs_omount_t smbfs_omount;
static vfs_start_t smbfs_start;
static vfs_root_t smbfs_root;
static vfs_quotactl_t smbfs_quotactl;
@ -87,7 +87,7 @@ static vfs_unmount_t smbfs_unmount;
static struct vfsops smbfs_vfsops = {
.vfs_init = smbfs_init,
.vfs_mount = smbfs_mount,
.vfs_omount = smbfs_omount,
.vfs_quotactl = smbfs_quotactl,
.vfs_root = smbfs_root,
.vfs_start = smbfs_start,
@ -107,8 +107,7 @@ MODULE_DEPEND(smbfs, libmchain, 1, 1, 1);
int smbfs_pbuf_freecnt = -1; /* start out unlimited */
static int
smbfs_mount(struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct thread *td)
smbfs_omount(struct mount *mp, char *path, caddr_t data, struct thread *td)
{
struct smbfs_args args; /* will hold data from mount request */
struct smbmount *smp = NULL;

View File

@ -108,7 +108,7 @@ uma_zone_t udf_zone_ds = NULL;
static vfs_init_t udf_init;
static vfs_uninit_t udf_uninit;
static vfs_nmount_t udf_mount;
static vfs_mount_t udf_mount;
static vfs_root_t udf_root;
static vfs_statfs_t udf_statfs;
static vfs_unmount_t udf_unmount;
@ -120,7 +120,7 @@ static int udf_find_partmaps(struct udf_mnt *, struct logvol_desc *);
static struct vfsops udf_vfsops = {
.vfs_fhtovp = udf_fhtovp,
.vfs_init = udf_init,
.vfs_nmount = udf_mount,
.vfs_mount = udf_mount,
.vfs_root = udf_root,
.vfs_statfs = udf_statfs,
.vfs_uninit = udf_uninit,
@ -184,7 +184,7 @@ udf_uninit(struct vfsconf *foo)
}
static int
udf_mount(struct mount *mp, struct nameidata *ndp, struct thread *td)
udf_mount(struct mount *mp, struct thread *td)
{
struct vnode *devvp; /* vnode of the mount device */
struct udf_mnt *imp = 0;
@ -193,6 +193,7 @@ udf_mount(struct mount *mp, struct nameidata *ndp, struct thread *td)
char *fspec, *cs_disk, *cs_local;
size_t size;
int error, len, *udf_flags;
struct nameidata nd, *ndp = &nd;
opts = mp->mnt_optnew;

View File

@ -53,7 +53,7 @@
static MALLOC_DEFINE(M_UMAPFSMNT, "UMAP mount", "UMAP mount structure");
static vfs_mount_t umapfs_mount;
static vfs_omount_t umapfs_omount;
static vfs_start_t umapfs_start;
static vfs_root_t umapfs_root;
static vfs_quotactl_t umapfs_quotactl;
@ -69,7 +69,7 @@ static vfs_extattrctl_t umapfs_extattrctl;
* Mount umap layer
*/
static int
umapfs_mount(mp, path, data, ndp, td)
umapfs_omount(mp, path, data, ndp, td)
struct mount *mp;
char *path;
caddr_t data;
@ -430,7 +430,7 @@ static struct vfsops umap_vfsops = {
.vfs_extattrctl = umapfs_extattrctl,
.vfs_fhtovp = umapfs_fhtovp,
.vfs_init = umapfs_init,
.vfs_mount = umapfs_mount,
.vfs_omount = umapfs_omount,
.vfs_quotactl = umapfs_quotactl,
.vfs_root = umapfs_root,
.vfs_start = umapfs_start,

View File

@ -55,7 +55,7 @@ static MALLOC_DEFINE(M_UNIONFSMNT, "UNION mount", "UNION mount structure");
extern vfs_init_t union_init;
static vfs_root_t union_root;
static vfs_nmount_t union_mount;
static vfs_mount_t union_mount;
static vfs_statfs_t union_statfs;
static vfs_unmount_t union_unmount;
@ -63,9 +63,8 @@ static vfs_unmount_t union_unmount;
* Mount union filesystem.
*/
static int
union_mount(mp, ndp, td)
union_mount(mp, td)
struct mount *mp;
struct nameidata *ndp;
struct thread *td;
{
int error = 0;
@ -79,6 +78,7 @@ union_mount(mp, ndp, td)
int len;
size_t size;
struct componentname fakecn;
struct nameidata nd, *ndp = &nd;
UDEBUG(("union_mount(mp = %p)\n", (void *)mp));
@ -486,7 +486,7 @@ union_statfs(mp, sbp, td)
static struct vfsops union_vfsops = {
.vfs_init = union_init,
.vfs_nmount = union_mount,
.vfs_mount = union_mount,
.vfs_root = union_root,
.vfs_statfs = union_statfs,
.vfs_unmount = union_unmount,

View File

@ -73,7 +73,7 @@ static vfs_fhtovp_t ext2_fhtovp;
static vfs_vptofh_t ext2_vptofh;
static vfs_init_t ext2_init;
static vfs_uninit_t ext2_uninit;
static vfs_nmount_t ext2_mount;
static vfs_mount_t ext2_mount;
MALLOC_DEFINE(M_EXT2NODE, "EXT2 node", "EXT2 vnode private part");
static MALLOC_DEFINE(M_EXT2MNT, "EXT2 mount", "EXT2 mount structure");
@ -81,7 +81,7 @@ static MALLOC_DEFINE(M_EXT2MNT, "EXT2 mount", "EXT2 mount structure");
static struct vfsops ext2fs_vfsops = {
.vfs_fhtovp = ext2_fhtovp,
.vfs_init = ext2_init,
.vfs_nmount = ext2_mount,
.vfs_mount = ext2_mount,
.vfs_root = ext2_root, /* root inode via vget */
.vfs_statfs = ext2_statfs,
.vfs_sync = ext2_sync,
@ -166,9 +166,8 @@ ext2_mountroot()
* mount system call
*/
static int
ext2_mount(mp, ndp, td)
ext2_mount(mp, td)
struct mount *mp;
struct nameidata *ndp;
struct thread *td;
{
struct export_args *export;
@ -180,6 +179,7 @@ ext2_mount(mp, ndp, td)
size_t size;
int error, flags, len;
mode_t accessmode;
struct nameidata nd, *ndp = &nd;
opts = mp->mnt_optnew;
@ -216,7 +216,7 @@ ext2_mount(mp, ndp, td)
fs->s_rd_only = 1;
}
if (!error && (mp->mnt_flag & MNT_RELOAD))
error = ext2_reload(mp, ndp->ni_cnd.cn_cred, td);
error = ext2_reload(mp, td->td_ucred, td);
if (error)
return (error);
devvp = ump->um_devvp;

View File

@ -73,7 +73,7 @@ static vfs_fhtovp_t ext2_fhtovp;
static vfs_vptofh_t ext2_vptofh;
static vfs_init_t ext2_init;
static vfs_uninit_t ext2_uninit;
static vfs_nmount_t ext2_mount;
static vfs_mount_t ext2_mount;
MALLOC_DEFINE(M_EXT2NODE, "EXT2 node", "EXT2 vnode private part");
static MALLOC_DEFINE(M_EXT2MNT, "EXT2 mount", "EXT2 mount structure");
@ -81,7 +81,7 @@ static MALLOC_DEFINE(M_EXT2MNT, "EXT2 mount", "EXT2 mount structure");
static struct vfsops ext2fs_vfsops = {
.vfs_fhtovp = ext2_fhtovp,
.vfs_init = ext2_init,
.vfs_nmount = ext2_mount,
.vfs_mount = ext2_mount,
.vfs_root = ext2_root, /* root inode via vget */
.vfs_statfs = ext2_statfs,
.vfs_sync = ext2_sync,
@ -166,9 +166,8 @@ ext2_mountroot()
* mount system call
*/
static int
ext2_mount(mp, ndp, td)
ext2_mount(mp, td)
struct mount *mp;
struct nameidata *ndp;
struct thread *td;
{
struct export_args *export;
@ -180,6 +179,7 @@ ext2_mount(mp, ndp, td)
size_t size;
int error, flags, len;
mode_t accessmode;
struct nameidata nd, *ndp = &nd;
opts = mp->mnt_optnew;
@ -216,7 +216,7 @@ ext2_mount(mp, ndp, td)
fs->s_rd_only = 1;
}
if (!error && (mp->mnt_flag & MNT_RELOAD))
error = ext2_reload(mp, ndp->ni_cnd.cn_cred, td);
error = ext2_reload(mp, td->td_ucred, td);
if (error)
return (error);
devvp = ump->um_devvp;

View File

@ -65,7 +65,7 @@ MALLOC_DEFINE(M_ISOFSNODE, "ISOFS node", "ISOFS vnode private part");
struct iconv_functions *cd9660_iconv = NULL;
static vfs_mount_t cd9660_mount;
static vfs_omount_t cd9660_omount;
static vfs_unmount_t cd9660_unmount;
static vfs_root_t cd9660_root;
static vfs_statfs_t cd9660_statfs;
@ -76,7 +76,7 @@ static vfs_vptofh_t cd9660_vptofh;
static struct vfsops cd9660_vfsops = {
.vfs_fhtovp = cd9660_fhtovp,
.vfs_init = cd9660_init,
.vfs_mount = cd9660_mount,
.vfs_omount = cd9660_omount,
.vfs_root = cd9660_root,
.vfs_statfs = cd9660_statfs,
.vfs_uninit = cd9660_uninit,
@ -179,11 +179,10 @@ iso_mountroot(mp, td)
* mount system call
*/
static int
cd9660_mount(mp, path, data, ndp, td)
cd9660_omount(mp, path, data, td)
struct mount *mp;
char *path;
caddr_t data;
struct nameidata *ndp;
struct thread *td;
{
struct vnode *devvp;
@ -192,6 +191,7 @@ cd9660_mount(mp, path, data, ndp, td)
int error;
mode_t accessmode;
struct iso_mnt *imp = 0;
struct nameidata ndp;
if (path == NULL) /* We are doing the initial root mount */
return (iso_mountroot(mp, td));
@ -214,11 +214,11 @@ cd9660_mount(mp, path, data, ndp, td)
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible block device.
*/
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
if ((error = namei(ndp)))
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
if ((error = namei(&ndp)))
return (error);
NDFREE(ndp, NDF_ONLY_PNBUF);
devvp = ndp->ni_vp;
NDFREE(&ndp, NDF_ONLY_PNBUF);
devvp = ndp.ni_vp;
if (!vn_isdisk(devvp, &error)) {
vrele(devvp);

View File

@ -379,6 +379,11 @@ vfs_register(struct vfsconf *vfc)
struct sysctl_oid *oidp;
struct vfsops *vfsops;
if (vfc->vfc_version != VFS_VERSION) {
printf("ERROR: filesystem %s, unsupported ABI version %x\n",
vfc->vfc_name, vfc->vfc_version);
return (EINVAL);
}
if (vfs_byname(vfc->vfc_name) != NULL)
return EEXIST;
@ -414,8 +419,8 @@ vfs_register(struct vfsconf *vfc)
* Check the mount and unmount operations.
*/
vfsops = vfc->vfc_vfsops;
KASSERT(vfsops->vfs_mount != NULL || vfsops->vfs_nmount != NULL,
("Filesystem %s has no (n)mount op", vfc->vfc_name));
KASSERT(vfsops->vfs_mount != NULL || vfsops->vfs_omount != NULL,
("Filesystem %s has no (o)mount op", vfc->vfc_name));
KASSERT(vfsops->vfs_unmount != NULL,
("Filesystem %s has no unmount op", vfc->vfc_name));

View File

@ -104,7 +104,7 @@ static int vfs_domount(struct thread *td, const char *fstype,
static int vfs_mount_alloc(struct vnode *dvp, struct vfsconf *vfsp,
const char *fspath, struct thread *td, struct mount **mpp);
static int vfs_mountroot_ask(void);
static int vfs_mountroot_try(char *mountfrom);
static int vfs_mountroot_try(const char *mountfrom);
static int vfs_donmount(struct thread *td, int fsflags,
struct uio *fsoptions);
@ -148,8 +148,12 @@ static char *cdrom_rootdevnames[] = {
/* legacy find-root code */
char *rootdevnames[2] = {NULL, NULL};
static int setrootbyname(char *name);
struct cdev *rootdev = NULL;
#ifdef ROOTDEVNAME
const char *ctrootdevname = ROOTDEVNAME;
#else
const char *ctrootdevname = NULL;
#endif
/*
* Has to be dynamic as the value of rootdev can change; however, it can't
@ -823,10 +827,10 @@ vfs_domount(
mp->mnt_optnew = fsdata;
}
/*
* Check if the fs implements the type VFS_[N]MOUNT()
* Check if the fs implements the type VFS_[O]MOUNT()
* function we are looking for.
*/
if ((compat == 0) == (mp->mnt_op->vfs_mount != NULL)) {
if ((compat == 0) == (mp->mnt_op->vfs_omount != NULL)) {
printf("%s doesn't support the %s mount syscall\n",
mp->mnt_vfc->vfc_name, compat ? "old" : "new");
VI_LOCK(vp);
@ -854,8 +858,10 @@ vfs_domount(
* XXX The final recipients of VFS_MOUNT just overwrite the ndp they
* get. No freeing of cn_pnbuf.
*/
error = compat ? VFS_MOUNT(mp, fspath, fsdata, &nd, td) :
VFS_NMOUNT(mp, &nd, td);
if (compat)
error = VFS_OMOUNT(mp, fspath, fsdata, td);
else
error = VFS_MOUNT(mp, td);
if (!error) {
if (mp->mnt_opt != NULL)
vfs_freeopts(mp->mnt_opt);
@ -1195,25 +1201,31 @@ void
vfs_mountroot(void)
{
char *cp;
int error, i;
int error, i, asked = 0;
/*
* Wait for GEOM to settle down
*/
g_waitidle();
/*
* We are booted with instructions to prompt for the root filesystem.
*/
if (boothowto & RB_ASKNAME) {
if (!vfs_mountroot_ask())
return;
asked = 1;
}
/*
* The root filesystem information is compiled in, and we are
* booted with instructions to use it.
*/
#ifdef ROOTDEVNAME
if ((boothowto & RB_DFLTROOT) && !vfs_mountroot_try(ROOTDEVNAME))
return;
#endif
/*
* We are booted with instructions to prompt for the root filesystem,
* or to use the compiled-in default when it doesn't exist.
*/
if (boothowto & (RB_DFLTROOT | RB_ASKNAME)) {
if (!vfs_mountroot_ask())
if (ctrootdevname != NULL && (boothowto & RB_DFLTROOT)) {
if (!vfs_mountroot_try(ctrootdevname))
return;
ctrootdevname = NULL;
}
/*
@ -1233,7 +1245,8 @@ vfs_mountroot(void)
* supplied via some other means. This is the preferred
* mechanism.
*/
if ((cp = getenv("vfs.root.mountfrom")) != NULL) {
cp = getenv("vfs.root.mountfrom");
if (cp != NULL) {
error = vfs_mountroot_try(cp);
freeenv(cp);
if (!error)
@ -1241,8 +1254,7 @@ vfs_mountroot(void)
}
/*
* Try values that may have been computed by the machine-dependant
* legacy code.
* Try values that may have been computed by code during boot
*/
if (!vfs_mountroot_try(rootdevnames[0]))
return;
@ -1250,21 +1262,19 @@ vfs_mountroot(void)
return;
/*
* If we have a compiled-in default, and haven't already tried it, try
* it now.
* If we (still) have a compiled-in default, try it.
*/
#ifdef ROOTDEVNAME
if (!(boothowto & RB_DFLTROOT))
if (!vfs_mountroot_try(ROOTDEVNAME))
if (ctrootdevname != NULL)
if (!vfs_mountroot_try(ctrootdevname))
return;
#endif
/*
* Everything so far has failed, prompt on the console if we haven't
* already tried that.
*/
if (!(boothowto & (RB_DFLTROOT | RB_ASKNAME)) && !vfs_mountroot_ask())
return;
if (!asked)
if (!vfs_mountroot_ask())
return;
panic("Root mount failed, startup aborted.");
}
@ -1272,7 +1282,7 @@ vfs_mountroot(void)
* Mount (mountfrom) as the root filesystem.
*/
static int
vfs_mountroot_try(char *mountfrom)
vfs_mountroot_try(const char *mountfrom)
{
struct mount *mp;
char *vfsname, *path;
@ -1310,9 +1320,18 @@ vfs_mountroot_try(char *mountfrom)
goto done;
}
/* do our best to set rootdev */
if (path[0] != '\0' && setrootbyname(path))
printf("setrootbyname failed\n");
/*
* do our best to set rootdev
* XXX: This does not belong here!
*/
if (path[0] != '\0') {
struct cdev *diskdev;
diskdev = getdiskbyname(path);
if (diskdev != NULL)
rootdev = diskdev;
else
printf("setrootbyname failed\n");
}
/* If the root device is a type "memory disk", mount RW */
if (rootdev != NULL && devsw(rootdev) != NULL) {
@ -1321,7 +1340,7 @@ vfs_mountroot_try(char *mountfrom)
mp->mnt_flag &= ~MNT_RDONLY;
}
error = VFS_MOUNT(mp, NULL, NULL, NULL, curthread);
error = VFS_OMOUNT(mp, NULL, NULL, curthread);
done:
if (vfsname != NULL)
@ -1451,7 +1470,7 @@ getdiskbyname(char *name)
break;
mp->mnt_flag |= MNT_RDONLY;
error = VFS_NMOUNT(mp, NULL, curthread);
error = VFS_MOUNT(mp, curthread);
if (error)
break;
VFS_START(mp, 0, td);
@ -1479,24 +1498,6 @@ getdiskbyname(char *name)
return (dev);
}
/*
* Set rootdev to match (name), given that we expect it to
* refer to a disk-like device.
*/
static int
setrootbyname(char *name)
{
struct cdev *diskdev;
diskdev = getdiskbyname(name);
if (diskdev != NULL) {
rootdev = diskdev;
return (0);
}
return (1);
}
/* Show the struct cdev *for a disk specified by name */
#ifdef DDB
DB_SHOW_COMMAND(disk, db_getdiskbyname)

View File

@ -120,7 +120,7 @@ static int mountnfs(struct nfs_args *, struct mount *,
struct sockaddr *, char *, char *, struct vnode **,
struct ucred *cred);
static int nfs4_do_setclientid(struct nfsmount *nmp, struct ucred *cred);
static vfs_mount_t nfs_mount;
static vfs_omount_t nfs_omount;
static vfs_unmount_t nfs_unmount;
static vfs_root_t nfs_root;
static vfs_statfs_t nfs_statfs;
@ -131,7 +131,7 @@ static vfs_sync_t nfs_sync;
*/
static struct vfsops nfs_vfsops = {
.vfs_init = nfs4_init,
.vfs_mount = nfs_mount,
.vfs_omount = nfs_omount,
.vfs_root = nfs_root,
.vfs_statfs = nfs_statfs,
.vfs_sync = nfs_sync,
@ -384,8 +384,7 @@ nfs_decode_args(struct nfsmount *nmp, struct nfs_args *argp)
*/
/* ARGSUSED */
static int
nfs_mount(struct mount *mp, char *path, caddr_t data, struct nameidata *ndp,
struct thread *td)
nfs_omount(struct mount *mp, char *path, caddr_t data, struct thread *td)
{
int error;
struct nfs_args args;

View File

@ -104,7 +104,7 @@ static void nfs_decode_args(struct nfsmount *nmp, struct nfs_args *argp);
static int mountnfs(struct nfs_args *, struct mount *,
struct sockaddr *, char *, char *, struct vnode **,
struct ucred *cred);
static vfs_mount_t nfs_mount;
static vfs_omount_t nfs_omount;
static vfs_unmount_t nfs_unmount;
static vfs_root_t nfs_root;
static vfs_statfs_t nfs_statfs;
@ -116,7 +116,7 @@ static vfs_sysctl_t nfs_sysctl;
*/
static struct vfsops nfs_vfsops = {
.vfs_init = nfs_init,
.vfs_mount = nfs_mount,
.vfs_omount = nfs_omount,
.vfs_root = nfs_root,
.vfs_statfs = nfs_statfs,
.vfs_sync = nfs_sync,
@ -667,8 +667,7 @@ nfs_decode_args(struct nfsmount *nmp, struct nfs_args *argp)
*/
/* ARGSUSED */
static int
nfs_mount(struct mount *mp, char *path, caddr_t data, struct nameidata *ndp,
struct thread *td)
nfs_omount(struct mount *mp, char *path, caddr_t data, struct thread *td)
{
int error;
struct nfs_args args;

View File

@ -338,10 +338,13 @@ struct nfs_public {
* Filesystem configuration information. One of these exists for each
* type of filesystem supported by the kernel. These are searched at
* mount time to identify the requested filesystem.
*
* XXX: Never change the first two arguments!
*/
struct vfsconf {
struct vfsops *vfc_vfsops; /* filesystem operations vector */
u_int vfc_version; /* ABI version number */
char vfc_name[MFSNAMELEN]; /* filesystem type name */
struct vfsops *vfc_vfsops; /* filesystem operations vector */
int vfc_typenum; /* historic filesystem type number */
int vfc_refcount; /* number mounted of this type */
int vfc_flags; /* permanent flags */
@ -462,8 +465,8 @@ struct mount_args;
struct nameidata;
struct sysctl_req;
typedef int vfs_mount_t(struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct thread *td);
typedef int vfs_omount_t(struct mount *mp, char *path, caddr_t data,
struct thread *td);
typedef int vfs_start_t(struct mount *mp, int flags, struct thread *td);
typedef int vfs_unmount_t(struct mount *mp, int mntflags, struct thread *td);
typedef int vfs_root_t(struct mount *mp, struct vnode **vpp, struct thread *td);
@ -484,13 +487,13 @@ typedef int vfs_uninit_t(struct vfsconf *);
typedef int vfs_extattrctl_t(struct mount *mp, int cmd,
struct vnode *filename_vp, int attrnamespace,
const char *attrname, struct thread *td);
typedef int vfs_nmount_t(struct mount *mp, struct nameidata *ndp,
struct thread *td);
typedef int vfs_mount_t(struct mount *mp, struct thread *td);
typedef int vfs_sysctl_t(struct mount *mp, fsctlop_t op,
struct sysctl_req *req);
struct vfsops {
vfs_mount_t *vfs_mount;
vfs_omount_t *vfs_omount;
vfs_start_t *vfs_start;
vfs_unmount_t *vfs_unmount;
vfs_root_t *vfs_root;
@ -505,13 +508,12 @@ struct vfsops {
vfs_uninit_t *vfs_uninit;
vfs_extattrctl_t *vfs_extattrctl;
/* Additions below are not binary compatible with 5.0 and below. */
vfs_nmount_t *vfs_nmount;
vfs_sysctl_t *vfs_sysctl;
};
#define VFS_NMOUNT(MP, NDP, P) (*(MP)->mnt_op->vfs_nmount)(MP, NDP, P)
#define VFS_MOUNT(MP, PATH, DATA, NDP, P) \
(*(MP)->mnt_op->vfs_mount)(MP, PATH, DATA, NDP, P)
#define VFS_MOUNT(MP, P) (*(MP)->mnt_op->vfs_mount)(MP, P)
#define VFS_OMOUNT(MP, PATH, DATA, P) \
(*(MP)->mnt_op->vfs_omount)(MP, PATH, DATA, P)
#define VFS_START(MP, FLAGS, P) (*(MP)->mnt_op->vfs_start)(MP, FLAGS, P)
#define VFS_UNMOUNT(MP, FORCE, P) (*(MP)->mnt_op->vfs_unmount)(MP, FORCE, P)
#define VFS_ROOT(MP, VPP, P) (*(MP)->mnt_op->vfs_root)(MP, VPP, P)
@ -532,10 +534,17 @@ struct vfsops {
#include <sys/module.h>
/*
* Version numbers.
*/
#define VFS_VERSION_00 0x19660120
#define VFS_VERSION VFS_VERSION_00
#define VFS_SET(vfsops, fsname, flags) \
static struct vfsconf fsname ## _vfsconf = { \
.vfc_vfsops = &vfsops, \
.vfc_version = VFS_VERSION, \
.vfc_name = #fsname, \
.vfc_vfsops = &vfsops, \
.vfc_typenum = -1, \
.vfc_flags = flags, \
}; \

View File

@ -69,7 +69,6 @@ int ffs_freefile(struct fs *, struct vnode *, ino_t, int);
int ffs_isblock(struct fs *, u_char *, ufs1_daddr_t);
void ffs_load_inode(struct buf *, struct inode *, struct fs *, ino_t);
int ffs_mountroot(void);
vfs_mount_t ffs_mount;
int ffs_reallocblks(struct vop_reallocblks_args *);
int ffs_realloccg(struct inode *, ufs2_daddr_t, ufs2_daddr_t,
ufs2_daddr_t, int, int, struct ucred *, struct buf **);

View File

@ -68,7 +68,7 @@ __FBSDID("$FreeBSD$");
uma_zone_t uma_inode, uma_ufs1, uma_ufs2;
static int ffs_sbupdate(struct ufsmount *, int);
int ffs_reload(struct mount *,struct ucred *,struct thread *);
static int ffs_reload(struct mount *, struct thread *);
static int ffs_mountfs(struct vnode *, struct mount *, struct thread *);
static void ffs_oldfscompat_read(struct fs *, struct ufsmount *,
ufs2_daddr_t);
@ -77,12 +77,13 @@ static void ffs_ifree(struct ufsmount *ump, struct inode *ip);
static vfs_init_t ffs_init;
static vfs_uninit_t ffs_uninit;
static vfs_extattrctl_t ffs_extattrctl;
static vfs_omount_t ffs_omount;
static struct vfsops ufs_vfsops = {
.vfs_extattrctl = ffs_extattrctl,
.vfs_fhtovp = ffs_fhtovp,
.vfs_init = ffs_init,
.vfs_mount = ffs_mount,
.vfs_omount = ffs_omount,
.vfs_quotactl = ufs_quotactl,
.vfs_root = ufs_root,
.vfs_start = ufs_start,
@ -97,7 +98,7 @@ static struct vfsops ufs_vfsops = {
VFS_SET(ufs_vfsops, ufs, 0);
/*
* ffs_mount
* ffs_omount
*
* Called when mounting local physical media
*
@ -133,13 +134,8 @@ VFS_SET(ufs_vfsops, ufs, 0);
* system call will fail with EFAULT in copyinstr in
* namei() if it is a genuine NULL from the user.
*/
int
ffs_mount(mp, path, data, ndp, td)
struct mount *mp; /* mount struct pointer*/
char *path; /* path to mount point*/
caddr_t data; /* arguments to FS specific mount*/
struct nameidata *ndp; /* mount point credentials*/
struct thread *td; /* process requesting mount*/
static int
ffs_omount(struct mount *mp, char *path, caddr_t data, struct thread *td)
{
size_t size;
struct vnode *devvp, *rootvp;
@ -148,6 +144,7 @@ ffs_mount(mp, path, data, ndp, td)
struct fs *fs;
int error, flags;
mode_t accessmode;
struct nameidata ndp;
if (uma_inode == NULL) {
uma_inode = uma_zcreate("FFS inode",
@ -236,7 +233,7 @@ ffs_mount(mp, path, data, ndp, td)
vn_finished_write(mp);
}
if ((mp->mnt_flag & MNT_RELOAD) &&
(error = ffs_reload(mp, ndp->ni_cnd.cn_cred, td)) != 0)
(error = ffs_reload(mp, td)) != 0)
return (error);
if (fs->fs_ronly && (mp->mnt_kern_flag & MNTK_WANTRDWR)) {
/*
@ -310,11 +307,11 @@ ffs_mount(mp, path, data, ndp, td)
* Not an update, or updating the name: look up the name
* and verify that it refers to a sensible disk device.
*/
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
if ((error = namei(ndp)) != 0)
NDINIT(&ndp, LOOKUP, FOLLOW, UIO_USERSPACE, args.fspec, td);
if ((error = namei(&ndp)) != 0)
return (error);
NDFREE(ndp, NDF_ONLY_PNBUF);
devvp = ndp->ni_vp;
NDFREE(&ndp, NDF_ONLY_PNBUF);
devvp = ndp.ni_vp;
if (!vn_isdisk(devvp, &error)) {
vrele(devvp);
return (error);
@ -385,11 +382,8 @@ ffs_mount(mp, path, data, ndp, td)
* 5) invalidate all cached file data.
* 6) re-read inode data for all active vnodes.
*/
int
ffs_reload(mp, cred, td)
struct mount *mp;
struct ucred *cred;
struct thread *td;
static int
ffs_reload(struct mount *mp, struct thread *td)
{
struct vnode *vp, *nvp, *devvp;
struct inode *ip;
@ -407,7 +401,7 @@ ffs_reload(mp, cred, td)
*/
devvp = VFSTOUFS(mp)->um_devvp;
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
if (vinvalbuf(devvp, 0, cred, td, 0, 0) != 0)
if (vinvalbuf(devvp, 0, td->td_ucred, td, 0, 0) != 0)
panic("ffs_reload: dirty1");
/*
* Only VMIO the backing device if the backing device is a real
@ -504,7 +498,7 @@ ffs_reload(mp, cred, td)
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
goto loop;
}
if (vinvalbuf(vp, 0, cred, td, 0, 0))
if (vinvalbuf(vp, 0, td->td_ucred, td, 0, 0))
panic("ffs_reload: dirty2");
/*
* Step 6: re-read inode data for all active vnodes.