aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libfsimage/ufs/ufs.h
blob: 4e7c736c6d903fcaaf0707426b709fde79e1083b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _GRUB_UFS_H
#define _GRUB_UFS_H_

/* ufs specific constants */
#define UFS_SBLOCK	16
#define UFS_SBSIZE	8192
#define	UFS_MAGIC	0x011954
#define	ROOTINO		2	/* i number of all roots */
#define UFS_NDADDR	12	/* direct blocks */
#define	UFS_NIADDR	3	/* indirect blocks */
#define	MAXMNTLEN	512
#define	MAXCSBUFS	32
#define	MAXNAMELEN	256

/* file types */
#define	IFMT		0xf000
#define	IFREG		0x8000
#define	IFDIR		0x4000

typedef unsigned char	grub_uchar_t;
typedef	unsigned short	grub_ushort_t;
typedef	unsigned short	grub_o_mode_t;
typedef	unsigned short	grub_o_uid_t;
typedef	unsigned short	grub_o_gid_t;
typedef	uint32_t	grub_ino_t;
typedef	int32_t		grub_int32_t;
typedef	int32_t		grub_uid_t;
typedef	int32_t		grub_gid_t;
typedef uint32_t	grub_uint32_t;
typedef uint32_t	grub_daddr32_t;
typedef	uint32_t	grub_time32_t;
typedef struct { int val[2]; } grub_quad_t;

struct timeval32 {
  	grub_time32_t	tv_sec;
	grub_int32_t	tv_usec;
};

/*
 * Per cylinder group information; summarized in blocks allocated
 * from first cylinder group data blocks.  These blocks have to be
 * read in from fs_csaddr (size fs_cssize) in addition to the
 * super block.
 *
 * N.B. sizeof (struct csum) must be a power of two in order for
 * the ``fs_cs'' macro to work (see below).
 */
struct csum {
	grub_int32_t	cs_ndir;	/* number of directories */
	grub_int32_t	cs_nbfree;	/* number of free blocks */
	grub_int32_t	cs_nifree;	/* number of free inodes */
	grub_int32_t	cs_nffree;	/* number of free frags */
};

