Annotation of src/sys/nfs/nfsnode.h, Revision 1.29
1.29 ! simonb 1: /* $NetBSD: nfsnode.h,v 1.28 1999/11/29 23:34:01 fvdl Exp $ */
1.11 cgd 2:
1.1 mycroft 3: /*
1.10 mycroft 4: * Copyright (c) 1989, 1993
5: * The Regents of the University of California. All rights reserved.
1.1 mycroft 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. All advertising materials mentioning features or use of this software
19: * must display the following acknowledgement:
20: * This product includes software developed by the University of
21: * California, Berkeley and its contributors.
22: * 4. Neither the name of the University nor the names of its contributors
23: * may be used to endorse or promote products derived from this software
24: * without specific prior written permission.
25: *
26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36: * SUCH DAMAGE.
37: *
1.16 fvdl 38: * @(#)nfsnode.h 8.9 (Berkeley) 5/14/95
1.1 mycroft 39: */
40:
1.16 fvdl 41:
42: #ifndef _NFS_NFSNODE_H_
43: #define _NFS_NFSNODE_H_
44:
45: #ifndef _NFS_NFS_H_
46: #include <nfs/nfs.h>
47: #endif
48:
1.10 mycroft 49: /*
50: * Silly rename structure that hangs off the nfsnode until the name
51: * can be removed by nfs_inactive()
52: */
53: struct sillyrename {
54: struct ucred *s_cred;
55: struct vnode *s_dvp;
56: long s_namlen;
57: char s_name[20];
58: };
1.1 mycroft 59:
60: /*
1.21 fvdl 61: * Definitions for the directory cache. Because directory cookies
62: * are an opaque 64 bit entity, we need to provide some sort of
63: * mapping between cookies and logical blocknumbers. Also,
64: * we should store the cookies from the server somewhere,
65: * to be able to satisfy VOP_READDIR requests for cookies.
66: * We can't store the cookies in the dirent structure, as some
67: * other systems.
68: *
69: * Each offset is hashed into a per-nfsnode hashtable. An entry
70: * found therein contains information about the (faked up)
71: * logical blocknumber, and also a pointer to a buffer where
72: * the cookies are stored.
1.16 fvdl 73: */
74:
1.21 fvdl 75: extern u_long nfsdirhashmask;
76:
77: LIST_HEAD(nfsdirhashhead, nfsdircache);
78: TAILQ_HEAD(nfsdirchainhead, nfsdircache);
79:
80: struct nfsdircache {
1.24 fvdl 81: off_t dc_cookie; /* Own offset (key) */
82: off_t dc_blkcookie; /* Offset of block we're in */
83: LIST_ENTRY(nfsdircache) dc_hash; /* Hash chain */
84: TAILQ_ENTRY(nfsdircache) dc_chain; /* Least recently entered chn */
85: u_int32_t dc_cookie32; /* Key for 64<->32 xlate case */
86: daddr_t dc_blkno; /* Number of block we're in */
87: int dc_entry; /* Entry number within block */
1.16 fvdl 88: };
89:
1.21 fvdl 90:
1.16 fvdl 91: /*
1.1 mycroft 92: * The nfsnode is the nfs equivalent to ufs's inode. Any similarity
93: * is purely coincidental.
94: * There is a unique nfsnode allocated for each active file,
95: * each current directory, each mounted-on file, text file, and the root.
96: * An nfsnode is 'named' by its file handle. (nget/nfs_node.c)
97: */
98: struct nfsnode {
1.16 fvdl 99: u_quad_t n_size; /* Current size of file */
100: u_quad_t n_brev; /* Modify rev when cached */
101: u_quad_t n_lrev; /* Modify rev for lease */
1.24 fvdl 102: union {
103: struct timespec nf_mtim;
104: off_t nd_direof; /* Dir. EOF offset cache */
105: } n_un2;
1.16 fvdl 106: union {
107: struct timespec nf_atim; /* Special file times */
108: nfsuint64 nd_cookieverf; /* Cookie verifier (dir only) */
109: } n_un1;
110: union {
111: struct sillyrename *nf_silly; /* Ptr to silly rename struct */
1.21 fvdl 112: struct nfsdirhashhead *nd_dircache;
1.16 fvdl 113: } n_un3;
1.24 fvdl 114: LIST_ENTRY(nfsnode) n_hash; /* Hash chain */
115: CIRCLEQ_ENTRY(nfsnode) n_timer; /* Nqnfs timer chain */
116: struct nfsdirchainhead n_dirchain; /* Chain of dir cookies */
117: nfsfh_t *n_fhp; /* NFS File Handle */
118: struct vattr *n_vattr; /* Vnode attribute cache */
119: struct vnode *n_vnode; /* associated vnode */
120: struct lockf *n_lockf; /* Locking record of file */
121: unsigned *n_dirgens; /* 32<->64bit xlate gen. no. */
122: time_t n_attrstamp; /* Attr. cache timestamp */
123: time_t n_mtime; /* Prev modify time. */
124: time_t n_ctime; /* Prev create time. */
125: time_t n_nctime; /* Last neg cache entry (dir) */
126: time_t n_expiry; /* Lease expiry time */
127: daddr_t n_dblkno; /* To keep faked dir blkno */
128: unsigned n_dircachesize; /* Size of dir cookie cache */
129: int n_error; /* Save write error value */
1.16 fvdl 130: short n_fhsize; /* size in bytes, of fh */
131: short n_flag; /* Flag for locking.. */
132: nfsfh_t n_fh; /* Small File Handle */
1.28 fvdl 133: time_t n_accstamp; /* Access cache timestamp */
134: uid_t n_accuid; /* Last access requester */
135: int n_accmode; /* Mode last requested */
136: int n_accerror; /* Error last returned */
1.1 mycroft 137: };
138:
1.16 fvdl 139: #define n_atim n_un1.nf_atim
140: #define n_mtim n_un2.nf_mtim
141: #define n_sillyrename n_un3.nf_silly
142: #define n_cookieverf n_un1.nd_cookieverf
143: #define n_direofoffset n_un2.nd_direof
1.21 fvdl 144: #define n_dircache n_un3.nd_dircache
1.16 fvdl 145:
1.10 mycroft 146: /*
147: * Flags for n_flag
148: */
149: #define NFLUSHWANT 0x0001 /* Want wakeup from a flush in prog. */
150: #define NFLUSHINPROG 0x0002 /* Avoid multiple calls to vinvalbuf() */
151: #define NMODIFIED 0x0004 /* Might have a modified buffer in bio */
152: #define NWRITEERR 0x0008 /* Flag write errors so close will know */
153: #define NQNFSNONCACHE 0x0020 /* Non-cachable lease */
154: #define NQNFSWRITE 0x0040 /* Write lease */
155: #define NQNFSEVICTED 0x0080 /* Has been evicted */
156: #define NACC 0x0100 /* Special file accessed */
157: #define NUPD 0x0200 /* Special file updated */
158: #define NCHG 0x0400 /* Special file times changed */
1.1 mycroft 159:
160: /*
161: * Convert between nfsnode pointers and vnode pointers
162: */
163: #define VTONFS(vp) ((struct nfsnode *)(vp)->v_data)
164: #define NFSTOV(np) ((struct vnode *)(np)->n_vnode)
1.10 mycroft 165:
1.1 mycroft 166: /*
1.10 mycroft 167: * Queue head for nfsiod's
1.1 mycroft 168: */
1.19 thorpej 169: extern struct proc *nfs_iodwant[NFS_MAXASYNCDAEMON];
170: extern struct nfsmount *nfs_iodmount[NFS_MAXASYNCDAEMON];
1.1 mycroft 171:
1.14 jtc 172: #ifdef _KERNEL
1.1 mycroft 173: /*
174: * Prototypes for NFS vnode operations
175: */
1.17 mycroft 176: int nfs_lookup __P((void *));
177: int nfs_create __P((void *));
178: int nfs_mknod __P((void *));
179: int nfs_open __P((void *));
180: int nfs_close __P((void *));
181: int nfsspec_close __P((void *));
182: int nfsfifo_close __P((void *));
183: int nfs_access __P((void *));
184: int nfsspec_access __P((void *));
185: int nfs_getattr __P((void *));
186: int nfs_setattr __P((void *));
187: int nfs_read __P((void *));
188: int nfs_write __P((void *));
189: #define nfs_lease_check genfs_nullop
190: int nfsspec_read __P((void *));
191: int nfsspec_write __P((void *));
192: int nfsfifo_read __P((void *));
193: int nfsfifo_write __P((void *));
1.27 matthias 194: #define nfs_ioctl genfs_enoioctl
1.18 mycroft 195: #define nfs_poll genfs_poll
1.25 fvdl 196: #define nfs_revoke genfs_revoke
1.17 mycroft 197: int nfs_mmap __P((void *));
198: int nfs_fsync __P((void *));
1.20 kleink 199: #define nfs_seek genfs_seek
1.17 mycroft 200: int nfs_remove __P((void *));
201: int nfs_link __P((void *));
202: int nfs_rename __P((void *));
203: int nfs_mkdir __P((void *));
204: int nfs_rmdir __P((void *));
205: int nfs_symlink __P((void *));
206: int nfs_readdir __P((void *));
207: int nfs_readlink __P((void *));
208: #define nfs_abortop genfs_abortop
209: int nfs_inactive __P((void *));
210: int nfs_reclaim __P((void *));
1.25 fvdl 211: #define nfs_lock genfs_nolock
212: #define nfs_unlock genfs_nounlock
213: #define nfs_islocked genfs_noislocked
1.17 mycroft 214: int nfs_bmap __P((void *));
215: int nfs_strategy __P((void *));
216: int nfs_print __P((void *));
217: int nfs_pathconf __P((void *));
218: int nfs_advlock __P((void *));
219: #define nfs_blkatoff genfs_eopnotsupp
220: int nfs_bwrite __P((void *));
221: #define nfs_valloc genfs_eopnotsupp
222: #define nfs_reallocblks genfs_eopnotsupp
223: #define nfs_vfree genfs_nullop
224: int nfs_truncate __P((void *));
225: int nfs_update __P((void *));
1.15 christos 226:
227: extern int (**nfsv2_vnodeop_p) __P((void *));
228:
1.14 jtc 229: #endif /* _KERNEL */
1.16 fvdl 230:
231: #endif
CVSweb <webmaster@jp.NetBSD.org>