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

Annotation of src/sys/miscfs/kernfs/kernfs_vfsops.c, Revision 1.84

1.84    ! ad          1: /*     $NetBSD: kernfs_vfsops.c,v 1.83 2008/01/28 14:31:18 dholland Exp $      */
1.18      cgd         2:
1.1       cgd         3: /*
1.32      fvdl        4:  * Copyright (c) 1992, 1993, 1995
1.15      mycroft     5:  *     The Regents of the University of California.  All rights reserved.
1.1       cgd         6:  *
1.11      cgd         7:  * This code is derived from software donated to Berkeley by
1.1       cgd         8:  * Jan-Simon Pendry.
                      9:  *
1.2       cgd        10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
1.53      agc        18:  * 3. Neither the name of the University nor the names of its contributors
1.2       cgd        19:  *    may be used to endorse or promote products derived from this software
                     20:  *    without specific prior written permission.
1.1       cgd        21:  *
1.2       cgd        22:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     26:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     32:  * SUCH DAMAGE.
1.1       cgd        33:  *
1.32      fvdl       34:  *     @(#)kernfs_vfsops.c     8.10 (Berkeley) 5/14/95
1.1       cgd        35:  */
                     36:
                     37: /*
                     38:  * Kernel params Filesystem
                     39:  */
1.42      lukem      40:
                     41: #include <sys/cdefs.h>
1.84    ! ad         42: __KERNEL_RCSID(0, "$NetBSD: kernfs_vfsops.c,v 1.83 2008/01/28 14:31:18 dholland Exp $");
1.33      jonathan   43:
1.54      itojun     44: #ifdef _KERNEL_OPT
1.33      jonathan   45: #include "opt_compat_netbsd.h"
                     46: #endif
1.1       cgd        47:
1.9       mycroft    48: #include <sys/param.h>
                     49: #include <sys/systm.h>
1.57      atatat     50: #include <sys/sysctl.h>
1.15      mycroft    51: #include <sys/conf.h>
1.9       mycroft    52: #include <sys/proc.h>
                     53: #include <sys/vnode.h>
                     54: #include <sys/mount.h>
                     55: #include <sys/namei.h>
1.60      christos   56: #include <sys/dirent.h>
1.9       mycroft    57: #include <sys/malloc.h>
1.54      itojun     58: #include <sys/syslog.h>
1.71      elad       59: #include <sys/kauth.h>
1.15      mycroft    60:
1.83      dholland   61: #include <miscfs/genfs/genfs.h>
1.15      mycroft    62: #include <miscfs/specfs/specdev.h>
1.9       mycroft    63: #include <miscfs/kernfs/kernfs.h>
1.1       cgd        64:
1.77      pooka      65: MALLOC_JUSTDEFINE(M_KERNFSMNT, "kernfs mount", "kernfs mount structures");
1.47      thorpej    66:
1.15      mycroft    67: dev_t rrootdev = NODEV;
                     68:
1.81      pooka      69: VFS_PROTOS(kernfs);
                     70:
1.68      xtraeme    71: void   kernfs_get_rrootdev(void);
1.25      christos   72:
                     73: void
1.1       cgd        74: kernfs_init()
                     75: {
1.77      pooka      76:
1.49      christos   77:        malloc_type_attach(M_KERNFSMNT);
1.54      itojun     78:        kernfs_hashinit();
                     79: }
                     80:
                     81: void
                     82: kernfs_reinit()
                     83: {
                     84:        kernfs_hashreinit();
1.10      cgd        85: }
                     86:
1.11      cgd        87: void
1.36      jdolecek   88: kernfs_done()
                     89: {
1.77      pooka      90:
                     91:        kernfs_hashdone();
1.49      christos   92:        malloc_type_detach(M_KERNFSMNT);
1.36      jdolecek   93: }
                     94:
                     95: void
