Home | History | Annotate | Line # | Download | only in procfs
procfs_vfsops.c revision 1.18.2.1
      1  1.18.2.1      cgd /*	$NetBSD: procfs_vfsops.c,v 1.18.2.1 1994/09/16 18:00:30 cgd Exp $	*/
      2      1.18      cgd 
      3       1.1       pk /*
      4       1.9      cgd  * Copyright (c) 1993 Jan-Simon Pendry
      5      1.16  mycroft  * Copyright (c) 1993
      6      1.16  mycroft  *	The Regents of the University of California.  All rights reserved.
      7       1.2       pk  *
      8       1.9      cgd  * This code is derived from software contributed to Berkeley by
      9       1.9      cgd  * Jan-Simon Pendry.
     10       1.9      cgd  *
     11       1.2       pk  * Redistribution and use in source and binary forms, with or without
     12       1.2       pk  * modification, are permitted provided that the following conditions
     13       1.2       pk  * are met:
     14       1.2       pk  * 1. Redistributions of source code must retain the above copyright
     15       1.2       pk  *    notice, this list of conditions and the following disclaimer.
     16       1.2       pk  * 2. Redistributions in binary form must reproduce the above copyright
     17       1.2       pk  *    notice, this list of conditions and the following disclaimer in the
     18       1.2       pk  *    documentation and/or other materials provided with the distribution.
     19       1.2       pk  * 3. All advertising materials mentioning features or use of this software
     20       1.2       pk  *    must display the following acknowledgement:
     21       1.9      cgd  *	This product includes software developed by the University of
     22       1.9      cgd  *	California, Berkeley and its contributors.
     23       1.9      cgd  * 4. Neither the name of the University nor the names of its contributors
     24       1.9      cgd  *    may be used to endorse or promote products derived from this software
     25       1.9      cgd  *    without specific prior written permission.
     26       1.9      cgd  *
     27       1.9      cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     28       1.9      cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     29       1.9      cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     30       1.9      cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     31       1.9      cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     32       1.9      cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     33       1.9      cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     34       1.9      cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     35       1.9      cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     36       1.9      cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     37       1.9      cgd  * SUCH DAMAGE.
     38       1.9      cgd  *
     39      1.18      cgd  *	@(#)procfs_vfsops.c	8.5 (Berkeley) 6/15/94
     40       1.2       pk  */
     41       1.2       pk 
     42       1.2       pk /*
     43       1.9      cgd  * procfs VFS interface
     44       1.1       pk  */
     45       1.1       pk 
     46       1.8  mycroft #include <sys/param.h>
     47       1.8  mycroft #include <sys/time.h>
     48       1.8  mycroft #include <sys/kernel.h>
     49       1.8  mycroft #include <sys/proc.h>
     50       1.8  mycroft #include <sys/buf.h>
     51       1.9      cgd #include <sys/syslog.h>
     52       1.8  mycroft #include <sys/mount.h>
     53       1.8  mycroft #include <sys/signalvar.h>
     54       1.8  mycroft #include <sys/vnode.h>
     55       1.9      cgd #include <miscfs/procfs/procfs.h>
     56      1.16  mycroft #include <vm/vm.h>			/* for PAGE_SIZE */
     57       1.1       pk 
     58       1.1       pk /*
     59       1.1       pk  * VFS Operations.
     60       1.1       pk  *
     61       1.1       pk  * mount system call
     62       1.1       pk  */
     63       1.1       pk /* ARGSUSED */
     64       1.9      cgd procfs_mount(mp, path, data, ndp, p)
     65       1.9      cgd 	struct mount *mp;
     66       1.1       pk 	char *path;
     67       1.1       pk 	caddr_t data;
     68       1.1       pk 	struct nameidata *ndp;
     69       1.1       pk 	struct proc *p;
     70       1.1       pk {
     71       1.1       pk 	u_int size;
     72       1.1       pk 
     73       1.9      cgd 	if (UIO_MX & (UIO_MX-1)) {
     74       1.9      cgd 		log(LOG_ERR, "procfs: invalid directory entry size");
     75       1.9      cgd 		return (EINVAL);
     76       1.1       pk 	}
     77       1.1       pk 
     78       1.9      cgd 	if (mp->mnt_flag & MNT_UPDATE)
     79       1.9      cgd 		return (EOPNOTSUPP);
     80       1.9      cgd 
     81      1.16  mycroft 	mp->mnt_flag |= MNT_LOCAL;
     82       1.9      cgd 	mp->mnt_data = 0;
     83      1.15      cgd 	getnewfsid(mp, makefstype(MOUNT_PROCFS));
     84       1.9      cgd 
     85      1.16  mycroft 	(void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN, &size);
     86       1.1       pk 	bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size);
     87      1.16  mycroft 	bzero(mp->mnt_stat.f_mntfromname, MNAMELEN);
     88      1.16  mycroft 	bcopy("procfs", mp->mnt_stat.f_mntfromname, sizeof("procfs"));
     89  1.18.2.1      cgd 	(void)procfs_statfs(mp, &mp->mnt_stat, p);
     90       1.1       pk 	return (0);
     91       1.1       pk }
     92       1.1       pk 
     93       1.1       pk /*
     94       1.1       pk  * unmount system call
     95       1.1       pk  */
     96       1.9      cgd procfs_unmount(mp, mntflags, p)
     97       1.1       pk 	struct mount *mp;
     98       1.1       pk 	int mntflags;
     99       1.1       pk 	struct proc *p;
    100       1.1       pk {
    101       1.9      cgd 	int error;
    102       1.9      cgd 	extern int doforce;
    103       1.9      cgd 	int flags = 0;
    104       1.9      cgd 
    105       1.9      cgd 	if (mntflags & MNT_FORCE) {
    106       1.9      cgd 		/* procfs can never be rootfs so don't check for it */
    107       1.9      cgd 		if (!doforce)
    108       1.9      cgd 			return (EINVAL);
    109       1.9      cgd 		flags |= FORCECLOSE;
    110       1.9      cgd 	}
    111       1.9      cgd 
    112       1.9      cgd 	if (error = vflush(mp, 0, flags))
    113       1.9      cgd 		return (error);
    114       1.9      cgd 
    115       1.1       pk 	return (0);
    116       1.1       pk }
    117       1.1       pk 
    118       1.9      cgd procfs_root(mp, vpp)
    119       1.1       pk 	struct mount *mp;
    120       1.1       pk 	struct vnode **vpp;
    121       1.1       pk {
    122       1.1       pk 
    123      1.16  mycroft 	return (procfs_allocvp(mp, vpp, 0, Proot));
    124       1.1       pk }
    125       1.1       pk 
    126       1.1       pk /* ARGSUSED */
    127       1.9      cgd procfs_start(mp, flags, p)
    128       1.1       pk 	struct mount *mp;
    129       1.1       pk 	int flags;
    130       1.1       pk 	struct proc *p;
    131       1.1       pk {
    132       1.9      cgd 
    133       1.9      cgd 	return (0);
    134       1.1       pk }
    135       1.1       pk 
    136       1.1       pk /*
    137       1.1       pk  * Get file system statistics.
    138       1.1       pk  */
    139       1.9      cgd procfs_statfs(mp, sbp, p)
    140       1.1       pk 	struct mount *mp;
    141       1.1       pk 	struct statfs *sbp;
    142       1.1       pk 	struct proc *p;
    143       1.1       pk {
    144      1.16  mycroft 
    145      1.12      cgd #ifdef COMPAT_09
    146      1.12      cgd 	sbp->f_type = 10;
    147      1.12      cgd #else
    148      1.12      cgd 	sbp->f_type = 0;
    149      1.12      cgd #endif
    150      1.16  mycroft 	sbp->f_bsize = PAGE_SIZE;
    151      1.14      cgd 	sbp->f_iosize = PAGE_SIZE;
    152       1.9      cgd 	sbp->f_blocks = 1;	/* avoid divide by zero in some df's */
    153       1.4       pk 	sbp->f_bfree = 0;
    154       1.1       pk 	sbp->f_bavail = 0;
    155       1.9      cgd 	sbp->f_files = maxproc;			/* approx */
    156       1.9      cgd 	sbp->f_ffree = maxproc - nprocs;	/* approx */
    157       1.9      cgd 	if (sbp != &mp->mnt_stat) {
    158       1.9      cgd 		bcopy(&mp->mnt_stat.f_fsid, &sbp->f_fsid, sizeof(sbp->f_fsid));
    159       1.9      cgd 		bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN);
    160       1.9      cgd 		bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN);
    161       1.9      cgd 	}
    162      1.12      cgd 	strncpy(&sbp->f_fstypename[0], mp->mnt_op->vfs_name, MFSNAMELEN);
    163      1.12      cgd 	sbp->f_fstypename[MFSNAMELEN] = '\0';
    164       1.9      cgd 	return (0);
    165       1.1       pk }
    166       1.1       pk 
    167       1.9      cgd procfs_quotactl(mp, cmds, uid, arg, p)
    168       1.1       pk 	struct mount *mp;
    169       1.1       pk 	int cmds;
    170       1.1       pk 	uid_t uid;
    171       1.1       pk 	caddr_t arg;
    172       1.1       pk 	struct proc *p;
    173       1.1       pk {
    174       1.9      cgd 
    175       1.9      cgd 	return (EOPNOTSUPP);
    176       1.1       pk }
    177       1.1       pk 
    178       1.9      cgd procfs_sync(mp, waitfor)
    179       1.1       pk 	struct mount *mp;
    180       1.1       pk 	int waitfor;
    181       1.1       pk {
    182       1.9      cgd 
    183       1.9      cgd 	return (0);
    184       1.1       pk }
    185       1.1       pk 
    186      1.16  mycroft procfs_vget(mp, ino, vpp)
    187      1.16  mycroft 	struct mount *mp;
    188      1.16  mycroft 	ino_t ino;
    189      1.16  mycroft 	struct vnode **vpp;
    190      1.16  mycroft {
    191      1.16  mycroft 
    192      1.16  mycroft 	return (EOPNOTSUPP);
    193      1.16  mycroft }
    194      1.16  mycroft 
    195       1.9      cgd procfs_fhtovp(mp, fhp, vpp)
    196       1.9      cgd 	struct mount *mp;
    197       1.1       pk 	struct fid *fhp;
    198       1.1       pk 	struct vnode **vpp;
    199       1.1       pk {
    200      1.16  mycroft 
    201      1.16  mycroft 	return (EINVAL);
    202       1.1       pk }
    203       1.1       pk 
    204       1.9      cgd procfs_vptofh(vp, fhp)
    205       1.1       pk 	struct vnode *vp;
    206       1.1       pk 	struct fid *fhp;
    207       1.1       pk {
    208      1.16  mycroft 
    209      1.16  mycroft 	return (EINVAL);
    210       1.1       pk }
    211       1.1       pk 
    212       1.9      cgd procfs_init()
    213       1.1       pk {
    214       1.9      cgd 
    215       1.9      cgd 	return (0);
    216       1.1       pk }
    217       1.9      cgd 
    218       1.9      cgd struct vfsops procfs_vfsops = {
    219      1.12      cgd 	MOUNT_PROCFS,
    220       1.9      cgd 	procfs_mount,
    221       1.9      cgd 	procfs_start,
    222       1.9      cgd 	procfs_unmount,
    223       1.9      cgd 	procfs_root,
    224       1.9      cgd 	procfs_quotactl,
    225       1.9      cgd 	procfs_statfs,
    226       1.9      cgd 	procfs_sync,
    227      1.16  mycroft 	procfs_vget,
    228       1.9      cgd 	procfs_fhtovp,
    229       1.9      cgd 	procfs_vptofh,
    230       1.9      cgd 	procfs_init,
    231       1.9      cgd };
    232