[BACK]Return to fdesc_vfsops.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / miscfs / fdesc

Annotation of src/sys/miscfs/fdesc/fdesc_vfsops.c, Revision 1.6

1.1       cgd         1: /*
1.6     ! cgd         2:  * Copyright (c) 1992 The Regents of the University of California
1.1       cgd         3:  * Copyright (c) 1990, 1992 Jan-Simon Pendry
                      4:  * All rights reserved.
                      5:  *
1.6     ! cgd         6:  * This code is derived from software donated to Berkeley by
1.1       cgd         7:  * Jan-Simon Pendry.
                      8:  *
1.2       cgd         9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
1.6     ! cgd        19:  *     This product includes software developed by the University of
        !            20:  *     California, Berkeley and its contributors.
1.2       cgd        21:  * 4. Neither the name of the University nor the names of its contributors
                     22:  *    may be used to endorse or promote products derived from this software
                     23:  *    without specific prior written permission.
1.1       cgd        24:  *
1.2       cgd        25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
1.1       cgd        36:  *
1.6     ! cgd        37:  * From:
        !            38:  *     Id: fdesc_vfsops.c,v 4.1 1993/12/17 10:47:45 jsp Rel
        !            39:  *
        !            40:  *     $Id$
1.1       cgd        41:  */
                     42:
                     43: /*
                     44:  * /dev/fd Filesystem
                     45:  */
                     46:
1.6     ! cgd        47: #include <sys/param.h>
        !            48: #include <sys/systm.h>
        !            49: #include <sys/time.h>
        !            50: #include <sys/types.h>
        !            51: #include <sys/proc.h>
        !            52: #include <sys/resourcevar.h>
        !            53: #include <sys/filedesc.h>
        !            54: #include <sys/vnode.h>
        !            55: #include <sys/mount.h>
        !            56: #include <sys/namei.h>
        !            57: #include <sys/malloc.h>
        !            58: #include <miscfs/fdesc/fdesc.h>