1.15      mycroft    96: kernfs_get_rrootdev()
1.10      cgd        97: {
1.16      mycroft    98:        static int tried = 0;
1.10      cgd        99:
1.16      mycroft   100:        if (tried) {
1.15      mycroft   101:                /* Already did it once. */
                    102:                return;
                    103:        }
1.16      mycroft   104:        tried = 1;
                    105:
                    106:        if (rootdev == NODEV)
                    107:                return;
1.45      gehenna   108:        rrootdev = devsw_blk2chr(rootdev);
1.54      itojun    109:        if (rrootdev != NODEV)
1.45      gehenna   110:                return;
1.16      mycroft   111:        rrootdev = NODEV;
1.28      christos  112:        printf("kernfs_get_rrootdev: no raw root device\n");
1.1       cgd       113: }
                    114:
                    115: /*
1.15      mycroft   116:  * Mount the Kernel params filesystem
1.1       cgd       117:  */
1.25      christos  118: int
1.82      pooka     119: kernfs_mount(struct mount *mp, const char *path, void *data, size_t *data_len)
1.1       cgd       120: {
1.82      pooka     121:        struct lwp *l = curlwp;
1.1       cgd       122:        int error = 0;
                    123:        struct kernfs_mount *fmp;
                    124:
1.54      itojun    125:        if (UIO_MX & (UIO_MX - 1)) {
                    126:                log(LOG_ERR, "kernfs: invalid directory entry size");
                    127:                return (EINVAL);
                    128:        }
1.1       cgd       129:
1.78      dsl       130:        if (mp->mnt_flag & MNT_GETARGS) {
                    131:                *data_len = 0;
1.46      christos  132:                return 0;
1.78      dsl       133:        }
1.1       cgd       134:        /*
                    135:         * Update is a no-op
                    136:         */
                    137:        if (mp->mnt_flag & MNT_UPDATE)
                    138:                return (EOPNOTSUPP);
                    139:
1.15      mycroft   140:        MALLOC(fmp, struct kernfs_mount *, sizeof(struct kernfs_mount),
1.47      thorpej   141:            M_KERNFSMNT, M_WAITOK);
1.54      itojun    142:        memset(fmp, 0, sizeof(*fmp));
                    143:        TAILQ_INIT(&fmp->nodelist);
                    144:
1.65      jdolecek  145:        mp->mnt_stat.f_namemax = MAXNAMLEN;
                    146:        mp->mnt_flag |= MNT_LOCAL;
1.54      itojun    147:        mp->mnt_data = fmp;
1.37      assar     148:        vfs_getnewfsid(mp);
1.1       cgd       149:
1.64      tron      150:        if ((error = set_statvfs_info(path, UIO_USERSPACE, "kernfs",
1.79      pooka     151:            UIO_SYSSPACE, mp->mnt_op->vfs_name, mp, l)) != 0) {
1.64      tron      152:                free(fmp, M_KERNFSMNT);
                    153:                return error;
                    154:        }
1.10      cgd       155:
1.15      mycroft   156:        kernfs_get_rrootdev();
1.64      tron      157:        return 0;
1.1       cgd       158: }
                    159:
1.25      christos  160: int
1.82      pooka     161: kernfs_start(struct mount *mp, int flags)
1.1       cgd       162: {
1.15      mycroft   163:
1.1       cgd       164:        return (0);
                    165: }
                    166:
1.25      christos  167: int
1.82      pooka     168: kernfs_unmount(struct mount *mp, int mntflags)
1.1       cgd       169: {
                    170:        int error;
                    171:        int flags = 0;
                    172:
1.54      itojun    173:        if (mntflags & MNT_FORCE)
1.1       cgd       174:                flags |= FORCECLOSE;
                    175:
1.54      itojun    176:        if ((error = vflush(mp, 0, flags)) != 0)
1.1       cgd       177:                return (error);
                    178:
                    179:        /*
                    180:         * Finally, throw away the kernfs_mount structure
                    181:         */
1.47      thorpej   182:        free(mp->mnt_data, M_KERNFSMNT);
1.64      tron      183:        mp->mnt_data = NULL;
1.15      mycroft   184:        return (0);
1.1       cgd       185: }
                    186:
1.25      christos  187: int
1.51      thorpej   188: kernfs_root(mp, vpp)
1.1       cgd       189:        struct mount *mp;
                    190:        struct vnode **vpp;
                    191: {
                    192:
1.54      itojun    193:        /* setup "." */
1.56      darcy     194:        return (kernfs_allocvp(mp, vpp, KFSkern, &kern_targets[0], 0));
1.1       cgd       195: }
                    196:
1.25      christos  197: int
1.82      pooka     198: kernfs_statvfs(struct mount *mp, struct statvfs *sbp)
1.1       cgd       199: {
                    200:
                    201:        sbp->f_bsize = DEV_BSIZE;
1.59      christos  202:        sbp->f_frsize = DEV_BSIZE;
1.13      cgd       203:        sbp->f_iosize = DEV_BSIZE;
1.1       cgd       204:        sbp->f_blocks = 2;              /* 1K to keep df happy */
                    205:        sbp->f_bfree = 0;
                    206:        sbp->f_bavail = 0;
1.59      christos  207:        sbp->f_bresvd = 0;
1.54      itojun    208:        sbp->f_files = 1024;    /* XXX lie */
                    209:        sbp->f_ffree = 128;     /* XXX lie */
1.59      christos  210:        sbp->f_favail = 128;    /* XXX lie */
                    211:        sbp->f_fresvd = 0;
                    212:        copy_statvfs_info(sbp, mp);
1.1       cgd       213:        return (0);
                    214: }
                    215:
