xref: /386bsd/usr/src/kernel/include/fs/ufs_inode.h (revision a2142627)
1 /*
2  * Copyright (c) 1982, 1989 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *	@(#)inode.h	7.17 (Berkeley) 5/8/91
34  */
35 
36 #include "ufs_dinode.h"
37 
38 /*
39  * The inode is used to describe each active (or recently active)
40  * file in the UFS filesystem. It is composed of two types of
41  * information. The first part is the information that is needed
42  * only while the file is active (such as the identity of the file
43  * and linkage to speed its lookup). The second part is the
44  * permannent meta-data associated with the file which is read
45  * in from the permanent dinode from long term storage when the
46  * file becomes active, and is put back when the file is no longer
47  * being used.
48  */
49 struct inode {
50 	struct	inode *i_chain[2]; /* hash chain, MUST be first */
51 	struct	vnode *i_vnode;	/* vnode associated with this inode */
52 	struct	vnode *i_devvp;	/* vnode for block I/O */
53 	u_long	i_flag;		/* see below */
54 	dev_t	i_dev;		/* device where inode resides */
55 	ino_t	i_number;	/* the identity of the inode */
56 	struct	fs *i_fs;	/* filesystem associated with this inode */
57 	struct	dquot *i_dquot[MAXQUOTAS]; /* pointer to dquot structures */
58 	struct	lockf *i_lockf;	/* head of byte-level lock list */
59 	long	i_diroff;	/* offset in dir, where we found last entry */
60 	off_t	i_endoff;	/* end of useful stuff in directory */
61 	long	i_spare0;
62 	long	i_spare1;
63 	struct	dinode i_din;	/* the on-disk dinode */
64 };
65 
66 #define	i_mode		i_din.di_mode
67 #define	i_nlink		i_din.di_nlink
68 #define	i_uid		i_din.di_uid
69 #define	i_gid		i_din.di_gid
70 #if BYTE_ORDER == LITTLE_ENDIAN || defined(tahoe) /* ugh! -- must be fixed */
71 #define	i_size		i_din.di_qsize.val[0]
72 #else /* BYTE_ORDER == BIG_ENDIAN */
73 #define	i_size		i_din.di_qsize.val[1]
74 #endif
75 #define	i_db		i_din.di_db
76 #define	i_ib		i_din.di_ib
77 #define	i_atime		i_din.di_atime
78 #define	i_mtime		i_din.di_mtime
79 #define	i_ctime		i_din.di_ctime
80 #define i_blocks	i_din.di_blocks
81 #define	i_rdev		i_din.di_db[0]
82 #define i_flags		i_din.di_flags
83 #define i_gen		i_din.di_gen
84 #define	i_forw		i_chain[0]
85 #define	i_back		i_chain[1]
86 
87 /* flags */
88 #define	ILOCKED		0x0001		/* inode is locked */
89 #define	IWANT		0x0002		/* some process waiting on lock */
90 #define	IRENAME		0x0004		/* inode is being renamed */
91 #define	IUPD		0x0010		/* file has been modified */
92 #define	IACC		0x0020		/* inode access time to be updated */
93 #define	ICHG		0x0040		/* inode has been changed */
94 #define	IMOD		0x0080		/* inode has been modified */
95 #define	ISHLOCK		0x0100		/* file has shared lock */
96 #define	IEXLOCK		0x0200		/* file has exclusive lock */
97 #define	ILWAIT		0x0400		/* someone waiting on file lock */
98 
99 #ifdef KERNEL
100 /*
101  * Convert between inode pointers and vnode pointers
102  */
103 #define VTOI(vp)	((struct inode *)(vp)->v_data)
104 #define ITOV(ip)	((ip)->i_vnode)
105 
106 /*
107  * Convert between vnode types and inode formats
108  */
109 extern enum vtype	iftovt_tab[];
110 extern int		vttoif_tab[];
111 #define IFTOVT(mode)	(iftovt_tab[((mode) & IFMT) >> 12])
112 #define VTTOIF(indx)	(vttoif_tab[(int)(indx)])
113 
114 #define MAKEIMODE(indx, mode)	(int)(VTTOIF(indx) | (mode))
115 
116 u_long	nextgennumber;		/* next generation number to assign */
117 
118 extern ino_t	dirpref();
119 
120 /*
121  * Lock and unlock inodes.
122  */
123 #ifdef notdef
124 #define	ILOCK(ip) { \
125 	while ((ip)->i_flag & ILOCKED) { \
126 		(ip)->i_flag |= IWANT; \
127 		(void) tsleep((caddr_t)(ip), PINOD, "ilock", 0); \
128 	} \
129 	(ip)->i_flag |= ILOCKED; \
130 }
131 
132 #define	IUNLOCK(ip) { \
133 	(ip)->i_flag &= ~ILOCKED; \
134 	if ((ip)->i_flag&IWANT) { \
135 		(ip)->i_flag &= ~IWANT; \
136 		wakeup((caddr_t)(ip)); \
137 	} \
138 }
139 #else
140 #define ILOCK(ip)	ilock(ip)
141 #define IUNLOCK(ip)	iunlock(ip)
142 #endif
143 
144 #define	IUPDAT(ip, t1, t2, waitfor) { \
145 	if (ip->i_flag&(IUPD|IACC|ICHG|IMOD)) \
146 		(void) iupdat(ip, t1, t2, waitfor); \
147 }
148 
149 #define	ITIMES(ip, t1, t2) { \
150 	if ((ip)->i_flag&(IUPD|IACC|ICHG)) { \
151 		(ip)->i_flag |= IMOD; \
152 		if ((ip)->i_flag&IACC) \
153 			(ip)->i_atime = (t1)->tv_sec; \
154 		if ((ip)->i_flag&IUPD) \
155 			(ip)->i_mtime = (t2)->tv_sec; \
156 		if ((ip)->i_flag&ICHG) \
157 			(ip)->i_ctime = time.tv_sec; \
158 		(ip)->i_flag &= ~(IACC|IUPD|ICHG); \
159 	} \
160 }
161 
162 /*
163  * This overlays the fid sturcture (see mount.h)
164  */
165 struct ufid {
166 	u_short	ufid_len;	/* length of structure */
167 	u_short	ufid_pad;	/* force long alignment */
168 	ino_t	ufid_ino;	/* file number (ino) */
169 	long	ufid_gen;	/* generation number */
170 };
171 
172 /*
173  * Prototypes for UFS vnode operations
174  */
175 int ufs_lookup __P((struct vnode *vp, struct nameidata *ndp, struct proc *p));
176 int ufs_create __P((struct nameidata *ndp, struct vattr *vap, struct proc *p));
177 int ufs_mknod __P((struct nameidata *ndp, struct vattr *vap, struct ucred *cred,
178 	struct proc *p));
179 int ufs_open __P((struct vnode *vp, int mode, struct ucred *cred,
180 	struct proc *p));
181 int ufs_close __P((struct vnode *vp, int fflag, struct ucred *cred,
182 	struct proc *p));
183 int ufs_access __P((struct vnode *vp, int mode, struct ucred *cred,
184 	struct proc *p));
185 int ufs_getattr __P((struct vnode *vp, struct vattr *vap, struct ucred *cred,
186 	struct proc *p));
187 int ufs_setattr __P((struct vnode *vp, struct vattr *vap, struct ucred *cred,
188 	struct proc *p));
189 int ufs_read __P((struct vnode *vp, struct uio *uio, int ioflag,
190 	struct ucred *cred));
191 int ufs_write __P((struct vnode *vp, struct uio *uio, int ioflag,
192 	struct ucred *cred));
193 int ufs_ioctl __P((struct vnode *vp, int command, caddr_t data, int fflag,
194 	struct ucred *cred, struct proc *p));
195 int ufs_select __P((struct vnode *vp, int which, int fflags, struct ucred *cred,
196 	struct proc *p));
197 int ufs_mmap __P((struct vnode *vp, int fflags, struct ucred *cred,
198 	struct proc *p));
199 int ufs_fsync __P((struct vnode *vp, int fflags, struct ucred *cred,
200 	int waitfor, struct proc *p));
201 int ufs_seek __P((struct vnode *vp, off_t oldoff, off_t newoff,
202 	struct ucred *cred));
203 int ufs_remove __P((struct nameidata *ndp, struct proc *p));
204 int ufs_link __P((struct vnode *vp, struct nameidata *ndp, struct proc *p));
205 int ufs_rename __P((struct nameidata *fndp, struct nameidata *tdnp,
206 	struct proc *p));
207 int ufs_mkdir __P((struct nameidata *ndp, struct vattr *vap, struct proc *p));
208 int ufs_rmdir __P((struct nameidata *ndp, struct proc *p));
209 int ufs_symlink __P((struct nameidata *ndp, struct vattr *vap, char *target,
210 	struct proc *p));
211 int ufs_readdir __P((struct vnode *vp, struct uio *uio, struct ucred *cred,
212 	int *eofflagp));
213 int ufs_readlink __P((struct vnode *vp, struct uio *uio, struct ucred *cred));
214 int ufs_abortop __P((struct nameidata *ndp));
215 int ufs_inactive __P((struct vnode *vp, struct proc *p));
216 int ufs_reclaim __P((struct vnode *vp));
217 int ufs_lock __P((struct vnode *vp));
218 int ufs_unlock __P((struct vnode *vp));
219 int ufs_bmap __P((struct vnode *vp, daddr_t bn, struct vnode **vpp,
220 	daddr_t *bnp));
221 int ufs_strategy __P((struct buf *bp));
222 int ufs_print __P((struct vnode *vp));
223 int ufs_islocked __P((struct vnode *vp));
224 int ufs_advlock __P((struct vnode *vp, caddr_t id, int op, struct flock *fl,
225 	int flags));
226 #endif /* KERNEL */
227