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/fs/filecorefs/filecore_vnops.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: filecore_vnops.c,v 1.8 2004/01/26 10:39:30 hannken Exp $       */
    2 
    3 /*-
    4  * Copyright (c) 1994 The Regents of the University of California.
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. Neither the name of the University nor the names of its contributors
   16  *    may be used to endorse or promote products derived from this software
   17  *    without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29  * SUCH DAMAGE.
   30  *
   31  *      filecore_vnops.c        1.2     1998/8/18
   32  */
   33 
   34 /*-
   35  * Copyright (c) 1998 Andrew McMurry
   36  *
   37  * Redistribution and use in source and binary forms, with or without
   38  * modification, are permitted provided that the following conditions
   39  * are met:
   40  * 1. Redistributions of source code must retain the above copyright
   41  *    notice, this list of conditions and the following disclaimer.
   42  * 2. Redistributions in binary form must reproduce the above copyright
   43  *    notice, this list of conditions and the following disclaimer in the
   44  *    documentation and/or other materials provided with the distribution.
   45  * 3. All advertising materials mentioning features or use of this software
   46  *    must display the following acknowledgement:
   47  *      This product includes software developed by the University of
   48  *      California, Berkeley and its contributors.
   49  * 4. Neither the name of the University nor the names of its contributors
   50  *    may be used to endorse or promote products derived from this software
   51  *    without specific prior written permission.
   52  *
   53  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   54  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   56  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   57  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   58  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   59  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   60  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   61  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   62  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   63  * SUCH DAMAGE.
   64  *
   65  *      filecore_vnops.c        1.2     1998/8/18
   66  */
   67 
   68 #include <sys/cdefs.h>
   69 __KERNEL_RCSID(0, "$NetBSD: filecore_vnops.c,v 1.8 2004/01/26 10:39:30 hannken Exp $");
   70 
   71 #include <sys/param.h>
   72 #include <sys/systm.h>
   73 #include <sys/namei.h>
   74 #include <sys/resourcevar.h>
   75 #include <sys/kernel.h>
   76 #include <sys/file.h>
   77 #include <sys/stat.h>
   78 #include <sys/buf.h>
   79 #include <sys/proc.h>
   80 #include <sys/conf.h>
   81 #include <sys/mount.h>
   82 #include <sys/vnode.h>
   83 #include <sys/malloc.h>
   84 #include <sys/dirent.h>
   85 
   86 #include <miscfs/genfs/genfs.h>
   87 #include <miscfs/specfs/specdev.h>
   88 
   89 #include <fs/filecorefs/filecore.h>
   90 #include <fs/filecorefs/filecore_extern.h>
   91 #include <fs/filecorefs/filecore_node.h>
   92 
   93 /*
   94  * Check mode permission on inode pointer. Mode is READ, WRITE or EXEC.
   95  * The mode is shifted to select the owner/group/other fields. The
   96  * super user is granted all permissions.
   97  */
   98 int
   99 filecore_access(v)
  100         void *v;
  101 {
  102         struct vop_access_args /* {
  103                 struct vnode *a_vp;
  104                 int  a_mode;
  105                 struct ucred *a_cred;
  106                 struct proc *a_p;
  107         } */ *ap = v;
  108         struct vnode *vp = ap->a_vp;
  109         struct filecore_node *ip = VTOI(vp);
  110         struct filecore_mnt *fcmp = ip->i_mnt;
  111 
  112         /*
  113          * Disallow write attempts unless the file is a socket,
  114          * fifo, or a block or character device resident on the
  115          * file system.
  116          */
  117         if (ap->a_mode & VWRITE) {
  118                 switch (vp->v_type) {
  119                 case VDIR:
  120                 case VLNK:
  121                 case VREG:
  122                         return (EROFS);
  123                 default:
  124                         break;
  125                 }
  126         }
  127 
  128         return (vaccess(vp->v_type, filecore_mode(ip),
  129             fcmp->fc_uid, fcmp->fc_gid, ap->a_mode, ap->a_cred));
  130 }
  131 
  132 int
  133 filecore_getattr(v)
  134         void *v;
  135 {
  136         struct vop_getattr_args /* {
  137                 struct vnode *a_vp;
  138                 struct vattr *a_vap;
  139                 struct ucred *a_cred;
  140                 struct proc *a_p;
  141         } */ *ap = v;
  142         struct vnode *vp = ap->a_vp;
  143         struct filecore_node *ip = VTOI(vp);
  144         struct vattr *vap = ap->a_vap;
  145         struct filecore_mnt *fcmp = ip->i_mnt;
  146 
  147         vap->va_fsid    = ip->i_dev;
  148         vap->va_fileid  = ip->i_number;
  149 
  150         vap->va_mode    = filecore_mode(ip);
  151         vap->va_nlink   = 1;
  152         vap->va_uid     = fcmp->fc_uid;
  153         vap->va_gid     = fcmp->fc_gid;
  154         vap->va_atime   = filecore_time(ip);
  155         vap->va_mtime   = filecore_time(ip);
  156         vap->va_ctime   = filecore_time(ip);
  157         vap->va_rdev    = 0;  /* We don't support specials */
  158 
  159         vap->va_size    = (u_quad_t) ip->i_size;
  160         vap->va_flags   = 0;
  161         vap->va_gen     = 1;
  162         vap->va_blocksize = fcmp->blksize;
  163         vap->va_bytes   = vap->va_size;
  164         vap->va_type    = vp->v_type;
  165         return (0);
  166 }
  167 
  168 /*
  169  * Vnode op for reading.
  170  */
  171 int
  172 filecore_read(v)
  173         void *v;
  174 {
  175         struct vop_read_args /* {
  176                 struct vnode *a_vp;
  177                 struct uio *a_uio;
  178                 int a_ioflag;
  179                 struct ucred *a_cred;
  180         } */ *ap = v;
  181         struct vnode *vp = ap->a_vp;
  182         struct uio *uio = ap->a_uio;
  183         struct filecore_node *ip = VTOI(vp);
  184         struct filecore_mnt *fcmp;
  185         struct buf *bp;
  186         daddr_t lbn, rablock;
  187         off_t diff;
  188         int error = 0;
  189         long size, n, on;
  190 
  191         if (uio->uio_resid == 0)
  192                 return (0);
  193         if (uio->uio_offset < 0)
  194                 return (EINVAL);
  195         if (uio->uio_offset >= ip->i_size)
  196                 return (0);
  197         ip->i_flag |= IN_ACCESS;
  198         fcmp = ip->i_mnt;
  199 
  200         if (vp->v_type == VREG) {
  201                 error = 0;
  202                 while (uio->uio_resid > 0) {
  203                         void *win;
  204                         vsize_t bytelen = MIN(ip->i_size - uio->uio_offset,
  205                                               uio->uio_resid);
  206 
  207                         if (bytelen == 0) {
  208                                 break;
  209                         }
  210                         win = ubc_alloc(&vp->v_uobj, uio->uio_offset,
  211                                         &bytelen, UBC_READ);
  212                         error = uiomove(win, bytelen, uio);
  213                         ubc_release(win, 0);
  214                         if (error) {
  215                                 break;
  216                         }
  217                 }
  218                 goto out;
  219         }
  220 
  221         do {
  222                 lbn = lblkno(fcmp, uio->uio_offset);
  223                 on = blkoff(fcmp, uio->uio_offset);
  224                 n = MIN(blksize(fcmp, ip, lbn) - on, uio->uio_resid);
  225                 diff = (off_t)ip->i_size - uio->uio_offset;
  226                 if (diff <= 0)
  227                         return (0);
  228                 if (diff < n)
  229                         n = diff;
  230                 size = blksize(fcmp, ip, lbn);
  231                 rablock = lbn + 1;
  232                 if (ip->i_dirent.attr & FILECORE_ATTR_DIR) {
  233                         error = filecore_dbread(ip, &bp);
  234                         on = uio->uio_offset;
  235                         n = MIN(FILECORE_DIR_SIZE - on, uio->uio_resid);
  236                         size = FILECORE_DIR_SIZE;
  237                 } else {
  238                         error = bread(vp, lbn, size, NOCRED, &bp);
  239 #ifdef FILECORE_DEBUG_BR
  240                         printf("bread(%p, %x, %ld, CRED, %p)=%d\n",
  241                             vp, lbn, size, bp, error);
  242 #endif
  243                 }
  244                 n = MIN(n, size - bp->b_resid);
  245                 if (error) {
  246 #ifdef FILECORE_DEBUG_BR
  247                         printf("brelse(%p) vn1\n", bp);
  248 #endif
  249                         brelse(bp);
  250                         return (error);
  251                 }
  252 
  253                 error = uiomove(bp->b_data + on, (int)n, uio);
  254 #ifdef FILECORE_DEBUG_BR
  255                 printf("brelse(%p) vn2\n", bp);
  256 #endif
  257                 brelse(bp);
  258         } while (error == 0 && uio->uio_resid > 0 && n != 0);
  259 
  260 out:
  261         return (error);
  262 }
  263 
  264 /*
  265  * Vnode op for readdir
  266  */
  267 int
  268 filecore_readdir(v)
  269         void *v;
  270 {
  271         struct vop_readdir_args /* {
  272                 struct vnode *a_vp;
  273                 struct uio *a_uio;
  274                 struct ucred *a_cred;
  275                 int *a_eofflag;
  276                 off_t **a_cookies;
  277                 int *a_ncookies;
  278         } */ *ap = v;
  279         struct uio *uio = ap->a_uio;
  280         struct vnode *vdp = ap->a_vp;
  281         struct filecore_node *dp;
  282         struct filecore_mnt *fcmp;
  283         struct buf *bp = NULL;
  284         struct dirent de;
  285         struct filecore_direntry *dep = NULL;
  286         int error = 0;
  287         off_t *cookies = NULL;
  288         int ncookies = 0;
  289         int i;
  290         off_t uiooff;
  291 
  292         dp = VTOI(vdp);
  293 
  294         if ((dp->i_dirent.attr & FILECORE_ATTR_DIR) == 0)
  295                 return (ENOTDIR);
  296 
  297         if (uio->uio_offset % FILECORE_DIRENT_SIZE != 0)
  298                 return (EINVAL);
  299         i = uio->uio_offset / FILECORE_DIRENT_SIZE;
  300         uiooff = uio->uio_offset;
  301 
  302         *ap->a_eofflag = 0;
  303         fcmp = dp->i_mnt;
  304 
  305         error = filecore_dbread(dp, &bp);
  306         if (error) {
  307                 brelse(bp);
  308                 return error;
  309         }
  310 
  311         if (ap->a_ncookies == NULL)
  312                 cookies = NULL;
  313         else {
  314                 *ap->a_ncookies = 0;
  315                 ncookies = uio->uio_resid/16;
  316                 cookies = malloc(ncookies * sizeof(off_t), M_TEMP, M_WAITOK);
  317         }
  318 
  319         for (; ; i++) {
  320                 switch (i) {
  321                 case 0:
  322                         /* Fake the '.' entry */
  323                         de.d_fileno = dp->i_number;
  324                         de.d_type = DT_DIR;
  325                         de.d_namlen = 1;
  326                         strlcpy(de.d_name, ".", sizeof(de.d_name));
  327                         break;
  328                 case 1:
  329                         /* Fake the '..' entry */
  330                         de.d_fileno = filecore_getparent(dp);
  331                         de.d_type = DT_DIR;
  332                         de.d_namlen = 2;
  333                         strlcpy(de.d_name, "..", sizeof(de.d_name));
  334                         break;
  335                 default:
  336                         de.d_fileno = dp->i_dirent.addr +
  337                                         ((i - 2) << FILECORE_INO_INDEX);
  338                         dep = fcdirentry(bp->b_data, i - 2);
  339                         if (dep->attr & FILECORE_ATTR_DIR)
  340                                 de.d_type = DT_DIR;
  341                         else
  342                                 de.d_type = DT_REG;
  343                         if (filecore_fn2unix(dep->name, de.d_name,
  344                             &de.d_namlen)) {
  345                                 *ap->a_eofflag = 1;
  346                                 goto out;
  347                         }
  348                         break;
  349                 }
  350                 de.d_reclen = DIRENT_SIZE(&de);
  351                 if (uio->uio_resid < de.d_reclen)
  352                         goto out;
  353                 error = uiomove((caddr_t) &de, de.d_reclen, uio);
  354                 if (error)
  355                         goto out;
  356                 uiooff += FILECORE_DIRENT_SIZE;
  357 
  358                 if (cookies) {
  359                         *cookies++ = i*FILECORE_DIRENT_SIZE;
  360                         (*ap->a_ncookies)++;
  361                         if (--ncookies == 0) goto out;
  362                 }
  363         }
  364 out:
  365         if (cookies) {
  366                 *ap->a_cookies = cookies;
  367                 if (error) {
  368                         free(cookies, M_TEMP);
  369                         *ap->a_ncookies = 0;
  370                         *ap->a_cookies = NULL;
  371                 }
  372         }
  373         uio->uio_offset = uiooff;
  374 
  375 #ifdef FILECORE_DEBUG_BR
  376         printf("brelse(%p) vn3\n", bp);
  377 #endif
  378         brelse (bp);
  379 
  380         return (error);
  381 }
  382 
  383 /*
  384  * Return target name of a symbolic link
  385  * Shouldn't we get the parent vnode and read the data from there?
  386  * This could eventually result in deadlocks in filecore_lookup.
  387  * But otherwise the block read here is in the block buffer two times.
  388  */
  389 int
  390 filecore_readlink(v)
  391         void *v;
  392 {
  393 #if 0
  394         struct vop_readlink_args /* {
  395                 struct vnode *a_vp;
  396                 struct uio *a_uio;
  397                 struct ucred *a_cred;
  398         } */ *ap = v;
  399 #endif
  400 
  401         return (EINVAL);
  402 }
  403 
  404 int
  405 filecore_link(v)
  406         void *v;
  407 {
  408         struct vop_link_args /* {
  409                 struct vnode *a_dvp;
  410                 struct vnode *a_vp;
  411                 struct componentname *a_cnp;
  412         } */ *ap = v;
  413 
  414         VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
  415         vput(ap->a_dvp);
  416         return (EROFS);
  417 }
  418 
  419 int
  420 filecore_symlink(v)
  421         void *v;
  422 {
  423         struct vop_symlink_args /* {
  424                 struct vnode *a_dvp;
  425                 struct vnode **a_vpp;
  426                 struct componentname *a_cnp;
  427                 struct vattr *a_vap;
  428                 char *a_target;
  429         } */ *ap = v;
  430 
  431         VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
  432         vput(ap->a_dvp);
  433         return (EROFS);
  434 }
  435 
  436 /*
  437  * Calculate the logical to physical mapping if not done already,
  438  * then call the device strategy routine.
  439  */
  440 int
  441 filecore_strategy(v)
  442         void *v;
  443 {
  444         struct vop_strategy_args /* {
  445                 struct vnode *a_vp;
  446                 struct buf *a_bp;
  447         } */ *ap = v;
  448         struct buf *bp = ap->a_bp;
  449         struct vnode *vp = ap->a_vp;
  450         struct filecore_node *ip;
  451         int error;
  452 
  453         ip = VTOI(vp);
  454         if (bp->b_blkno == bp->b_lblkno) {
  455                 error = VOP_BMAP(vp, bp->b_lblkno, NULL, &bp->b_blkno, NULL);
  456                 if (error) {
  457                         bp->b_error = error;
  458                         bp->b_flags |= B_ERROR;
  459                         biodone(bp);
  460                         return (error);
  461                 }
  462                 if ((long)bp->b_blkno == -1)
  463                         clrbuf(bp);
  464         }
  465         if ((long)bp->b_blkno == -1) {
  466                 biodone(bp);
  467                 return (0);
  468         }
  469         vp = ip->i_devvp;
  470         return (VOP_STRATEGY(vp, bp));
  471 }
  472 
  473 /*
  474  * Print out the contents of an inode.
  475  */
  476 /*ARGSUSED*/
  477 int
  478 filecore_print(v)
  479         void *v;
  480 {
  481 
  482         printf("tag VT_FILECORE, filecore vnode\n");
  483         return (0);
  484 }
  485 
  486 /*
  487  * Return POSIX pathconf information applicable to filecore filesystems.
  488  */
  489 int
  490 filecore_pathconf(v)
  491         void *v;
  492 {
  493         struct vop_pathconf_args /* {
  494                 struct vnode *a_vp;
  495                 int a_name;
  496                 register_t *a_retval;
  497         } */ *ap = v;
  498         switch (ap->a_name) {
  499         case _PC_LINK_MAX:
  500                 *ap->a_retval = 1;
  501                 return (0);
  502         case _PC_NAME_MAX:
  503                 *ap->a_retval = 10;
  504                 return (0);
  505         case _PC_PATH_MAX:
  506                 *ap->a_retval = 256;
  507                 return (0);
  508         case _PC_CHOWN_RESTRICTED:
  509                 *ap->a_retval = 1;
  510                 return (0);
  511         case _PC_NO_TRUNC:
  512                 *ap->a_retval = 1;
  513                 return (0);
  514         case _PC_SYNC_IO:
  515                 *ap->a_retval = 1;
  516                 return (0);
  517         case _PC_FILESIZEBITS:
  518                 *ap->a_retval = 32;
  519                 return (0);
  520         default:
  521                 return (EINVAL);
  522         }
  523         /* NOTREACHED */
  524 }
  525 
  526 /*
  527  * Global vfs data structures for isofs
  528  */
  529 #define filecore_create genfs_eopnotsupp
  530 #define filecore_mknod  genfs_eopnotsupp
  531 #define filecore_write  genfs_eopnotsupp
  532 #define filecore_setattr        genfs_eopnotsupp
  533 #define filecore_lease_check    genfs_lease_check
  534 #define filecore_fcntl  genfs_fcntl
  535 #define filecore_ioctl  genfs_enoioctl
  536 #define filecore_fsync  genfs_nullop
  537 #define filecore_remove genfs_eopnotsupp
  538 #define filecore_rename genfs_eopnotsupp
  539 #define filecore_mkdir  genfs_eopnotsupp
  540 #define filecore_rmdir  genfs_eopnotsupp
  541 #define filecore_advlock        genfs_eopnotsupp
  542 #define filecore_valloc genfs_eopnotsupp
  543 #define filecore_vfree  genfs_nullop
  544 #define filecore_truncate       genfs_eopnotsupp
  545 #define filecore_update genfs_nullop
  546 #define filecore_bwrite genfs_eopnotsupp
  547 #define filecore_revoke genfs_revoke
  548 #define filecore_blkatoff       genfs_eopnotsupp
  549 
  550 /*
  551  * Global vfs data structures for filecore
  552  */
  553 int (**filecore_vnodeop_p) __P((void *));
  554 const struct vnodeopv_entry_desc filecore_vnodeop_entries[] = {
  555         { &vop_default_desc, vn_default_error },
  556         { &vop_lookup_desc, filecore_lookup },          /* lookup */
  557         { &vop_create_desc, filecore_create },          /* create */
  558         { &vop_mknod_desc, filecore_mknod },            /* mknod */
  559         { &vop_open_desc, filecore_open },              /* open */
  560         { &vop_close_desc, filecore_close },            /* close */
  561         { &vop_access_desc, filecore_access },          /* access */
  562         { &vop_getattr_desc, filecore_getattr },        /* getattr */
  563         { &vop_setattr_desc, filecore_setattr },        /* setattr */
  564         { &vop_read_desc, filecore_read },              /* read */
  565         { &vop_write_desc, filecore_write },            /* write */
  566         { &vop_lease_desc, filecore_lease_check },      /* lease */
  567         { &vop_fcntl_desc, filecore_fcntl },            /* fcntl */
  568         { &vop_ioctl_desc, filecore_ioctl },            /* ioctl */
  569         { &vop_poll_desc, filecore_poll },              /* poll */
  570         { &vop_kqfilter_desc, genfs_kqfilter },         /* kqfilter */
  571         { &vop_revoke_desc, filecore_revoke },          /* revoke */
  572         { &vop_mmap_desc, filecore_mmap },              /* mmap */
  573         { &vop_fsync_desc, filecore_fsync },            /* fsync */
  574         { &vop_seek_desc, filecore_seek },              /* seek */
  575         { &vop_remove_desc, filecore_remove },          /* remove */
  576         { &vop_link_desc, filecore_link },              /* link */
  577         { &vop_rename_desc, filecore_rename },          /* rename */
  578         { &vop_mkdir_desc, filecore_mkdir },            /* mkdir */
  579         { &vop_rmdir_desc, filecore_rmdir },            /* rmdir */
  580         { &vop_symlink_desc, filecore_symlink },        /* symlink */
  581         { &vop_readdir_desc, filecore_readdir },        /* readdir */
  582         { &vop_readlink_desc, filecore_readlink },      /* readlink */
  583         { &vop_abortop_desc, filecore_abortop },        /* abortop */
  584         { &vop_inactive_desc, filecore_inactive },      /* inactive */
  585         { &vop_reclaim_desc, filecore_reclaim },        /* reclaim */
  586         { &vop_lock_desc, genfs_lock },                 /* lock */
  587         { &vop_unlock_desc, genfs_unlock },             /* unlock */
  588         { &vop_bmap_desc, filecore_bmap },              /* bmap */
  589         { &vop_strategy_desc, filecore_strategy },      /* strategy */
  590         { &vop_print_desc, filecore_print },            /* print */
  591         { &vop_islocked_desc, genfs_islocked },         /* islocked */
  592         { &vop_pathconf_desc, filecore_pathconf },      /* pathconf */
  593         { &vop_advlock_desc, filecore_advlock },        /* advlock */
  594         { &vop_blkatoff_desc, filecore_blkatoff },      /* blkatoff */
  595         { &vop_valloc_desc, filecore_valloc },          /* valloc */
  596         { &vop_vfree_desc, filecore_vfree },            /* vfree */
  597         { &vop_truncate_desc, filecore_truncate },      /* truncate */
  598         { &vop_update_desc, filecore_update },          /* update */
  599         { &vop_bwrite_desc, vn_bwrite },                /* bwrite */
  600         { &vop_getpages_desc, genfs_getpages },         /* getpages */
  601         { &vop_putpages_desc, genfs_putpages },         /* putpages */
  602         { NULL, NULL }
  603 };
  604 const struct vnodeopv_desc filecore_vnodeop_opv_desc =
  605         { &filecore_vnodeop_p, filecore_vnodeop_entries };

Cache object: 90d1f5ec7b6d6dcd6f81ee92002a0416


[ 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.