/* ARGSUSED */ int procfs_mount( struct mount *mp, const char *path, void *data, size_t *data_len) { struct lwp *l = curlwp; struct procfsmount *pmnt; struct procfs_args *args = data; int error; if (args == NULL) return EINVAL; if (UIO_MX & (UIO_MX-1)) { log(LOG_ERR, "procfs: invalid directory entry size"); return (EINVAL); } if (mp->mnt_flag & MNT_GETARGS) { if (*data_len < sizeof *args) return EINVAL; pmnt = VFSTOPROC(mp); if (pmnt == NULL) return EIO; args->version = PROCFS_ARGSVERSION; args->flags = pmnt->pmnt_flags; *data_len = sizeof *args; return 0; } if (mp->mnt_flag & MNT_UPDATE) return (EOPNOTSUPP); if (*data_len >= sizeof *args && args->version != PROCFS_ARGSVERSION) return EINVAL; pmnt = kmem_zalloc(sizeof(struct procfsmount), KM_SLEEP); mp->mnt_stat.f_namemax = PROCFS_MAXNAMLEN; mp->mnt_flag |= MNT_LOCAL; mp->mnt_data = pmnt; vfs_getnewfsid(mp); error = set_statvfs_info(path, UIO_USERSPACE, "procfs", UIO_SYSSPACE, mp->mnt_op->vfs_name, mp, l); pmnt->pmnt_exechook = exechook_establish(procfs_revoke_vnodes, mp); if (*data_len >= sizeof *args) pmnt->pmnt_flags = args->flags; else pmnt->pmnt_flags = 0; mp->mnt_iflag |= IMNT_MPSAFE; return error; }
/* ARGSUSED */ int procfs_mount(struct mount *mp, const char *path, void *data, struct nameidata *ndp, struct proc *p) { struct procfsmount *pmnt; struct procfs_args args; int error; if (UIO_MX & (UIO_MX-1)) { log(LOG_ERR, "procfs: invalid directory entry size"); return (EINVAL); } if (mp->mnt_flag & MNT_UPDATE) return (EOPNOTSUPP); if (data != NULL) { error = copyin(data, &args, sizeof(args)); if (error != 0) return (error); if (args.version != PROCFS_ARGSVERSION) return (EINVAL); } else args.flags = 0; mp->mnt_flag |= MNT_LOCAL; pmnt = (struct procfsmount *) malloc(sizeof(struct procfsmount), M_MISCFSMNT, M_WAITOK); mp->mnt_data = pmnt; vfs_getnewfsid(mp); bzero(mp->mnt_stat.f_mntonname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); bcopy("procfs", mp->mnt_stat.f_mntfromname, sizeof("procfs")); bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); bcopy("procfs", mp->mnt_stat.f_mntfromspec, sizeof("procfs")); bcopy(&args, &mp->mnt_stat.mount_info.procfs_args, sizeof(args)); #ifdef notyet pmnt->pmnt_exechook = exechook_establish(procfs_revoke_vnodes, mp); #endif pmnt->pmnt_flags = args.flags; return (0); }