static int devfs_statfs( struct mount *mp, struct vfsstatfs *sbp, __unused vfs_context_t ctx) { struct devfsmount *devfs_mp_p = (struct devfsmount *)mp->mnt_data; /*- * Fill in the stat block. */ //sbp->f_type = mp->mnt_vfsstat.f_type; sbp->f_flags = 0; /* XXX */ sbp->f_bsize = 512; sbp->f_iosize = 512; sbp->f_blocks = (devfs_stats.mounts * sizeof(struct devfsmount) + devfs_stats.nodes * sizeof(devnode_t) + devfs_stats.entries * sizeof(devdirent_t) + devfs_stats.stringspace ) / sbp->f_bsize; sbp->f_bfree = 0; sbp->f_bavail = 0; sbp->f_files = devfs_stats.nodes; sbp->f_ffree = 0; sbp->f_fsid.val[0] = (int32_t)(uintptr_t)devfs_mp_p; sbp->f_fsid.val[1] = vfs_typenum(mp); return 0; }
/*proto*/ int devfs_mount(struct mount *mp, __unused vnode_t devvp, __unused user_addr_t data, vfs_context_t ctx) { struct devfsmount *devfs_mp_p; /* devfs specific mount info */ int error; /*- * If they just want to update, we don't need to do anything. */ if (mp->mnt_flag & MNT_UPDATE) { return 0; } /* Advisory locking should be handled at the VFS layer */ vfs_setlocklocal(mp); /*- * Well, it's not an update, it's a real mount request. * Time to get dirty. * HERE we should check to see if we are already mounted here. */ MALLOC(devfs_mp_p, struct devfsmount *, sizeof(struct devfsmount), M_DEVFSMNT, M_WAITOK); if (devfs_mp_p == NULL) return (ENOMEM); bzero(devfs_mp_p,sizeof(*devfs_mp_p)); devfs_mp_p->mount = mp; /*- * Fill out some fields */ mp->mnt_data = (qaddr_t)devfs_mp_p; mp->mnt_vfsstat.f_fsid.val[0] = (int32_t)(uintptr_t)devfs_mp_p; mp->mnt_vfsstat.f_fsid.val[1] = vfs_typenum(mp); mp->mnt_flag |= MNT_LOCAL; DEVFS_LOCK(); error = dev_dup_plane(devfs_mp_p); DEVFS_UNLOCK(); if (error) { mp->mnt_data = (qaddr_t)0; FREE((caddr_t)devfs_mp_p, M_DEVFSMNT); return (error); } else DEVFS_INCR_MOUNTS(); /*- * Copy in the name of the directory the filesystem * is to be mounted on. * And we clear the remainder of the character strings * to be tidy. */ bzero(mp->mnt_vfsstat.f_mntfromname, MAXPATHLEN); bcopy("devfs",mp->mnt_vfsstat.f_mntfromname, 5); (void)devfs_statfs(mp, &mp->mnt_vfsstat, ctx); return 0; }
MALLOC(rootFid, struct VenusFid *, sizeof(*rootFid), M_UFSMNT, M_WAITOK); rootFid->Cell = localcell->cellNum; rootFid->Fid.Volume = volid; rootFid->Fid.Vnode = 1; rootFid->Fid.Unique = 1; } else { AFS_GUNLOCK(); return ENODEV; } vfs_setfsprivate(mp, &rootFid); } } #ifdef AFS_DARWIN80_ENV afs_vfs_typenum=vfs_typenum(mp); vfs_setauthopaque(mp); vfs_setauthopaqueaccess(mp); #else strcpy(mp->mnt_stat.f_fstypename, "afs"); #endif AFS_GUNLOCK(); (void)afs_statfs(mp, mnt_stat, ctx); return 0; } int afs_unmount(struct mount *mp, int flags, CTX_TYPE ctx) { void *mdata = vfs_fsprivate(mp); AFS_GLOCK();