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.46.2.4 2005/01/11 06:41:38 jmc 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         struct  ucred *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 extern u_long nfsdirhashmask;
   74 
   75 LIST_HEAD(nfsdirhashhead, nfsdircache);
   76 TAILQ_HEAD(nfsdirchainhead, nfsdircache);
   77 
   78 struct nfsdircache {
   79         off_t           dc_cookie;              /* Own offset (key) */
   80         off_t           dc_blkcookie;           /* Offset of block we're in */
   81         LIST_ENTRY(nfsdircache) dc_hash;        /* Hash chain */
   82         TAILQ_ENTRY(nfsdircache) dc_chain;      /* Least recently entered chn */
   83         daddr_t         dc_blkno;               /* Number of block we're in */
   84         u_int32_t       dc_cookie32;            /* Key for 64<->32 xlate case */
   85         int             dc_entry;               /* Entry number within block */
   86         int             dc_refcnt;              /* Reference count */
   87         int             dc_flags;               /* NFSDC_ flags */
   88 };
   89 
   90 #define NFSDC_INVALID   1
   91 
   92 
   93 /*
   94  * The nfsnode is the nfs equivalent to ufs's inode. Any similarity
   95  * is purely coincidental.
   96  * There is a unique nfsnode allocated for each active file,
   97  * each current directory, each mounted-on file, text file, and the root.
   98  * An nfsnode is 'named' by its file handle. (nget/nfs_node.c)
   99  */
  100 
  101 struct nfsnode_spec {
  102         struct timespec nspec_mtim;     /* local mtime */
  103         struct timespec nspec_atim;     /* local atime */
  104 };
  105 
  106 struct nfsnode_reg {
  107         off_t nreg_pushedlo;            /* 1st blk in commited range */
  108         off_t nreg_pushedhi;            /* Last block in range */
  109         off_t nreg_pushlo;              /* 1st block in commit range */
  110         off_t nreg_pushhi;              /* Last block in range */
  111         struct lock nreg_commitlock;    /* Serialize commits XXX */
  112         int nreg_commitflags;
  113         int nreg_error;                 /* Save write error value */
  114 };
  115 
  116 struct nfsnode_dir {
  117         off_t ndir_direof;              /* EOF offset cache */
  118         nfsuint64 ndir_cookieverf;      /* Cookie verifier */
  119         daddr_t ndir_dblkno;            /* faked dir blkno */
  120         struct nfsdirhashhead *ndir_dircache; /* offset -> cache hash heads */
  121         struct nfsdirchainhead ndir_dirchain; /* Chain of dir cookies */
  122         struct timespec ndir_nctime;    /* Last name cache entry */
  123         unsigned ndir_dircachesize;     /* Size of dir cookie cache */
  124 };
  125 
  126 struct nfsnode {
  127         struct genfs_node       n_gnode;
  128         u_quad_t                n_size;         /* Current size of file */
  129 
  130         union {
  131                 struct nfsnode_spec     nu_spec;
  132                 struct nfsnode_reg      nu_reg;
  133                 struct nfsnode_dir      nu_dir;
  134         } n_un1;
  135 
  136 #define n_mtim          n_un1.nu_spec.nspec_mtim
  137 #define n_atim          n_un1.nu_spec.nspec_atim
  138 
  139 #define n_pushedlo      n_un1.nu_reg.nreg_pushedlo
  140 #define n_pushedhi      n_un1.nu_reg.nreg_pushedhi
  141 #define n_pushlo        n_un1.nu_reg.nreg_pushlo
  142 #define n_pushhi        n_un1.nu_reg.nreg_pushhi
  143 #define n_commitlock    n_un1.nu_reg.nreg_commitlock
  144 #define n_commitflags   n_un1.nu_reg.nreg_commitflags
  145 #define n_error         n_un1.nu_reg.nreg_error
  146 
  147 #define n_direofoffset  n_un1.nu_dir.ndir_direof
  148 #define n_cookieverf    n_un1.nu_dir.ndir_cookieverf
  149 #define n_dblkno        n_un1.nu_dir.ndir_dblkno
  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         struct ucred            *n_rcred;
  179         struct ucred            *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 
  213 /*
  214  * Convert between nfsnode pointers and vnode pointers
  215  */
  216 #define VTONFS(vp)      ((struct nfsnode *)(vp)->v_data)
  217 #define NFSTOV(np)      ((np)->n_vnode)
  218 
  219 /*
  220  * Per-nfsiod datas
  221  */
  222 struct nfs_iod {
  223         struct simplelock nid_slock;
  224         struct proc *nid_proc;
  225         struct proc *nid_want;
  226         struct nfsmount *nid_mount;
  227 };
  228 extern struct nfs_iod nfs_asyncdaemon[NFS_MAXASYNCDAEMON];
  229 
  230 #ifdef _KERNEL
  231 /*
  232  * Prototypes for NFS vnode operations
  233  */
  234 int     nfs_lookup      __P((void *));
  235 int     nfs_create      __P((void *));
  236 int     nfs_mknod       __P((void *));
  237 int     nfs_open        __P((void *));
  238 int     nfs_close       __P((void *));
  239 int     nfsspec_close   __P((void *));
  240 int     nfsfifo_close   __P((void *));
  241 int     nfs_access      __P((void *));
  242 int     nfsspec_access  __P((void *));
  243 int     nfs_getattr     __P((void *));
  244 int     nfs_setattr     __P((void *));
  245 int     nfs_read        __P((void *));
  246 int     nfs_write       __P((void *));
  247 #define nfs_lease_check genfs_nullop
  248 int     nfsspec_read    __P((void *));
  249 int     nfsspec_write   __P((void *));
  250 int     nfsfifo_read    __P((void *));
  251 int     nfsfifo_write   __P((void *));
  252 #define nfs_ioctl       genfs_enoioctl
  253 #define nfs_poll        genfs_poll
  254 #define nfs_revoke      genfs_revoke
  255 #define nfs_mmap        genfs_mmap
  256 int     nfs_fsync       __P((void *));
  257 #define nfs_seek        genfs_seek
  258 int     nfs_remove      __P((void *));
  259 int     nfs_link        __P((void *));
  260 int     nfs_rename      __P((void *));
  261 int     nfs_mkdir       __P((void *));
  262 int     nfs_rmdir       __P((void *));
  263 int     nfs_symlink     __P((void *));
  264 int     nfs_readdir     __P((void *));
  265 int     nfs_readlink    __P((void *));
  266 #define nfs_abortop     genfs_abortop
  267 int     nfs_inactive    __P((void *));
  268 int     nfs_reclaim     __P((void *));
  269 #define nfs_lock        genfs_lock
  270 int nfs_unlock  __P((void *));
  271 #define nfs_islocked    genfs_islocked
  272 int     nfs_bmap        __P((void *));
  273 int     nfs_strategy    __P((void *));
  274 int     nfs_print       __P((void *));
  275 int     nfs_pathconf    __P((void *));
  276 int     nfs_advlock     __P((void *));
  277 #define nfs_blkatoff    genfs_eopnotsupp
  278 int     nfs_bwrite      __P((void *));
  279 #define nfs_valloc      genfs_eopnotsupp
  280 #define nfs_reallocblks genfs_eopnotsupp
  281 #define nfs_vfree       genfs_nullop
  282 int     nfs_truncate    __P((void *));
  283 int     nfs_update      __P((void *));
  284 int     nfs_getpages    __P((void *));
  285 int     nfs_putpages    __P((void *));
  286 int     nfs_gop_write(struct vnode *, struct vm_page **, int, int);
  287 int     nfs_kqfilter    __P((void *));
  288 
  289 extern int (**nfsv2_vnodeop_p) __P((void *));
  290 
  291 #define NFS_INVALIDATE_ATTRCACHE(np)    (np)->n_attrstamp = 0
  292 
  293 #endif /* _KERNEL */
  294 
  295 #endif

Cache object: 12d4cdba0d8b7a688b3e4e55b20f3faa


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