xref: /original-bsd/sys/ufs/ufs/inode.h (revision 0d869007)
1 /*
2  * Copyright (c) 1982, 1989, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * %sccs.include.redist.c%
11  *
12  *	@(#)inode.h	8.7 (Berkeley) 04/27/95
13  */
14 
15 #include <ufs/ufs/dinode.h>
16 
17 /*
18  * The inode is used to describe each active (or recently active) file in the
19  * UFS filesystem. It is composed of two types of information. The first part
20  * is the information that is needed only while the file is active (such as
21  * the identity of the file and linkage to speed its lookup). The second part
22  * is * the permanent meta-data associated with the file which is read in
23  * from the permanent dinode from long term storage when the file becomes
24  * active, and is put back when the file is no longer being used.
25  */
26 struct inode {
27 	LIST_ENTRY(inode) i_hash;/* Hash chain. */
28 	struct	vnode  *i_vnode;/* Vnode associated with this inode. */
29 	struct	vnode  *i_devvp;/* Vnode for block I/O. */
30 	u_int32_t i_flag;	/* flags, see below */
31 	dev_t	  i_dev;	/* Device associated with the inode. */
32 	ino_t	  i_number;	/* The identity of the inode. */
33 
34 	union {			/* Associated filesystem. */
35 		struct	fs *fs;		/* FFS */
36 		struct	lfs *lfs;	/* LFS */
37 	} inode_u;
38 #define	i_fs	inode_u.fs
39 #define	i_lfs	inode_u.lfs
40 
41 	struct	 dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */
42 	u_quad_t i_modrev;	/* Revision level for NFS lease. */
43 	struct	 lockf *i_lockf;/* Head of byte-level lock list. */
44 	pid_t	 i_lockholder;	/* DEBUG: holder of inode lock. */
45 	pid_t	 i_lockwaiter;	/* DEBUG: latest blocked for inode lock. */
46 	/*
47 	 * Side effects; used during directory lookup.
48 	 */
49 	int32_t	  i_count;	/* Size of free slot in directory. */
50 	doff_t	  i_endoff;	/* End of useful stuff in directory. */
51 	doff_t	  i_diroff;	/* Offset in dir, where we found last entry. */
52 	doff_t	  i_offset;	/* Offset of free space in directory. */
53 	ino_t	  i_ino;	/* Inode number of found directory. */
54 	u_int32_t i_reclen;	/* Size of found directory entry. */
55 	/*
56 	 * The on-disk dinode itself.
57 	 */
58 	struct	dinode i_din;	/* 128 bytes of the on-disk dinode. */
59 };
60 
61 #define	i_atime		i_din.di_atime
62 #define	i_atimensec	i_din.di_atimensec
63 #define	i_blocks	i_din.di_blocks
64 #define	i_ctime		i_din.di_ctime
65 #define	i_ctimensec	i_din.di_ctimensec
66 #define	i_db		i_din.di_db
67 #define	i_flags		i_din.di_flags
68 #define	i_gen		i_din.di_gen
69 #define	i_gid		i_din.di_gid
70 #define	i_ib		i_din.di_ib
71 #define	i_mode		i_din.di_mode
72 #define	i_mtime		i_din.di_mtime
73 #define	i_mtimensec	i_din.di_mtimensec
74 #define	i_nlink		i_din.di_nlink
75 #define	i_rdev		i_din.di_rdev
76 #define	i_shortlink	i_din.di_shortlink
77 #define	i_size		i_din.di_size
78 #define	i_uid		i_din.di_uid
79 
80 /* These flags are kept in i_flag. */
81 #define	IN_ACCESS	0x0001		/* Access time update request. */
82 #define	IN_CHANGE	0x0002		/* Inode change time update request. */
83 #define	IN_EXLOCK	0x0004		/* File has exclusive lock. */
84 #define	IN_LOCKED	0x0008		/* Inode lock. */
85 #define	IN_LWAIT	0x0010		/* Process waiting on file lock. */
86 #define	IN_MODIFIED	0x0020		/* Inode has been modified. */
87 #define	IN_RENAME	0x0040		/* Inode is being renamed. */
88 #define	IN_SHLOCK	0x0080		/* File has shared lock. */
89 #define	IN_UPDATE	0x0100		/* Modification time update request. */
90 #define	IN_WANTED	0x0200		/* Inode is wanted by a process. */
91 
92 #ifdef KERNEL
93 /*
94  * Structure used to pass around logical block paths generated by
95  * ufs_getlbns and used by truncate and bmap code.
96  */
97 struct indir {
98 	ufs_daddr_t in_lbn;		/* Logical block number. */
99 	int	in_off;			/* Offset in buffer. */
100 	int	in_exists;		/* Flag if the block exists. */
101 };
102 
103 /* Convert between inode pointers and vnode pointers. */
104 #define VTOI(vp)	((struct inode *)(vp)->v_data)
105 #define ITOV(ip)	((ip)->i_vnode)
106 
107 #define	ITIMES(ip, t1, t2) {						\
108 	if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) {	\
109 		(ip)->i_flag |= IN_MODIFIED;				\
110 		if ((ip)->i_flag & IN_ACCESS)				\
111 			(ip)->i_atime = (t1)->tv_sec;			\
112 		if ((ip)->i_flag & IN_UPDATE) {				\
113 			(ip)->i_mtime = (t2)->tv_sec;			\
114 			(ip)->i_modrev++;				\
115 		}							\
116 		if ((ip)->i_flag & IN_CHANGE)				\
117 			(ip)->i_ctime = time.tv_sec;			\
118 		(ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE);	\
119 	}								\
120 }
121 
122 /* This overlays the fid structure (see mount.h). */
123 struct ufid {
124 	u_int16_t ufid_len;	/* Length of structure. */
125 	u_int16_t ufid_pad;	/* Force 32-bit alignment. */
126 	ino_t	  ufid_ino;	/* File number (ino). */
127 	int32_t	  ufid_gen;	/* Generation number. */
128 };
129 #endif /* KERNEL */
130