1/*-
2 * SPDX-License-Identifier: (BSD-2-Clause AND BSD-3-Clause)
3 *
4 * Copyright (c) 2002 Networks Associates Technology, Inc.
5 * All rights reserved.
6 *
7 * This software was developed for the FreeBSD Project by Marshall
8 * Kirk McKusick and Network Associates Laboratories, the Security
9 * Research Division of Network Associates, Inc. under DARPA/SPAWAR
10 * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS
11 * research program
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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 * Copyright (c) 1982, 1989, 1993
35 *	The Regents of the University of California.  All rights reserved.
36 * (c) UNIX System Laboratories, Inc.
37 * All or some portions of this file are derived from material licensed
38 * to the University of California by American Telephone and Telegraph
39 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
40 * the permission of UNIX System Laboratories, Inc.
41 *
42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions
44 * are met:
45 * 1. Redistributions of source code must retain the above copyright
46 *    notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright
48 *    notice, this list of conditions and the following disclaimer in the
49 *    documentation and/or other materials provided with the distribution.
50 * 3. The names of the authors may not be used to endorse or promote
51 *    products derived from this software without specific prior written
52 *    permission.
53 *
54 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 * SUCH DAMAGE.
65 */
66
67#ifndef _UFS_UFS_DINODE_H_
68#define	_UFS_UFS_DINODE_H_
69
70/*
71 * The root inode is the root of the filesystem.  Inode 0 can't be used for
72 * normal purposes and historically bad blocks were linked to inode 1, thus
73 * the root inode is 2.  (Inode 1 is no longer used for this purpose, however
74 * numerous dump tapes make this assumption, so we are stuck with it).
75 */
76#define	UFS_ROOTINO	((ino_t)2)
77
78/*
79 * The Whiteout inode# is a dummy non-zero inode number which will
80 * never be allocated to a real file.  It is used as a place holder
81 * in the directory entry which has been tagged as a DT_WHT entry.
82 * See the comments about UFS_ROOTINO above.
83 */
84#define	UFS_WINO	((ino_t)1)
85
86/*
87 * The size of physical and logical block numbers and time fields in UFS.
88 */
89typedef	int32_t	ufs1_daddr_t;
90typedef	int64_t	ufs2_daddr_t;
91typedef int64_t ufs_lbn_t;
92typedef int64_t ufs_time_t;
93
94/* File permissions. */
95#define	IEXEC		0000100		/* Executable. */
96#define	IWRITE		0000200		/* Writeable. */
97#define	IREAD		0000400		/* Readable. */
98#define	ISVTX		0001000		/* Sticky bit. */
99#define	ISGID		0002000		/* Set-gid. */
100#define	ISUID		0004000		/* Set-uid. */
101
102/* File types. */
103#define	IFMT		0170000		/* Mask of file type. */
104#define	IFIFO		0010000		/* Named pipe (fifo). */
105#define	IFCHR		0020000		/* Character device. */
106#define	IFDIR		0040000		/* Directory file. */
107#define	IFBLK		0060000		/* Block device. */
108#define	IFREG		0100000		/* Regular file. */
109#define	IFLNK		0120000		/* Symbolic link. */
110#define	IFSOCK		0140000		/* UNIX domain socket. */
111#define	IFWHT		0160000		/* Whiteout. */
112
113/*
114 * A dinode contains all the meta-data associated with a UFS2 file.
115 * This structure defines the on-disk format of a dinode. Since
116 * this structure describes an on-disk structure, all its fields
117 * are defined by types with precise widths.
118 */
119
120#define	UFS_NXADDR	2		/* External addresses in inode. */
121#define	UFS_NDADDR	12		/* Direct addresses in inode. */
122#define	UFS_NIADDR	3		/* Indirect addresses in inode. */
123
124struct ufs2_dinode {
125	uint16_t	di_mode;	/*   0: IFMT, permissions; see below. */
126	uint16_t	di_nlink;	/*   2: File link count. */
127	uint32_t	di_uid;		/*   4: File owner. */
128	uint32_t	di_gid;		/*   8: File group. */
129	uint32_t	di_blksize;	/*  12: Inode blocksize. */
130	uint64_t	di_size;	/*  16: File byte count. */
131	uint64_t	di_blocks;	/*  24: Blocks actually held. */
132	ufs_time_t	di_atime;	/*  32: Last access time. */
133	ufs_time_t	di_mtime;	/*  40: Last modified time. */
134	ufs_time_t	di_ctime;	/*  48: Last inode change time. */
135	ufs_time_t	di_birthtime;	/*  56: Inode creation time. */
136	int32_t		di_mtimensec;	/*  64: Last modified time. */
137	int32_t		di_atimensec;	/*  68: Last access time. */
138	int32_t		di_ctimensec;	/*  72: Last inode change time. */
139	int32_t		di_birthnsec;	/*  76: Inode creation time. */
140	uint32_t	di_gen;		/*  80: Generation number. */
141	uint32_t	di_kernflags;	/*  84: Kernel flags. */
142	uint32_t	di_flags;	/*  88: Status flags (chflags). */
143	uint32_t	di_extsize;	/*  92: External attributes size. */
144	ufs2_daddr_t	di_extb[UFS_NXADDR];/* 96: External attributes block. */
145	union {
146		struct {
147			ufs2_daddr_t	di_db /* 112: Direct disk blocks. */
148			    [UFS_NDADDR];
149			ufs2_daddr_t	di_ib /* 208: Indirect disk blocks. */
150			    [UFS_NIADDR];
151		};
152		char	di_shortlink	/* 112: Embedded symbolic link. */
153		    [(UFS_NDADDR + UFS_NIADDR) * sizeof(ufs2_daddr_t)];
154	};
155	uint64_t	di_modrev;	/* 232: i_modrev for NFSv4 */
156	union {
157		uint32_t di_freelink;	/* 240: SUJ: Next unlinked inode. */
158		uint32_t di_dirdepth;	/* 240: IFDIR: depth from root dir */
159	};
160	uint32_t	di_ckhash;	/* 244: if CK_INODE, its check-hash */
161	uint32_t	di_spare[2];	/* 248: Reserved; currently unused */
162};
163
164/*
165 * The di_db fields may be overlaid with other information for
166 * file types that do not have associated disk storage. Block
167 * and character devices overlay the first data block with their
168 * dev_t value. Short symbolic links place their path in the
169 * di_db area.
170 */
171#define	di_rdev di_db[0]
172
173/*
174 * A UFS1 dinode contains all the meta-data associated with a UFS1 file.
175 * This structure defines the on-disk format of a UFS1 dinode. Since
176 * this structure describes an on-disk structure, all its fields
177 * are defined by types with precise widths.
178 */
179struct ufs1_dinode {
180	uint16_t	di_mode;	/*   0: IFMT, permissions; see below. */
181	uint16_t	di_nlink;	/*   2: File link count. */
182	union {
183		uint32_t di_freelink;	/*   4: SUJ: Next unlinked inode. */
184		uint32_t di_dirdepth;	/*   4: IFDIR: depth from root dir */
185	};
186	uint64_t	di_size;	/*   8: File byte count. */
187	int32_t		di_atime;	/*  16: Last access time. */
188	int32_t		di_atimensec;	/*  20: Last access time. */
189	int32_t		di_mtime;	/*  24: Last modified time. */
190	int32_t		di_mtimensec;	/*  28: Last modified time. */
191	int32_t		di_ctime;	/*  32: Last inode change time. */
192	int32_t		di_ctimensec;	/*  36: Last inode change time. */
193	union {
194		struct {
195			ufs1_daddr_t	di_db /*  40: Direct disk blocks. */
196			    [UFS_NDADDR];
197			ufs1_daddr_t	di_ib /*  88: Indirect disk blocks. */
198			    [UFS_NIADDR];
199		};
200		char	di_shortlink	/*  40: Embedded symbolic link. */
201		    [(UFS_NDADDR + UFS_NIADDR) * sizeof(ufs1_daddr_t)];
202	};
203	uint32_t	di_flags;	/* 100: Status flags (chflags). */
204	uint32_t	di_blocks;	/* 104: Blocks actually held. */
205	uint32_t	di_gen;		/* 108: Generation number. */
206	uint32_t	di_uid;		/* 112: File owner. */
207	uint32_t	di_gid;		/* 116: File group. */
208	uint64_t	di_modrev;	/* 120: i_modrev for NFSv4 */
209};
210
211#define	UFS_LINK_MAX	65500	/* leave a few spare for special values */
212
213#endif /* _UFS_UFS_DINODE_H_ */
214