/* Ufs super block */
struct fs {
	grub_uint32_t	fs_link;	/* linked list of file systems */
	grub_uint32_t	fs_rolled;	/* logging only: fs fully rolled */
	grub_daddr32_t	fs_sblkno;	/* addr of super-block in filesys */
	grub_daddr32_t	fs_cblkno;	/* offset of cyl-block in filesys */
	grub_daddr32_t	fs_iblkno;	/* offset of inode-blocks in filesys */
	grub_daddr32_t	fs_dblkno;	/* offset of first data after cg */
	grub_int32_t	fs_cgoffset;	/* cylinder group offset in cylinder */
	grub_int32_t	fs_cgmask;	/* used to calc mod fs_ntrak */
	grub_time32_t	fs_time;	/* last time written */
	grub_int32_t	fs_size;	/* number of blocks in fs */
	grub_int32_t	fs_dsize;	/* number of data blocks in fs */
	grub_int32_t	fs_ncg;		/* number of cylinder groups */
	grub_int32_t	fs_bsize;	/* size of basic blocks in fs */
	grub_int32_t	fs_fsize;	/* size of frag blocks in fs */
	grub_int32_t	fs_frag;	/* number of frags in a block in fs */
	/* these are configuration parameters */
	grub_int32_t	fs_minfree;	/* minimum percentage of free blocks */
	grub_int32_t	fs_rotdelay;	/* num of ms for optimal next block */
	grub_int32_t	fs_rps;		/* disk revolutions per second */
	/* these fields can be computed from the others */
	grub_int32_t	fs_bmask;	/* ``blkoff'' calc of blk offsets */
	grub_int32_t	fs_fmask;	/* ``fragoff'' calc of frag offsets */
	grub_int32_t	fs_bshift;	/* ``lblkno'' calc of logical blkno */
	grub_int32_t	fs_fshift;	/* ``numfrags'' calc number of frags */
	/* these are configuration parameters */
	grub_int32_t	fs_maxcontig;	/* max number of contiguous blks */
	grub_int32_t	fs_maxbpg;	/* max number of blks per cyl group */
	/* these fields can be computed from the others */
	grub_int32_t	fs_fragshift;	/* block to frag shift */
	grub_int32_t	fs_fsbtodb;	/* fsbtodb and dbtofsb shift constant */
	grub_int32_t	fs_sbsize;	/* actual size of super block */
	grub_int32_t	fs_csmask;	/* csum block offset */
	grub_int32_t	fs_csshift;	/* csum block number */
	grub_int32_t	fs_nindir;	/* value of NINDIR */
	grub_int32_t	fs_inopb;	/* value of INOPB */
	grub_int32_t	fs_nspf;	/* value of NSPF */
	/* yet another configuration parameter */
	grub_int32_t	fs_optim;	/* optimization preference, see below */
	/* these fields are derived from the hardware */
	/* USL SVR4 compatibility */
	/*
	 *	* USL SVR4 compatibility
	 *
	 * There was a significant divergence here between Solaris and
	 * SVR4 for x86.	By swapping these two members in the superblock,
	 * we get read-only compatibility of SVR4 filesystems.	Otherwise
	 * there would be no compatibility.	This change was introduced
	 * during bootstrapping of Solaris on x86.	By making this ifdef'ed
	 * on byte order, we provide ongoing compatibility across all
	 * platforms with the same byte order, the highest compatibility
	 * that can be achieved.
	 */
	grub_int32_t	fs_state;	/* file system state time stamp */
	grub_int32_t	fs_si;		/* summary info state - lufs only */
	grub_int32_t	fs_trackskew;	/* sector 0 skew, per track */
	/* unique id for this filesystem (currently unused and unmaintained) */
	/* In 4.3 Tahoe this space is used by fs_headswitch and fs_trkseek */
	/* Neither of those fields is used in the Tahoe code right now but */
	/* there could be problems if they are.	*/
	grub_int32_t	fs_id[2];	/* file system id */
	/* sizes determined by number of cylinder groups and their sizes */
	grub_daddr32_t	fs_csaddr;	/* blk addr of cyl grp summary area */
	grub_int32_t	fs_cssize;	/* size of cyl grp summary area */
	grub_int32_t	fs_cgsize;	/* cylinder group size */
	/* these fields are derived from the hardware */
	grub_int32_t	fs_ntrak;	/* tracks per cylinder */
	grub_int32_t	fs_nsect;	/* sectors per track */
	grub_int32_t	fs_spc;		/* sectors per cylinder */
	/* this comes from the disk driver partitioning */
	grub_int32_t	fs_ncyl;	/* cylinders in file system */
	/* these fields can be computed from the others */
	grub_int32_t	fs_cpg;		/* cylinders per group */
	grub_int32_t	fs_ipg;		/* inodes per group */
	grub_int32_t	fs_fpg;		/* blocks per group * fs_frag */
	/* this data must be re-computed after crashes */
	struct csum	fs_cstotal;	/* cylinder summary information */
	/* these fields are cleared at mount time */
	char		fs_fmod;	/* super block modified flag */
	char		fs_clean;	/* file system state flag */
	char		fs_ronly;	/* mounted read-only flag */
	char		fs_flags;	/* largefiles flag, etc. */
	char		fs_fsmnt[MAXMNTLEN];	/* name mounted on */
	/* these fields retain the current block allocation info */
	grub_int32_t	fs_cgrotor;	/* last cg searched */
	/*
	 * The following used to be fs_csp[MAXCSBUFS]. It was not
	 * used anywhere except in old utilities.  We removed this
	 * in 5.6 and expect fs_u.fs_csp to be used instead.
	 * We no longer limit fs_cssize based on MAXCSBUFS.
	 */
	union {	/* fs_cs (csum) info */
		grub_uint32_t	fs_csp_pad[MAXCSBUFS];
		struct csum	*fs_csp;
	} fs_u;
	grub_int32_t	fs_cpc;		/* cyl per cycle in postbl */
	short		fs_opostbl[16][8];  /* old rotation block list head */
	grub_int32_t	fs_sparecon[51];    /* reserved for future constants */
	grub_int32_t	fs_version;	/* minor version of MTB ufs */
	grub_int32_t	fs_logbno;	/* block # of embedded log */
	grub_int32_t	fs_reclaim;	/* reclaim open, deleted files */
	grub_int32_t	fs_sparecon2;	/* reserved for future constant */
	/* USL SVR4 compatibility */
	grub_int32_t	fs_npsect;	/* # sectors/track including spares */
	grub_quad_t	fs_qbmask;	/* ~fs_bmask - for use with quad size */
	grub_quad_t	fs_qfmask;	/* ~fs_fmask - for use with quad size */
	grub_int32_t	fs_postblformat; /* fmt of positional layout tables */
	grub_int32_t	fs_nrpos;	/* number of rotaional positions */
	grub_int32_t	fs_postbloff;	/* (short) rotation block list head */
	grub_int32_t	fs_rotbloff;	/* (grub_uchar_t) blocks for each */
					/* rotation */
	grub_int32_t	fs_magic;	/* magic number */
	grub_uchar_t	fs_space[1];	/* list of blocks for each rotation */
	/* actually longer */
};

