The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/miscfs/nullfs/null_vfsops.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: null_vfsops.c,v 1.54 2005/02/26 22:59:00 perry Exp $   */
    2 
    3 /*
    4  * Copyright (c) 1999 National Aeronautics & Space Administration
    5  * All rights reserved.
    6  *
    7  * This software was written by William Studenmund of the
    8  * Numerical Aerospace Simulation Facility, NASA Ames Research Center.
    9  *
   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.
   18  * 3. Neither the name of the National Aeronautics & Space Administration
   19  *    nor the names of its contributors may be used to endorse or promote
   20  *    products derived from this software without specific prior written
   21  *    permission.
   22  *
   23  * THIS SOFTWARE IS PROVIDED BY THE NATIONAL AERONAUTICS & SPACE ADMINISTRATION
   24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   26  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ADMINISTRATION OR CONTRIB-
   27  * UTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
   28  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   33  * POSSIBILITY OF SUCH DAMAGE.
   34  */
   35 /*
   36  * Copyright (c) 1992, 1993, 1995
   37  *      The Regents of the University of California.  All rights reserved.
   38  *
   39  * This code is derived from software donated to Berkeley by
   40  * Jan-Simon Pendry.
   41  *
   42  * Redistribution and use in source and binary forms, with or without
   43  * modification, are permitted provided that the following conditions
   44  * are met:
   45  * 1. Redistributions of source code must retain the above copyright
   46  *    notice, this list of conditions and the following disclaimer.
   47  * 2. Redistributions in binary form must reproduce the above copyright
   48  *    notice, this list of conditions and the following disclaimer in the
   49  *    documentation and/or other materials provided with the distribution.
   50  * 3. Neither the name of the University nor the names of its contributors
   51  *    may be used to endorse or promote products derived from this software
   52  *    without specific prior written permission.
   53  *
   54  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   55  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   56  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   57  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   58  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   59  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   60  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   62  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   63  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   64  * SUCH DAMAGE.
   65  *
   66  *      from: Id: lofs_vfsops.c,v 1.9 1992/05/30 10:26:24 jsp Exp
   67  *      from: @(#)lofs_vfsops.c 1.2 (Berkeley) 6/18/92
   68  *      @(#)null_vfsops.c       8.7 (Berkeley) 5/14/95
   69  */
   70 
   71 /*
   72  * Null Layer
   73  * (See null_vnops.c for a description of what this does.)
   74  */
   75 
   76 #include <sys/cdefs.h>
   77 __KERNEL_RCSID(0, "$NetBSD: null_vfsops.c,v 1.54 2005/02/26 22:59:00 perry Exp $");
   78 
   79 #include <sys/param.h>
   80 #include <sys/systm.h>
   81 #include <sys/sysctl.h>
   82 #include <sys/time.h>
   83 #include <sys/proc.h>
   84 #include <sys/vnode.h>
   85 #include <sys/mount.h>
   86 #include <sys/namei.h>
   87 #include <sys/malloc.h>
   88 
   89 #include <miscfs/nullfs/null.h>
   90 #include <miscfs/genfs/layer_extern.h>
   91 
   92 int     nullfs_mount __P((struct mount *, const char *, void *,
   93             struct nameidata *, struct proc *));
   94 int     nullfs_unmount __P((struct mount *, int, struct proc *));
   95 
   96 /*
   97  * Mount null layer
   98  */
   99 int
  100 nullfs_mount(mp, path, data, ndp, p)
  101         struct mount *mp;
  102         const char *path;
  103         void *data;
  104         struct nameidata *ndp;
  105         struct proc *p;
  106 {
  107         struct null_args args;
  108         struct vnode *lowerrootvp, *vp;
  109         struct null_mount *nmp;
  110         struct layer_mount *lmp;
  111         int error = 0;
  112 
  113 #ifdef NULLFS_DIAGNOSTIC
  114         printf("nullfs_mount(mp = %p)\n", mp);
  115 #endif
  116 
  117         if (mp->mnt_flag & MNT_GETARGS) {
  118                 lmp = MOUNTTOLAYERMOUNT(mp);
  119                 if (lmp == NULL)
  120                         return EIO;
  121                 args.la.target = NULL;
  122                 vfs_showexport(mp, &args.la.export, &lmp->layerm_export);
  123                 return copyout(&args, data, sizeof(args));
  124         }
  125         /*
  126          * Get argument
  127          */
  128         error = copyin(data, &args, sizeof(struct null_args));
  129         if (error)
  130                 return (error);
  131 
  132         /*
  133          * Update only does export updating.
  134          */
  135         if (mp->mnt_flag & MNT_UPDATE) {
  136                 lmp = MOUNTTOLAYERMOUNT(mp);
  137                 if (args.nulla_target == NULL)
  138                         return (vfs_export(mp, &lmp->layerm_export,
  139                             &args.la.export));
  140                 else
  141                         return (EOPNOTSUPP);
  142         }
  143 
  144         /*
  145          * Find lower node
  146          */
  147         NDINIT(ndp, LOOKUP, FOLLOW|LOCKLEAF,
  148                 UIO_USERSPACE, args.la.target, p);
  149         if ((error = namei(ndp)) != 0)
  150                 return (error);
  151 
  152         /*
  153          * Sanity check on lower vnode
  154          */
  155         lowerrootvp = ndp->ni_vp;
  156 
  157         /*
  158          * First cut at fixing up upper mount point
  159          */
  160         nmp = (struct null_mount *) malloc(sizeof(struct null_mount),
  161             M_UFSMNT, M_WAITOK);                /* XXX */
  162         memset(nmp, 0, sizeof(struct null_mount));
  163 
  164         mp->mnt_data = nmp;
  165         mp->mnt_leaf = lowerrootvp->v_mount->mnt_leaf;
  166         nmp->nullm_vfs = lowerrootvp->v_mount;
  167         if (nmp->nullm_vfs->mnt_flag & MNT_LOCAL)
  168                 mp->mnt_flag |= MNT_LOCAL;
  169 
  170         /*
  171          * Make sure that the mount point is sufficiently initialized
  172          * that the node create call will work.
  173          */
  174         vfs_getnewfsid(mp);
  175 
  176         nmp->nullm_size = sizeof(struct null_node);
  177         nmp->nullm_tag = VT_NULL;
  178         nmp->nullm_bypass = layer_bypass;
  179         nmp->nullm_alloc = layer_node_alloc;    /* the default alloc is fine */
  180         nmp->nullm_vnodeop_p = null_vnodeop_p;
  181         simple_lock_init(&nmp->nullm_hashlock);
  182         nmp->nullm_node_hashtbl = hashinit(desiredvnodes, HASH_LIST, M_CACHE,
  183             M_WAITOK, &nmp->nullm_node_hash);
  184 
  185         /*
  186          * Fix up null node for root vnode
  187          */
  188         error = layer_node_create(mp, lowerrootvp, &vp);
  189         /*
  190          * Make sure the fixup worked
  191          */
  192         if (error) {
  193                 vput(lowerrootvp);
  194                 hashdone(nmp->nullm_node_hashtbl, M_CACHE);
  195                 free(nmp, M_UFSMNT);    /* XXX */
  196                 return (error);
  197         }
  198         /*
  199          * Unlock the node
  200          */
  201         VOP_UNLOCK(vp, 0);
  202 
  203         /*
  204          * Keep a held reference to the root vnode.
  205          * It is vrele'd in nullfs_unmount.
  206          */
  207         vp->v_flag |= VROOT;
  208         nmp->nullm_rootvp = vp;
  209 
  210         error = set_statvfs_info(path, UIO_USERSPACE, args.la.target,
  211             UIO_USERSPACE, mp, p);
  212 #ifdef NULLFS_DIAGNOSTIC
  213         printf("nullfs_mount: lower %s, alias at %s\n",
  214             mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntonname);
  215 #endif
  216         return error;
  217 }
  218 
  219 /*
  220  * Free reference to null layer
  221  */
  222 int
  223 nullfs_unmount(mp, mntflags, p)
  224         struct mount *mp;
  225         int mntflags;
  226         struct proc *p;
  227 {
  228         struct null_mount *nmp = MOUNTTONULLMOUNT(mp);
  229         struct vnode *null_rootvp = nmp->nullm_rootvp;
  230         int error;
  231         int flags = 0;
  232 
  233 #ifdef NULLFS_DIAGNOSTIC
  234         printf("nullfs_unmount(mp = %p)\n", mp);
  235 #endif
  236 
  237         if (mntflags & MNT_FORCE)
  238                 flags |= FORCECLOSE;
  239 
  240         /*
  241          * Clear out buffer cache.  I don't think we
  242          * ever get anything cached at this level at the
  243          * moment, but who knows...
  244          */
  245 #if 0
  246         mntflushbuf(mp, 0);
  247         if (mntinvalbuf(mp, 1))
  248                 return (EBUSY);
  249 #endif
  250         if (null_rootvp->v_usecount > 1)
  251                 return (EBUSY);
  252         if ((error = vflush(mp, null_rootvp, flags)) != 0)
  253                 return (error);
  254 
  255 #ifdef NULLFS_DIAGNOSTIC
  256         vprint("alias root of lower", null_rootvp);
  257 #endif
  258         /*
  259          * Release reference on underlying root vnode
  260          */
  261         vrele(null_rootvp);
  262 
  263         /*
  264          * And blow it away for future re-use
  265          */
  266         vgone(null_rootvp);
  267 
  268         /*
  269          * Finally, throw away the null_mount structure
  270          */
  271         hashdone(nmp->nullm_node_hashtbl, M_CACHE);
  272         free(mp->mnt_data, M_UFSMNT);   /* XXX */
  273         mp->mnt_data = NULL;
  274         return (0);
  275 }
  276 
  277 SYSCTL_SETUP(sysctl_vfs_null_setup, "sysctl vfs.null subtree setup")
  278 {
  279 
  280         sysctl_createv(clog, 0, NULL, NULL,
  281                        CTLFLAG_PERMANENT,
  282                        CTLTYPE_NODE, "vfs", NULL,
  283                        NULL, 0, NULL, 0,
  284                        CTL_VFS, CTL_EOL);
  285         sysctl_createv(clog, 0, NULL, NULL,
  286                        CTLFLAG_PERMANENT,
  287                        CTLTYPE_NODE, "null",
  288                        SYSCTL_DESCR("Loopback file system"),
  289                        NULL, 0, NULL, 0,
  290                        CTL_VFS, 9, CTL_EOL);
  291         /*
  292          * XXX the "9" above could be dynamic, thereby eliminating one
  293          * more instance of the "number to vfs" mapping problem, but
  294          * "9" is the order as taken from sys/mount.h
  295          */
  296 }
  297 
  298 extern const struct vnodeopv_desc null_vnodeop_opv_desc;
  299 
  300 const struct vnodeopv_desc * const nullfs_vnodeopv_descs[] = {
  301         &null_vnodeop_opv_desc,
  302         NULL,
  303 };
  304 
  305 struct vfsops nullfs_vfsops = {
  306         MOUNT_NULL,
  307         nullfs_mount,
  308         layerfs_start,
  309         nullfs_unmount,
  310         layerfs_root,
  311         layerfs_quotactl,
  312         layerfs_statvfs,
  313         layerfs_sync,
  314         layerfs_vget,
  315         layerfs_fhtovp,
  316         layerfs_vptofh,
  317         layerfs_init,
  318         NULL,
  319         layerfs_done,
  320         NULL,
  321         NULL,                           /* vfs_mountroot */
  322         layerfs_checkexp,
  323         layerfs_snapshot,
  324         vfs_stdextattrctl,
  325         nullfs_vnodeopv_descs,
  326 };

Cache object: eebd52e3f3e503bd3cef5c6431be02ab


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.