Annotation of src/sys/nfs/nfsnode.h, Revision 1.26
1.26 ! thorpej 1: /* $NetBSD: nfsnode.h,v 1.25 1998/03/01 02:24:29 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)
1.16 fvdl 97: * If this structure exceeds 256 bytes (it is currently 256 using 4.4BSD-Lite
98: * type definitions), file handles of > 32 bytes should probably be split out
99: * into a separate MALLOC()'d data structure. (Reduce the size of nfsfh_t by
1.23 christos 100: * changing the definition in nfsproto.h of NFS_SMALLFH.)
1.16 fvdl 101: * NB: Hopefully the current order of the fields is such that everything will
102: * be well aligned and, therefore, tightly packed.
1.1 mycroft 103: */
104: struct nfsnode {
1.16 fvdl 105: u_quad_t n_size; /* Current size of file */
106: u_quad_t n_brev; /* Modify rev when cached */
107: u_quad_t n_lrev; /* Modify rev for lease */
1.24 fvdl 108: union {
109: struct timespec nf_mtim;
110: off_t nd_direof; /* Dir. EOF offset cache */
111: } n_un2;
1.16 fvdl 112: union {
113: struct timespec nf_atim; /* Special file times */
114: nfsuint64 nd_cookieverf; /* Cookie verifier (dir only) */
115: } n_un1;
116: union {
117: struct sillyrename *nf_silly; /* Ptr to silly rename struct */
1.21 fvdl 118: struct nfsdirhashhead *nd_dircache;
1.16 fvdl 119: } n_un3;
1.24 fvdl 120: LIST_ENTRY(nfsnode) n_hash; /* Hash chain */
121: CIRCLEQ_ENTRY(nfsnode) n_timer; /* Nqnfs timer chain */
122: struct nfsdirchainhead n_dirchain; /* Chain of dir cookies */
123: nfsfh_t *n_fhp; /* NFS File Handle */
124: struct vattr *n_vattr; /* Vnode attribute cache */
125: struct vnode *n_vnode; /* associated vnode */
126: struct lockf *n_lockf; /* Locking record of file */
127: unsigned *n_dirgens; /* 32<->64bit xlate gen. no. */
128: time_t n_attrstamp; /* Attr. cache timestamp */
129: time_t n_mtime; /* Prev modify time. */
130: time_t n_ctime; /* Prev create time. */
131: time_t n_nctime; /* Last neg cache entry (dir) */
132: time_t n_expiry; /* Lease expiry time */
133: daddr_t n_dblkno; /* To keep faked dir blkno */
134: unsigned n_dircachesize; /* Size of dir cookie cache */
135: int n_error; /* Save write error value */
1.16 fvdl 136: short n_fhsize; /* size in bytes, of fh */
137: short n_flag; /* Flag for locking.. */
138: nfsfh_t n_fh; /* Small File Handle */
1.1 mycroft 139: };
140:
1.16 fvdl 141: #define n_atim n_un1.nf_atim
142: #define n_mtim n_un2.nf_mtim
143: #define n_sillyrename n_un3.nf_silly
144: #define n_cookieverf n_un1.nd_cookieverf
145: #define n_direofoffset n_un2.nd_direof
1.21 fvdl 146: #define n_dircache n_un3.nd_dircache
1.16 fvdl 147:
1.10 mycroft 148: /*
149: * Flags for n_flag
150: */
151: #define NFLUSHWANT 0x0001 /* Want wakeup from a flush in prog. */
152: #define NFLUSHINPROG 0x0002 /* Avoid multiple calls to vinvalbuf() */
153: #define NMODIFIED 0x0004 /* Might have a modified buffer in bio */
154: #define NWRITEERR 0x0008 /* Flag write errors so close will know */
155: #define NQNFSNONCACHE 0x0020 /* Non-cachable lease */
156: #define NQNFSWRITE 0x0040 /* Write lease */
157: #define NQNFSEVICTED 0x0080 /* Has been evicted */
158: #define NACC 0x0100 /* Special file accessed */
159: #define NUPD 0x0200 /* Special file updated */
160: #define NCHG 0x0400 /* Special file times changed */
1.1 mycroft 161:
162: /*
163: * Convert between nfsnode pointers and vnode pointers
164: */
165: #define VTONFS(vp) ((struct nfsnode *)(vp)->v_data)
166: #define NFSTOV(np) ((struct vnode *)(np)->n_vnode)
1.10 mycroft 167:
1.1 mycroft 168: /*
1.10 mycroft 169: * Queue head for nfsiod's
1.1 mycroft 170: */
1.19 thorpej 171: extern struct proc *nfs_iodwant[NFS_MAXASYNCDAEMON];
172: extern struct nfsmount *nfs_iodmount[NFS_MAXASYNCDAEMON];
1.1 mycroft 173:
1.14 jtc 174: #ifdef _KERNEL
1.1 mycroft 175: /*
176: * Prototypes for NFS vnode operations
177: */
1.17 mycroft 178: int nfs_lookup __P((void *));
179: int nfs_create __P((void *));
180: int nfs_mknod __P((void *));
181: int nfs_open __P((void *));
182: int nfs_close __P((void *));
183: int nfsspec_close __P((void *));
184: int nfsfifo_close __P((void *));
185: int nfs_access __P((void *));
186: int nfsspec_access __P((void *));
187: int nfs_getattr __P((void *));
188: int nfs_setattr __P((void *));
189: int nfs_read __P((void *));
190: int nfs_write __P((void *));
191: #define nfs_lease_check genfs_nullop
192: int nfsspec_read __P((void *));
193: int nfsspec_write __P((void *));
194: int nfsfifo_read __P((void *));
195: int nfsfifo_write __P((void *));
196: #define nfs_ioctl ((int (*) __P((void *)))enoioctl)
1.18 mycroft 197: #define nfs_poll genfs_poll
1.25 fvdl 198: #define nfs_revoke genfs_revoke
1.17 mycroft 199: int nfs_mmap __P((void *));
200: int nfs_fsync __P((void *));
1.20 kleink 201: #define nfs_seek genfs_seek
1.17 mycroft 202: int nfs_remove __P((void *));
203: int nfs_link __P((void *));
204: int nfs_rename __P((void *));
205: int nfs_mkdir __P((void *));
206: int nfs_rmdir __P((void *));
207: int nfs_symlink __P((void *));
208: int nfs_readdir __P((void *));
209: int nfs_readlink __P((void *));
210: #define nfs_abortop genfs_abortop
211: int nfs_inactive __P((void *));
212: int nfs_reclaim __P((void *));
1.25 fvdl 213: #define nfs_lock genfs_nolock
214: #define nfs_unlock genfs_nounlock
215: #define nfs_islocked genfs_noislocked
1.17 mycroft 216: int nfs_bmap __P((void *));
217: int nfs_strategy __P((void *));
218: int nfs_print __P((void *));
219: int nfs_pathconf __P((void *));
220: int nfs_advlock __P((void *));
221: #define nfs_blkatoff genfs_eopnotsupp
222: int nfs_bwrite __P((void *));
223: int nfs_vget __P((struct mount *, ino_t, struct vnode **));
224: #define nfs_valloc genfs_eopnotsupp
225: #define nfs_reallocblks genfs_eopnotsupp
226: #define nfs_vfree genfs_nullop
227: int nfs_truncate __P((void *));
228: int nfs_update __P((void *));
1.15 christos 229:
230: extern int (**nfsv2_vnodeop_p) __P((void *));
231:
1.14 jtc 232: #endif /* _KERNEL */
1.16 fvdl 233:
234: #endif
CVSweb <webmaster@jp.NetBSD.org>