struct icommon {
	grub_o_mode_t	ic_smode;	/* 0: mode and type of file */
	short		ic_nlink;	/* 2: number of links to file */
	grub_o_uid_t	ic_suid;	/* 4: owner's user id */
	grub_o_gid_t	ic_sgid;	/* 6: owner's group id */
	grub_uint32_t	ic_sizelo;	/* 8: number of bytes in file */
	grub_uint32_t	ic_sizehi;	/* 12: number of bytes in file */
	struct timeval32 ic_atime;	/* 16: time last accessed */
	struct timeval32 ic_mtime;	/* 24: time last modified */
	struct timeval32 ic_ctime;	/* 32: last time inode changed */
	grub_daddr32_t	ic_db[UFS_NDADDR];	/* 40: disk block addresses */
	grub_daddr32_t	ic_ib[UFS_NIADDR];	/* 88: indirect blocks */
	grub_int32_t	ic_flags;	/* 100: cflags */
	grub_int32_t	ic_blocks;	/* 104: 512 byte blocks actually held */
	grub_int32_t	ic_gen;		/* 108: generation number */
	grub_int32_t	ic_shadow;	/* 112: shadow inode */
	grub_uid_t	ic_uid;		/* 116: long EFT version of uid */
	grub_gid_t	ic_gid;		/* 120: long EFT version of gid */
	grub_uint32_t	ic_oeftflag;	/* 124: extended attr directory ino, */
					/*      0 = none */
};

struct direct {
	grub_ino_t	d_ino;
	grub_ushort_t	d_reclen;
	grub_ushort_t	d_namelen;
	char		d_name[MAXNAMELEN + 1];
};

/* inode macros */
#define INOPB(fs)       ((fs)->fs_inopb)
#define itoo(fs, x)	((x) % (grub_uint32_t)INOPB(fs))
#define	itog(fs, x)	((x) / (grub_uint32_t)(fs)->fs_ipg)
#define itod(fs, x)	((grub_daddr32_t)(cgimin(fs, itog(fs, x)) + \
  (blkstofrags((fs), \
  ((x) % (grub_uint32_t)(fs)->fs_ipg / (grub_uint32_t)INOPB(fs))))))

/* block conversion macros */
#define	UFS_NINDIR(fs)	((fs)->fs_nindir)	/* # of indirects */
#define blkoff(fs, loc)	((int)((loc & ~(fs)->fs_bmask)))
#define lblkno(fs, loc) ((grub_int32_t)((loc) >> (fs)->fs_bshift))
/* frag to blk */
#define fsbtodb(fs, b)	(((grub_daddr32_t)(b)) << (fs)->fs_fsbtodb)
#define blkstofrags(fs, b) ((b) << (fs)->fs_fragshift)

/* cynlinder group macros */
#define cgbase(fs, c)	((grub_daddr32_t)((fs)->fs_fpg * (c)))
#define	cgimin(fs, c)	(cgstart(fs, c) + (fs)->fs_iblkno) /* inode block */
#define cgstart(fs, c) \
  (cgbase(fs, c) + (fs)->fs_cgoffset * ((c) & ~((fs)->fs_cgmask)))

#endif /* !_GRUB_UFS_H */