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/nfs/nfsnode.h

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: nfsnode.h,v 1.68.4.2 2009/02/02 03:12:05 snj Exp $    */
    2 
    3 /*
    4  * Copyright (c) 1989, 1993
    5  *      The Regents of the University of California.  All rights reserved.
    6  *
    7  * This code is derived from software contributed to Berkeley by
    8  * Rick Macklem at The University of Guelph.
    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 University nor the names of its contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  *
   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.
   33  *
   34  *      @(#)nfsnode.h   8.9 (Berkeley) 5/14/95
   35  */
   36 
   37 
   38 #ifndef _NFS_NFSNODE_H_
   39 #define _NFS_NFSNODE_H_
   40 
   41 #include <sys/condvar.h>
   42 #include <sys/mutex.h>
   43 #include <sys/rb.h>
   44 
   45 #ifndef _NFS_NFS_H_
   46 #include <nfs/nfs.h>
   47 #endif
   48 #include <miscfs/genfs/genfs.h>
   49 #include <miscfs/genfs/genfs_node.h>
   50 
   51 /*
   52  * Definitions for the directory cache. Because directory cookies
   53  * are an opaque 64 bit entity, we need to provide some sort of
   54  * mapping between cookies and logical blocknumbers. Also,
   55  * we should store the cookies from the server somewhere,
   56  * to be able to satisfy VOP_READDIR requests for cookies.
   57  * We can't store the cookies in the dirent structure, as some
   58  * other systems.
   59  *
   60  * Each offset is hashed into a per-nfsnode hashtable. An entry
   61  * found therein contains information about the (faked up)
   62  * logical blocknumber, and also a pointer to a buffer where
   63  * the cookies are stored.
   64  */
   65 
   66 
   67 LIST_HEAD(nfsdirhashhead, nfsdircache);
   68 TAILQ_HEAD(nfsdirchainhead, nfsdircache);
   69 
   70 struct nfsdircache {
   71         off_t           dc_cookie;              /* Own offset (key) */
   72         off_t           dc_blkcookie;           /* Offset of block we're in */
   73         LIST_ENTRY(nfsdircache) dc_hash;        /* Hash chain */
   74         TAILQ_ENTRY(nfsdircache) dc_chain;      /* Least recently entered chn */
   75         u_int32_t       dc_cookie32;            /* Key for 64<->32 xlate case */
   76         int             dc_entry;               /* Entry number within block */
   77         int             dc_refcnt;              /* Reference count */
   78         int             dc_flags;               /* NFSDC_ flags */
   79 };
   80 
   81 #define NFSDC_INVALID   1
   82 
   83 /*
   84  * NFSDC_BLKNO: get buffer cache index
   85  */
   86 #define NFSDC_BLKNO(ndp)        ((daddr_t)(ndp)->dc_blkcookie)
   87 
   88 /*
   89  * The nfsnode is the nfs equivalent to ufs's inode. Any similarity
   90  * is purely coincidental.
   91  * There is a unique nfsnode allocated for each active file,
   92  * each current directory, each mounted-on file, text file, and the root.
   93  * An nfsnode is 'named' by its file handle. (nget/nfs_node.c)
   94  */
   95 
   96 struct nfsnode_spec {
   97         struct timespec nspec_mtim;     /* local mtime */
   98         struct timespec nspec_atim;     /* local atime */
   99 };
  100 
  101 struct nfsnode_reg {
  102         off_t nreg_pushedlo;            /* 1st blk in commited range */
  103         off_t nreg_pushedhi;            /* Last block in range */
  104         off_t nreg_pushlo;              /* 1st block in commit range */
  105         off_t nreg_pushhi;              /* Last block in range */
  106         kmutex_t nreg_commitlock;       /* Serialize commits XXX */
  107         int nreg_commitflags;
  108         int nreg_error;                 /* Save write error value */
  109 };
  110 
  111 struct nfsnode_dir {
  112         off_t ndir_direof;              /* EOF offset cache */
  113         nfsuint64 ndir_cookieverf;      /* Cookie verifier */
  114         struct nfsdirhashhead *ndir_dircache; /* offset -> cache hash heads */
  115         struct nfsdirchainhead ndir_dirchain; /* Chain of dir cookies */
  116         struct timespec ndir_nctime;    /* Last name cache entry */
  117         unsigned ndir_dircachesize;     /* Size of dir cookie cache */
  118 };
  119 
  120 struct nfsnode {
  121         struct genfs_node       n_gnode;
  122         u_quad_t                n_size;         /* Current size of file */
  123 
  124         union {
  125                 struct nfsnode_spec     nu_spec;
  126                 struct nfsnode_reg      nu_reg;
  127                 struct nfsnode_dir      nu_dir;
  128         } n_un1;
  129 
  130 #define n_mtim          n_un1.nu_spec.nspec_mtim
  131 #define n_atim          n_un1.nu_spec.nspec_atim
  132 
  133 #define n_pushedlo      n_un1.nu_reg.nreg_pushedlo
  134 #define n_pushedhi      n_un1.nu_reg.nreg_pushedhi
  135 #define n_pushlo        n_un1.nu_reg.nreg_pushlo
  136 #define n_pushhi        n_un1.nu_reg.nreg_pushhi
  137 #define n_commitlock    n_un1.nu_reg.nreg_commitlock
  138 #define n_commitflags   n_un1.nu_reg.nreg_commitflags
  139 #define n_error         n_un1.nu_reg.nreg_error
  140 
  141 #define n_direofoffset  n_un1.nu_dir.ndir_direof
  142 #define n_cookieverf    n_un1.nu_dir.ndir_cookieverf
  143 #define n_dircache      n_un1.nu_dir.ndir_dircache
  144 #define n_dirchain      n_un1.nu_dir.ndir_dirchain
  145 #define n_nctime        n_un1.nu_dir.ndir_nctime
  146 #define n_dircachesize  n_un1.nu_dir.ndir_dircachesize
  147 
  148         union {
  149                 struct sillyrename *nf_silly;   /* !VDIR: silly rename struct */
  150                 unsigned *ndir_dirgens;         /* 32<->64bit xlate gen. no. */
  151         } n_un2;
  152 
  153 #define n_sillyrename   n_un2.nf_silly
  154 #define n_dirgens       n_un2.ndir_dirgens
  155 
  156         struct rb_node          n_rbnode;       /* red/black node */
  157         nfsfh_t                 *n_fhp;         /* NFS File Handle */
  158         struct vattr            *n_vattr;       /* Vnode attribute cache */
  159         struct vnode            *n_vnode;       /* associated vnode */
  160         struct lockf            *n_lockf;       /* Locking record of file */
  161         time_t                  n_attrstamp;    /* Attr. cache timestamp */
  162         struct timespec         n_mtime;        /* Prev modify time. */
  163         time_t                  n_ctime;        /* Prev create time. */
  164         short                   n_fhsize;       /* size in bytes, of fh */
  165         short                   n_flag;         /* Flag for locking.. */
  166         nfsfh_t                 n_fh;           /* Small File Handle */
  167         time_t                  n_accstamp;     /* Access cache timestamp */
  168         uid_t                   n_accuid;       /* Last access requester */
  169         int                     n_accmode;      /* Mode last requested */
  170         int                     n_accerror;     /* Error last returned */
  171         kauth_cred_t            n_rcred;
  172         kauth_cred_t            n_wcred;
  173 };
  174 
  175 /*
  176  * Values for n_commitflags
  177  */
  178 #define NFS_COMMIT_PUSH_VALID   0x0001          /* push range valid */
  179 #define NFS_COMMIT_PUSHED_VALID 0x0002          /* pushed range valid */
  180 
  181 /*
  182  * Flags for n_flag
  183  */
  184 #define NFLUSHWANT      0x0001  /* Want wakeup from a flush in prog. */
  185 #define NFLUSHINPROG    0x0002  /* Avoid multiple calls to vinvalbuf() */
  186 #define NMODIFIED       0x0004  /* Might have a modified buffer in bio */
  187 #define NWRITEERR       0x0008  /* Flag write errors so close will know */
  188 #define NACC            0x0100  /* Special file accessed */
  189 #define NUPD            0x0200  /* Special file updated */
  190 #define NCHG            0x0400  /* Special file times changed */
  191 #define NTRUNCDELAYED   0x1000  /* Should be truncated later;
  192                                    implies stale cache */
  193 #define NREMOVED        0x2000  /* Has been removed */
  194 #define NUSEOPENCRED    0x4000  /* Try open cred first rather than owner's */
  195 #define NEOFVALID       0x8000  /* dir: n_direofoffset is valid */
  196 
  197 #define NFS_EOFVALID(ndp)       ((ndp)->n_flag & NEOFVALID)
  198 
  199 /*
  200  * Convert between nfsnode pointers and vnode pointers
  201  */
  202 #define VTONFS(vp)      ((struct nfsnode *)(vp)->v_data)
  203 #define NFSTOV(np)      ((np)->n_vnode)
  204 
  205 #ifdef _KERNEL
  206 
  207 #include <sys/workqueue.h>
  208 /*
  209  * Silly rename structure that hangs off the nfsnode until the name
  210  * can be removed by nfs_inactive()
  211  */
  212 struct sillyrename {
  213         struct work     s_work;
  214         kauth_cred_t    s_cred;
  215         struct  vnode *s_dvp;
  216         long    s_namlen;
  217         char    s_name[20];
  218 };
  219 
  220 /*
  221  * Per-nfsiod datas
  222  */
  223 struct nfs_iod {
  224         kmutex_t nid_lock;
  225         kcondvar_t nid_cv;
  226         LIST_ENTRY(nfs_iod) nid_idle;
  227         struct nfsmount *nid_mount;
  228         bool nid_exiting;
  229 
  230         LIST_ENTRY(nfs_iod) nid_all;
  231 };
  232 
  233 LIST_HEAD(nfs_iodlist, nfs_iod);
  234 extern kmutex_t nfs_iodlist_lock;
  235 extern struct nfs_iodlist nfs_iodlist_idle;
  236 extern struct nfs_iodlist nfs_iodlist_all;
  237 extern u_long nfsdirhashmask;
  238 
  239 /*
  240  * Prototypes for NFS vnode operations
  241  */
  242 int     nfs_lookup      __P((void *));
  243 int     nfs_create      __P((void *));
  244 int     nfs_mknod       __P((void *));
  245 int     nfs_open        __P((void *));
  246 int     nfs_close       __P((void *));
  247 int     nfsspec_close   __P((void *));
  248 int     nfsfifo_close   __P((void *));
  249 int     nfs_access      __P((void *));
  250 int     nfsspec_access  __P((void *));
  251 int     nfs_getattr     __P((void *));
  252 int     nfs_setattr     __P((void *));
  253 int     nfs_read        __P((void *));
  254 int     nfs_write       __P((void *));
  255 int     nfsspec_read    __P((void *));
  256 int     nfsspec_write   __P((void *));
  257 int     nfsfifo_read    __P((void *));
  258 int     nfsfifo_write   __P((void *));
  259 #define nfs_ioctl       genfs_enoioctl
  260 #define nfs_poll        genfs_poll
  261 #define nfs_revoke      genfs_revoke
  262 #define nfs_mmap        genfs_mmap
  263 int     nfs_fsync       __P((void *));
  264 #define nfs_seek        genfs_seek
  265 int     nfs_remove      __P((void *));
  266 int     nfs_link        __P((void *));
  267 int     nfs_rename      __P((void *));
  268 int     nfs_mkdir       __P((void *));
  269 int     nfs_rmdir       __P((void *));
  270 int     nfs_symlink     __P((void *));
  271 int     nfs_readdir     __P((void *));
  272 int     nfs_readlink    __P((void *));
  273 #define nfs_abortop     genfs_abortop
  274 int     nfs_inactive    __P((void *));
  275 int     nfs_reclaim     __P((void *));
  276 #define nfs_lock        genfs_lock
  277 int     nfs_unlock      __P((void *));
  278 #define nfs_islocked    genfs_islocked
  279 int     nfs_bmap        __P((void *));
  280 int     nfs_strategy    __P((void *));
  281 int     nfs_print       __P((void *));
  282 int     nfs_pathconf    __P((void *));
  283 int     nfs_advlock     __P((void *));
  284 int     nfs_getpages    __P((void *));
  285 int     nfs_putpages    __P((void *));
  286 int     nfs_kqfilter    __P((void *));
  287 
  288 extern int (**nfsv2_vnodeop_p) __P((void *));
  289 
  290 #define NFS_INVALIDATE_ATTRCACHE(np)    (np)->n_attrstamp = 0
  291 
  292 #endif /* _KERNEL */
  293 
  294 #endif

Cache object: 6559ec488999cc07c0cb41243b841bca


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