1.25      christos  216: /*ARGSUSED*/
                    217: int
1.74      christos  218: kernfs_sync(struct mount *mp, int waitfor,
1.82      pooka     219:     kauth_cred_t uc)
1.1       cgd       220: {
1.15      mycroft   221:
1.1       cgd       222:        return (0);
                    223: }
                    224:
1.15      mycroft   225: /*
                    226:  * Kernfs flat namespace lookup.
                    227:  * Currently unsupported.
                    228:  */
1.25      christos  229: int
1.74      christos  230: kernfs_vget(struct mount *mp, ino_t ino,
                    231:     struct vnode **vpp)
1.15      mycroft   232: {
                    233:
                    234:        return (EOPNOTSUPP);
                    235: }
                    236:
1.58      atatat    237: SYSCTL_SETUP(sysctl_vfs_kernfs_setup, "sysctl vfs.kern subtree setup")
1.32      fvdl      238: {
1.57      atatat    239:
1.58      atatat    240:        sysctl_createv(clog, 0, NULL, NULL,
                    241:                       CTLFLAG_PERMANENT,
1.57      atatat    242:                       CTLTYPE_NODE, "vfs", NULL,
                    243:                       NULL, 0, NULL, 0,
                    244:                       CTL_VFS, CTL_EOL);
1.58      atatat    245:        sysctl_createv(clog, 0, NULL, NULL,
                    246:                       CTLFLAG_PERMANENT,
1.62      atatat    247:                       CTLTYPE_NODE, "kernfs",
                    248:                       SYSCTL_DESCR("/kern file system"),
1.57      atatat    249:                       NULL, 0, NULL, 0,
                    250:                       CTL_VFS, 11, CTL_EOL);
                    251:        /*
                    252:         * XXX the "11" above could be dynamic, thereby eliminating one
                    253:         * more instance of the "number to vfs" mapping problem, but
                    254:         * "11" is the order as taken from sys/mount.h
                    255:         */
1.32      fvdl      256: }
                    257:
1.38      jdolecek  258: extern const struct vnodeopv_desc kernfs_vnodeop_opv_desc;
1.31      thorpej   259:
1.38      jdolecek  260: const struct vnodeopv_desc * const kernfs_vnodeopv_descs[] = {
1.31      thorpej   261:        &kernfs_vnodeop_opv_desc,
                    262:        NULL,
                    263: };
                    264:
1.1       cgd       265: struct vfsops kernfs_vfsops = {
1.12      cgd       266:        MOUNT_KERNFS,
1.78      dsl       267:        0,
1.1       cgd       268:        kernfs_mount,
                    269:        kernfs_start,
                    270:        kernfs_unmount,
                    271:        kernfs_root,
1.82      pooka     272:        (void *)eopnotsupp,             /* vfs_quotactl */
1.59      christos  273:        kernfs_statvfs,
1.1       cgd       274:        kernfs_sync,
1.15      mycroft   275:        kernfs_vget,
1.75      chs       276:        (void *)eopnotsupp,             /* vfs_fhtovp */
                    277:        (void *)eopnotsupp,             /* vfs_vptofh */
1.1       cgd       278:        kernfs_init,
1.54      itojun    279:        kernfs_reinit,
1.36      jdolecek  280:        kernfs_done,
1.31      thorpej   281:        NULL,                           /* vfs_mountroot */
1.63      hannken   282:        (int (*)(struct mount *, struct vnode *, struct timespec *)) eopnotsupp,
1.66      thorpej   283:        vfs_stdextattrctl,
1.80      pooka     284:        (void *)eopnotsupp,             /* vfs_suspendctl */
1.83      dholland  285:        genfs_renamelock_enter,
                    286:        genfs_renamelock_exit,
1.84    ! ad        287:        (void *)eopnotsupp,
1.31      thorpej   288:        kernfs_vnodeopv_descs,
1.72      christos  289:        0,
                    290:        { NULL, NULL },
1.1       cgd       291: };
1.67      thorpej   292: VFS_ATTACH(kernfs_vfsops);

CVSweb <webmaster@jp.NetBSD.org>