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 */
|