1.1       cgd        59:
1.6     ! cgd        60: dev_t devctty;
1.1       cgd        61:
                     62: fdesc_init()
                     63: {
                     64: #ifdef FDESC_DIAGNOSTIC
                     65:        printf("fdesc_init\n");         /* printed during system boot */
                     66: #endif
1.6     ! cgd        67:        devctty = makedev(nchrdev, 0);
1.1       cgd        68: }
                     69:
                     70: /*
                     71:  * Mount the per-process file descriptors (/dev/fd)
                     72:  */
                     73: fdesc_mount(mp, path, data, ndp, p)
                     74:        struct mount *mp;
                     75:        char *path;
                     76:        caddr_t data;
                     77:        struct nameidata *ndp;
                     78:        struct proc *p;
                     79: {
                     80:        int error = 0;
                     81:        u_int size;
                     82:        struct fdescmount *fmp;
                     83:        struct vnode *rvp;
                     84:
                     85: #ifdef FDESC_DIAGNOSTIC
                     86:        printf("fdesc_mount(mp = %x)\n", mp);
                     87: #endif
                     88:
                     89:        /*
                     90:         * Update is a no-op
                     91:         */
                     92:        if (mp->mnt_flag & MNT_UPDATE)
                     93:                return (EOPNOTSUPP);
                     94:
1.6     ! cgd        95:        error = fdesc_allocvp(Froot, FD_ROOT, mp, &rvp);
1.1       cgd        96:        if (error)
                     97:                return (error);
                     98:
1.6     ! cgd        99:        MALLOC(fmp, struct fdescmount *, sizeof(struct fdescmount),
        !           100:                                M_UFSMNT, M_WAITOK);    /* XXX */
1.1       cgd       101:        rvp->v_type = VDIR;
                    102:        rvp->v_flag |= VROOT;
1.6     ! cgd       103:        VTOFDESC(rvp)->fd_type = Froot;
1.1       cgd       104: #ifdef FDESC_DIAGNOSTIC
                    105:        printf("fdesc_mount: root vp = %x\n", rvp);
                    106: #endif
                    107:        fmp->f_root = rvp;
                    108:        mp->mnt_flag |= MNT_LOCAL;
                    109:        mp->mnt_data = (qaddr_t) fmp;
                    110:        getnewfsid(mp, MOUNT_FDESC);
                    111:
                    112:        (void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN - 1, &size);
                    113:        bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size);
                    114:        bzero(mp->mnt_stat.f_mntfromname, MNAMELEN);
                    115:        bcopy("fdesc", mp->mnt_stat.f_mntfromname, sizeof("fdesc"));
                    116: #ifdef FDESC_DIAGNOSTIC
                    117:        printf("fdesc_mount: at %s\n", mp->mnt_stat.f_mntonname);
                    118: #endif
                    119:        return (0);
                    120: }
                    121:
                    122: fdesc_start(mp, flags, p)
                    123:        struct mount *mp;
                    124:        int flags;
                    125:        struct proc *p;
                    126: {
                    127:        return (0);
                    128: }
                    129:
                    130: fdesc_unmount(mp, mntflags, p)
                    131:        struct mount *mp;
                    132:        int mntflags;
                    133:        struct proc *p;
                    134: {
                    135:        int error;
                    136:        int flags = 0;
                    137:        extern int doforce;
                    138:        struct vnode *rootvp = VFSTOFDESC(mp)->f_root;
                    139:
                    140: #ifdef FDESC_DIAGNOSTIC
                    141:        printf("fdesc_unmount(mp = %x)\n", mp);
                    142: #endif
                    143:
                    144:        if (mntflags & MNT_FORCE) {
                    145:                /* fdesc can never be rootfs so don't check for it */
                    146:                if (!doforce)
                    147:                        return (EINVAL);
                    148:                flags |= FORCECLOSE;
                    149:        }
                    150:
                    151:        /*
                    152:         * Clear out buffer cache.  I don't think we
                    153:         * ever get anything cached at this level at the
                    154:         * moment, but who knows...
                    155:         */
                    156: #ifdef FDESC_DIAGNOSTIC
                    157:        printf("fdesc_unmount: calling mntflushbuf\n");
                    158: #endif
                    159:        mntflushbuf(mp, 0);
                    160: #ifdef FDESC_DIAGNOSTIC
                    161:        printf("fdesc_unmount: calling mntinvalbuf\n");
                    162: #endif
                    163:        if (mntinvalbuf(mp, 1))
                    164:                return (EBUSY);
                    165:        if (rootvp->v_usecount > 1)
                    166:                return (EBUSY);
                    167: #ifdef FDESC_DIAGNOSTIC
                    168:        printf("fdesc_unmount: calling vflush\n");
                    169: #endif
                    170:        if (error = vflush(mp, rootvp, flags))
                    171:                return (error);
                    172:
                    173: #ifdef FDESC_DIAGNOSTIC
                    174:        vprint("fdesc root", rootvp);
                    175: #endif
                    176:        /*
                    177:         * Release reference on underlying root vnode
                    178:         */
                    179:        vrele(rootvp);
                    180:        /*
                    181:         * And blow it away for future re-use
                    182:         */
                    183:        vgone(rootvp);
                    184:        /*
                    185:         * Finally, throw away the fdescmount structure
                    186:         */
1.6     ! cgd       187:        free(mp->mnt_data, M_UFSMNT);   /* XXX */
1.1       cgd       188:        mp->mnt_data = 0;
                    189:        return 0;
                    190: }
                    191:
                    192: fdesc_root(mp, vpp)
                    193:        struct mount *mp;
                    194:        struct vnode **vpp;
                    195: {
                    196:        struct vnode *vp;
                    197:        int error;
                    198:
                    199: #ifdef FDESC_DIAGNOSTIC
                    200:        printf("fdesc_root(mp = %x)\n", mp);
                    201: #endif
                    202:
                    203:        /*
                    204:         * Return locked reference to root.
                    205:         */
                    206:        vp = VFSTOFDESC(mp)->f_root;
                    207:        VREF(vp);
                    208:        VOP_LOCK(vp);
                    209:        *vpp = vp;
                    210:        return (0);
                    211: }
                    212:
                    213: fdesc_quotactl(mp, cmd, uid, arg, p)
                    214:        struct mount *mp;
                    215:        int cmd;
                    216:        uid_t uid;
                    217:        caddr_t arg;
                    218:        struct proc *p;
                    219: {
                    220:        return (EOPNOTSUPP);
                    221: }
                    222:
                    223: fdesc_statfs(mp, sbp, p)
                    224:        struct mount *mp;
                    225:        struct statfs *sbp;
                    226:        struct proc *p;
                    227: {
                    228:        struct filedesc *fdp;
                    229:        int lim;
                    230:        int i;
                    231:        int last;
                    232:        int freefd;
                    233:
                    234: #ifdef FDESC_DIAGNOSTIC
                    235:        printf("fdesc_statfs(mp = %x)\n", mp);
                    236: #endif
                    237:
                    238:        /*
                    239:         * Compute number of free file descriptors.
                    240:         * [ Strange results will ensue if the open file
                    241:         * limit is ever reduced below the current number
                    242:         * of open files... ]
                    243:         */
1.5       mycroft   244:        lim = p->p_rlimit[RLIMIT_NOFILE].rlim_cur;
1.1       cgd       245:        fdp = p->p_fd;
                    246:        last = min(fdp->fd_nfiles, lim);
                    247:        freefd = 0;
                    248:        for (i = fdp->fd_freefile; i < last; i++)
                    249:                if (fdp->fd_ofiles[i] == NULL)
                    250:                        freefd++;
                    251:
                    252:        /*
                    253:         * Adjust for the fact that the fdesc array may not
                    254:         * have been fully allocated yet.
                    255:         */
                    256:        if (fdp->fd_nfiles < lim)
                    257:                freefd += (lim - fdp->fd_nfiles);
                    258:
                    259:        sbp->f_type = MOUNT_FDESC;
                    260:        sbp->f_flags = 0;
                    261:        sbp->f_fsize = DEV_BSIZE;
                    262:        sbp->f_bsize = DEV_BSIZE;
                    263:        sbp->f_blocks = 2;              /* 1K to keep df happy */
                    264:        sbp->f_bfree = 0;
                    265:        sbp->f_bavail = 0;
                    266:        sbp->f_files = lim + 1;         /* Allow for "." */
                    267:        sbp->f_ffree = freefd;          /* See comments above */
                    268:        if (sbp != &mp->mnt_stat) {
                    269:                bcopy(&mp->mnt_stat.f_fsid, &sbp->f_fsid, sizeof(sbp->f_fsid));
                    270:                bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN);
                    271:                bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN);
                    272:        }
                    273:        return (0);
                    274: }
                    275:
                    276: fdesc_sync(mp, waitfor)
                    277:        struct mount *mp;
                    278:        int waitfor;
                    279: {
                    280:        return (0);
                    281: }
                    282:
                    283: fdesc_fhtovp(mp, fhp, vpp)
                    284:        struct mount *mp;
                    285:        struct fid *fhp;
                    286:        struct vnode **vpp;
                    287: {
                    288:        return (EOPNOTSUPP);
                    289: }
                    290:
                    291: fdesc_vptofh(vp, fhp)
                    292:        struct vnode *vp;
                    293:        struct fid *fhp;
                    294: {
                    295:        return (EOPNOTSUPP);
                    296: }
                    297:
                    298: struct vfsops fdesc_vfsops = {
                    299:        fdesc_mount,
                    300:        fdesc_start,
                    301:        fdesc_unmount,
                    302:        fdesc_root,
                    303:        fdesc_quotactl,
                    304:        fdesc_statfs,
                    305:        fdesc_sync,
                    306:        fdesc_fhtovp,
                    307:        fdesc_vptofh,
                    308:        fdesc_init,
                    309: };

CVSweb <webmaster@jp.NetBSD.org>