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


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