Patrick Welche <prlw1@cam.ac.uk>
[netbsd-mini2440.git] / sbin / fsck_ffs / SMM.doc / 3.t
blobac3a55328b7e4199ea3546eb7f0fad12b3109bae
1 .\"     $NetBSD: 3.t,v 1.5 2001/08/20 12:00:49 wiz Exp $
2 .\"
3 .\" Copyright (c) 1982, 1993
4 .\"     The Regents of the University of California.  All rights reserved.
5 .\"
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\"    notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice, this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\" 3. Neither the name of the University nor the names of its contributors
15 .\"    may be used to endorse or promote products derived from this software
16 .\"    without specific prior written permission.
17 .\"
18 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 .\" SUCH DAMAGE.
29 .\"
30 .\"     @(#)3.t 8.1 (Berkeley) 6/5/93
31 .\"
32 .ds RH Fixing corrupted file systems
33 .NH
34 Fixing corrupted file systems
35 .PP
36 A file system
37 can become corrupted in several ways.
38 The most common of these ways are
39 improper shutdown procedures
40 and hardware failures.
41 .PP
42 File systems may become corrupted during an
43 .I "unclean halt" .
44 This happens when proper shutdown
45 procedures are not observed,
46 physically write-protecting a mounted file system,
47 or a mounted file system is taken off-line.
48 The most common operator procedural failure is forgetting to
49 .I sync
50 the system before halting the CPU.
51 .PP
52 File systems may become further corrupted if proper startup
53 procedures are not observed, e.g.,
54 not checking a file system for inconsistencies,
55 and not repairing inconsistencies.
56 Allowing a corrupted file system to be used (and, thus, to be modified
57 further) can be disastrous.
58 .PP
59 Any piece of hardware can fail at any time.
60 Failures
61 can be as subtle as a bad block
62 on a disk pack, or as blatant as a non-functional disk-controller.
63 .NH 2
64 Detecting and correcting corruption
65 .PP
66 Normally
67 .I fsck_ffs
68 is run non-interactively.
69 In this mode it will only fix
70 corruptions that are expected to occur from an unclean halt.
71 These actions are a proper subset of the actions that 
72 .I fsck_ffs
73 will take when it is running interactively.
74 Throughout this paper we assume that 
75 .I fsck_ffs 
76 is being run interactively,
77 and all possible errors can be encountered.
78 When an inconsistency is discovered in this mode,
79 .I fsck_ffs
80 reports the inconsistency for the operator to
81 chose a corrective action.
82 .PP
83 A quiescent\(dd
84 .FS
85 \(dd I.e., unmounted and not being written on.
86 .FE
87 file system may be checked for structural integrity
88 by performing consistency checks on the
89 redundant data intrinsic to a file system.
90 The redundant data is either read from
91 the file system,
92 or computed from other known values.
93 The file system
94 .B must
95 be in a quiescent state when
96 .I fsck_ffs
97 is run,
98 since
99 .I fsck_ffs
100 is a multi-pass program.
102 In the following sections,
103 we discuss methods to discover inconsistencies
104 and possible corrective actions
105 for the cylinder group blocks, the inodes, the indirect blocks, and
106 the data blocks containing directory entries.
107 .NH 2
108 Super-block checking
110 The most commonly corrupted item in a file system
111 is the summary information
112 associated with the super-block.
113 The summary information is prone to corruption
114 because it is modified with every change to the file
115 system's blocks or inodes,
116 and is usually corrupted
117 after an unclean halt.
119 The super-block is checked for inconsistencies
120 involving file-system size, number of inodes,
121 free-block count, and the free-inode count.
122 The file-system size must be larger than the
123 number of blocks used by the super-block
124 and the number of blocks used by the list of inodes.
125 The file-system size and layout information
126 are the most critical pieces of information for
127 .I fsck_ffs .
128 While there is no way to actually check these sizes,
129 since they are statically determined by
130 .I newfs ,
131 .I fsck_ffs
132 can check that these sizes are within reasonable bounds.
133 All other file system checks require that these sizes be correct.
135 .I fsck_ffs 
136 detects corruption in the static parameters of the default super-block,
137 .I fsck_ffs
138 requests the operator to specify the location of an alternate super-block.
139 .NH 2
140 Free block checking
142 .I Fsck_ffs
143 checks that all the blocks
144 marked as free in the cylinder group block maps
145 are not claimed by any files.
146 When all the blocks have been initially accounted for,
147 .I fsck_ffs
148 checks that
149 the number of free blocks
150 plus the number of blocks claimed by the inodes
151 equals the total number of blocks in the file system.
153 If anything is wrong with the block allocation maps,
154 .I fsck_ffs
155 will rebuild them,
156 based on the list it has computed of allocated blocks.
158 The summary information associated with the super-block
159 counts the total number of free blocks within the file system.
160 .I Fsck_ffs
161 compares this count to the
162 number of free blocks it found within the file system.
163 If the two counts do not agree, then
164 .I fsck_ffs
165 replaces the incorrect count in the summary information
166 by the actual free-block count.
168 The summary information
169 counts the total number of free inodes within the file system.
170 .I Fsck_ffs
171 compares this count to the number
172 of free inodes it found within the file system.
173 If the two counts do not agree, then
174 .I fsck_ffs
175 replaces the incorrect count in the
176 summary information by the actual free-inode count.
177 .NH 2
178 Checking the inode state
180 An individual inode is not as likely to be corrupted as
181 the allocation information.
182 However, because of the great number of active inodes,
183 a few of the inodes are usually corrupted.
185 The list of inodes in the file system
186 is checked sequentially starting with inode 2
187 (inode 0 marks unused inodes;
188 inode 1 is saved for future generations)
189 and progressing through the last inode in the file system.
190 The state of each inode is checked for
191 inconsistencies involving format and type,
192 link count,
193 duplicate blocks,
194 bad blocks,
195 and inode size.
197 Each inode contains a mode word.
198 This mode word describes the type and state of the inode.
199 Inodes must be one of six types:
200 regular inode, directory inode, symbolic link inode,
201 special block inode, special character inode, or socket inode.
202 Inodes may be found in one of three allocation states:
203 unallocated, allocated, and neither unallocated nor allocated.
204 This last state suggests an incorrectly formated inode.
205 An inode can get in this state if
206 bad data is written into the inode list.
207 The only possible corrective action is for
208 .I fsck_ffs
209 is to clear the inode.
210 .NH 2
211 Inode links
213 Each inode counts the
214 total number of directory entries
215 linked to the inode.
216 .I Fsck_ffs
217 verifies the link count of each inode
218 by starting at the root of the file system,
219 and descending through the directory structure.
220 The actual link count for each inode
221 is calculated during the descent.
223 If the stored link count is non-zero and the actual
224 link count is zero,
225 then no directory entry appears for the inode.
226 If this happens,
227 .I fsck_ffs
228 will place the disconnected file in the
229 .I lost+found
230 directory.
231 If the stored and actual link counts are non-zero and unequal,
232 a directory entry may have been added or removed without the inode being
233 updated.
234 If this happens,
235 .I fsck_ffs
236 replaces the incorrect stored link count by the actual link count.
238 Each inode contains a list,
239 or pointers to
240 lists (indirect blocks),
241 of all the blocks claimed by the inode.
242 Since indirect blocks are owned by an inode,
243 inconsistencies in indirect blocks directly
244 affect the inode that owns it.
246 .I Fsck_ffs
247 compares each block number claimed by an inode
248 against a list of already allocated blocks.
249 If another inode already claims a block number,
250 then the block number is added to a list of
251 .I "duplicate blocks" .
252 Otherwise, the list of allocated blocks
253 is updated to include the block number.
255 If there are any duplicate blocks,
256 .I fsck_ffs
257 will perform a partial second
258 pass over the inode list
259 to find the inode of the duplicated block.
260 The second pass is needed,
261 since without examining the files associated with
262 these inodes for correct content,
263 not enough information is available
264 to determine which inode is corrupted and should be cleared.
265 If this condition does arise
266 (only hardware failure will cause it),
267 then the inode with the earliest
268 modify time is usually incorrect,
269 and should be cleared.
270 If this happens,
271 .I fsck_ffs
272 prompts the operator to clear both inodes.
273 The operator must decide which one should be kept
274 and which one should be cleared.
276 .I Fsck_ffs
277 checks the range of each block number claimed by an inode.
278 If the block number is
279 lower than the first data block in the file system,
280 or greater than the last data block,
281 then the block number is a
282 .I "bad block number" .
283 Many bad blocks in an inode are usually caused by
284 an indirect block that was not written to the file system,
285 a condition which can only occur if there has been a hardware failure.
286 If an inode contains bad block numbers,
287 .I fsck_ffs
288 prompts the operator to clear it.
289 .NH 2
290 Inode data size
292 Each inode contains a count of the number of data blocks
293 that it contains.
294 The number of actual data blocks
295 is the sum of the allocated data blocks
296 and the indirect blocks.
297 .I Fsck_ffs
298 computes the actual number of data blocks
299 and compares that block count against
300 the actual number of blocks the inode claims.
301 If an inode contains an incorrect count
302 .I fsck_ffs
303 prompts the operator to fix it.
305 Each inode contains a thirty-two bit size field.
306 The size is the number of data bytes
307 in the file associated with the inode.
308 The consistency of the byte size field is roughly checked
309 by computing from the size field the maximum number of blocks
310 that should be associated with the inode,
311 and comparing that expected block count against
312 the actual number of blocks the inode claims.
313 .NH 2
314 Checking the data associated with an inode
316 An inode can directly or indirectly
317 reference three kinds of data blocks.
318 All referenced blocks must be the same kind.
319 The three types of data blocks are:
320 plain data blocks, symbolic link data blocks, and directory data blocks.
321 Plain data blocks
322 contain the information stored in a file;
323 symbolic link data blocks
324 contain the path name stored in a link.
325 Directory data blocks contain directory entries.
326 .I Fsck_ffs
327 can only check the validity of directory data blocks.
329 Each directory data block is checked for
330 several types of inconsistencies.
331 These inconsistencies include
332 directory inode numbers pointing to unallocated inodes,
333 directory inode numbers that are greater than
334 the number of inodes in the file system,
335 incorrect directory inode numbers for ``\fB.\fP'' and ``\fB..\fP'',
336 and directories that are not attached to the file system.
337 If the inode number in a directory data block
338 references an unallocated inode,
339 then
340 .I fsck_ffs
341 will remove that directory entry.
342 Again,
343 this condition can only arise when there has been a hardware failure.
345 .I Fsck
346 also checks for directories with unallocated blocks (holes).
347 Such directories should never be created.
348 When found,
349 .I fsck
350 will prompt the user to adjust the length of the offending directory
351 which is done by shortening the size of the directory to the end of the
352 last allocated block preceding the hole.
353 Unfortunately, this means that another Phase 1 run has to be done. 
354 .I Fsck
355 will remind the user to rerun fsck after repairing a
356 directory containing an unallocated block.
358 If a directory entry inode number references
359 outside the inode list, then
360 .I fsck_ffs
361 will remove that directory entry.
362 This condition occurs if bad data is written into a directory data block.
364 The directory inode number entry for ``\fB.\fP''
365 must be the first entry in the directory data block.
366 The inode number for ``\fB.\fP''
367 must reference itself;
368 e.g., it must equal the inode number
369 for the directory data block.
370 The directory inode number entry
371 for ``\fB..\fP'' must be
372 the second entry in the directory data block.
373 Its value must equal the inode number for the
374 parent of the directory entry
375 (or the inode number of the directory
376 data block if the directory is the
377 root directory).
378 If the directory inode numbers are
379 incorrect,
380 .I fsck_ffs
381 will replace them with the correct values.
382 If there are multiple hard links to a directory,
383 the first one encountered is considered the real parent
384 to which ``\fB..\fP'' should point;
385 \fIfsck_ffs\fP recommends deletion for the subsequently discovered names.
386 .NH 2
387 File system connectivity
389 .I Fsck_ffs
390 checks the general connectivity of the file system.
391 If directories are not linked into the file system, then
392 .I fsck_ffs
393 links the directory back into the file system in the
394 .I lost+found
395 directory.
396 This condition only occurs when there has been a hardware failure.
397 .ds RH "References"
399 \s+2Acknowledgements\s0
401 I thank Bill Joy, Sam Leffler, Robert Elz and Dennis Ritchie 
402 for their suggestions and help in implementing the new file system.
403 Thanks also to Robert Henry for his editorial input to
404 get this document together.
405 Finally we thank our sponsors,
406 the National Science Foundation under grant MCS80-05144,
407 and the Defense Advance Research Projects Agency (DoD) under
408 Arpa Order No. 4031 monitored by Naval Electronic System Command under
409 Contract No. N00039-82-C-0235. (Kirk McKusick, July 1983)
411 I would like to thank Larry A. Wehr for advice that lead
412 to the first version of
413 .I fsck_ffs
414 and Rick B. Brandt for adapting
415 .I fsck_ffs
417 UNIX/TS. (T. Kowalski, July 1979)
418 .sp 2
420 \s+2References\s0
422 .IP [Dolotta78] 20
423 Dolotta, T. A., and Olsson, S. B. eds.,
424 .I "UNIX User's Manual, Edition 1.1\^" ,
425 January 1978.
426 .IP [Joy83] 20
427 Joy, W., Cooper, E., Fabry, R., Leffler, S., McKusick, M., and Mosher, D.
428 4.2BSD System Manual,
429 .I "University of California at Berkeley" ,
430 .I "Computer Systems Research Group Technical Report"
431 #4, 1982.
432 .IP [McKusick84] 20
433 McKusick, M., Joy, W., Leffler, S., and Fabry, R.
434 A Fast File System for UNIX,
435 \fIACM Transactions on Computer Systems 2\fP, 3.
436 pp. 181-197, August 1984.
437 .IP [Ritchie78] 20
438 Ritchie, D. M., and Thompson, K.,
439 The UNIX Time-Sharing System,
440 .I "The Bell System Technical Journal"
441 .B 57 ,
442 6 (July-August 1978, Part 2), pp. 1905-29.
443 .IP [Thompson78] 20
444 Thompson, K.,
445 UNIX Implementation,
446 .I "The Bell System Technical Journal\^"
447 .B 57 ,
448 6 (July-August 1978, Part 2), pp. 1931-46.
449 .ds RH Appendix A \- Fsck_ffs Error Conditions