From 2d868d02cfcc9af8da398c52add2f28fe1c493bc Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 30 Jul 2004 22:08:52 +0000 Subject: 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. --- sys/coda/coda_vfsops.c | 27 +++++----- sys/fs/cd9660/cd9660_vfsops.c | 16 +++--- sys/fs/coda/coda_vfsops.c | 27 +++++----- sys/fs/devfs/devfs_vfsops.c | 9 ++-- sys/fs/fdescfs/fdesc_vfsops.c | 9 ++-- sys/fs/hpfs/hpfs_vfsops.c | 23 +++++---- sys/fs/msdosfs/msdosfs_vfsops.c | 18 +++---- sys/fs/ntfs/ntfs_vfsops.c | 17 ++++--- sys/fs/nullfs/null_vfsops.c | 10 ++-- sys/fs/nwfs/nwfs_vfsops.c | 8 +-- sys/fs/portalfs/portal_vfsops.c | 7 ++- sys/fs/pseudofs/pseudofs.c | 3 +- sys/fs/pseudofs/pseudofs.h | 9 ++-- sys/fs/smbfs/smbfs_vfsops.c | 7 ++- sys/fs/udf/udf_vfsops.c | 7 +-- sys/fs/umapfs/umap_vfsops.c | 6 +-- sys/fs/unionfs/union_vfsops.c | 8 +-- sys/gnu/ext2fs/ext2_vfsops.c | 10 ++-- sys/gnu/fs/ext2fs/ext2_vfsops.c | 10 ++-- sys/isofs/cd9660/cd9660_vfsops.c | 16 +++--- sys/kern/vfs_init.c | 9 +++- sys/kern/vfs_mount.c | 105 ++++++++++++++++++++------------------- sys/nfs4client/nfs4_vfsops.c | 7 ++- sys/nfsclient/nfs_vfsops.c | 7 ++- sys/sys/mount.h | 29 +++++++---- sys/ufs/ffs/ffs_extern.h | 1 - sys/ufs/ffs/ffs_vfsops.c | 38 ++++++-------- 27 files changed, 221 insertions(+), 222 deletions(-) (limited to 'sys') diff --git a/sys/coda/coda_vfsops.c b/sys/coda/coda_vfsops.c index de84eb0..189ee92 100644 --- a/sys/coda/coda_vfsops.c +++ b/sys/coda/coda_vfsops.c @@ -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, diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c index 7c83449..639dc75 100644 --- a/sys/fs/cd9660/cd9660_vfsops.c +++ b/sys/fs/cd9660/cd9660_vfsops.c @@ -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); diff --git a/sys/fs/coda/coda_vfsops.c b/sys/fs/coda/coda_vfsops.c index de84eb0..189ee92 100644 --- a/sys/fs/coda/coda_vfsops.c +++ b/sys/fs/coda/coda_vfsops.c @@ -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, diff --git a/sys/fs/devfs/devfs_vfsops.c b/sys/fs/devfs/devfs_vfsops.c index f23d660..27a759f 100644 --- a/sys/fs/devfs/devfs_vfsops.c +++ b/sys/fs/devfs/devfs_vfsops.c @@ -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, diff --git a/sys/fs/fdescfs/fdesc_vfsops.c b/sys/fs/fdescfs/fdesc_vfsops.c index 2cd56f5..01e8956 100644 --- a/sys/fs/fdescfs/fdesc_vfsops.c +++ b/sys/fs/fdescfs/fdesc_vfsops.c @@ -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, diff --git a/sys/fs/hpfs/hpfs_vfsops.c b/sys/fs/hpfs/hpfs_vfsops.c index 9ea6cfb..e002feb 100644 --- a/sys/fs/hpfs/hpfs_vfsops.c +++ b/sys/fs/hpfs/hpfs_vfsops.c @@ -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 @@ error_2: /* error with devvp held*/ 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, diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index b54f6ec..ccf4b7b 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -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, diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c index a9a9c7a..3bd803c 100644 --- a/sys/fs/ntfs/ntfs_vfsops.c +++ b/sys/fs/ntfs/ntfs_vfsops.c @@ -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 @@ error_2: /* error with devvp held*/ 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, diff --git a/sys/fs/nullfs/null_vfsops.c b/sys/fs/nullfs/null_vfsops.c index 25c1651..ea49163 100644 --- a/sys/fs/nullfs/null_vfsops.c +++ b/sys/fs/nullfs/null_vfsops.c @@ -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, diff --git a/sys/fs/nwfs/nwfs_vfsops.c b/sys/fs/nwfs/nwfs_vfsops.c index 824ef4e..2900048 100644 --- a/sys/fs/nwfs/nwfs_vfsops.c +++ b/sys/fs/nwfs/nwfs_vfsops.c @@ -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; diff --git a/sys/fs/portalfs/portal_vfsops.c b/sys/fs/portalfs/portal_vfsops.c index 3b2d8be..dea2d39 100644 --- a/sys/fs/portalfs/portal_vfsops.c +++ b/sys/fs/portalfs/portal_vfsops.c @@ -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, diff --git a/sys/fs/pseudofs/pseudofs.c b/sys/fs/pseudofs/pseudofs.c index 22d6286..140a993 100644 --- a/sys/fs/pseudofs/pseudofs.c +++ b/sys/fs/pseudofs/pseudofs.c @@ -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; diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h index 1bac49c..c2bb9b3 100644 --- a/sys/fs/pseudofs/pseudofs.h +++ b/sys/fs/pseudofs/pseudofs.h @@ -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, \ diff --git a/sys/fs/smbfs/smbfs_vfsops.c b/sys/fs/smbfs/smbfs_vfsops.c index ec67445..d8d90e4 100644 --- a/sys/fs/smbfs/smbfs_vfsops.c +++ b/sys/fs/smbfs/smbfs_vfsops.c @@ -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; diff --git a/sys/fs/udf/udf_vfsops.c b/sys/fs/udf/udf_vfsops.c index 2b2501a..89f38ba 100644 --- a/sys/fs/udf/udf_vfsops.c +++ b/sys/fs/udf/udf_vfsops.c @@ -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; diff --git a/sys/fs/umapfs/umap_vfsops.c b/sys/fs/umapfs/umap_vfsops.c index c6f0e57..c9da7f7 100644 --- a/sys/fs/umapfs/umap_vfsops.c +++ b/sys/fs/umapfs/umap_vfsops.c @@ -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, diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c index e756e18..1b5293e 100644 --- a/sys/fs/unionfs/union_vfsops.c +++ b/sys/fs/unionfs/union_vfsops.c @@ -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, diff --git a/sys/gnu/ext2fs/ext2_vfsops.c b/sys/gnu/ext2fs/ext2_vfsops.c index 73207d5..a1e5365 100644 --- a/sys/gnu/ext2fs/ext2_vfsops.c +++ b/sys/gnu/ext2fs/ext2_vfsops.c @@ -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; diff --git a/sys/gnu/fs/ext2fs/ext2_vfsops.c b/sys/gnu/fs/ext2fs/ext2_vfsops.c index 73207d5..a1e5365 100644 --- a/sys/gnu/fs/ext2fs/ext2_vfsops.c +++ b/sys/gnu/fs/ext2fs/ext2_vfsops.c @@ -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; diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index 7c83449..639dc75 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -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); diff --git a/sys/kern/vfs_init.c b/sys/kern/vfs_init.c index 999764a..be8f2af 100644 --- a/sys/kern/vfs_init.c +++ b/sys/kern/vfs_init.c @@ -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)); diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 5694fa5..9f995f4 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -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; - g_waitidle(); /* - * The root filesystem information is compiled in, and we are - * booted with instructions to use it. + * Wait for GEOM to settle down */ -#ifdef ROOTDEVNAME - if ((boothowto & RB_DFLTROOT) && !vfs_mountroot_try(ROOTDEVNAME)) - return; -#endif + g_waitidle(); + /* - * We are booted with instructions to prompt for the root filesystem, - * or to use the compiled-in default when it doesn't exist. + * We are booted with instructions to prompt for the root filesystem. */ - if (boothowto & (RB_DFLTROOT | RB_ASKNAME)) { + 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. + */ + 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) diff --git a/sys/nfs4client/nfs4_vfsops.c b/sys/nfs4client/nfs4_vfsops.c index cf730ad..b8e8a32 100644 --- a/sys/nfs4client/nfs4_vfsops.c +++ b/sys/nfs4client/nfs4_vfsops.c @@ -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; diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index f6281ac..25b5248 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -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; diff --git a/sys/sys/mount.h b/sys/sys/mount.h index fc66ae3..c0298f5 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -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 +/* + * 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, \ }; \ diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h index 23d76f3..556ad5d 100644 --- a/sys/ufs/ffs/ffs_extern.h +++ b/sys/ufs/ffs/ffs_extern.h @@ -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 **); diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 7cdf9f5..8fc3741 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -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 @@ loop: 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. -- cgit v1.1