Deleted Added
full compact
inode.c (6404) inode.c (7585)
1/*
2 * Copyright (c) 1980, 1986, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 18 unchanged lines hidden (view full) ---

27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
1/*
2 * Copyright (c) 1980, 1986, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 18 unchanged lines hidden (view full) ---

27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35static char sccsid[] = "@(#)inode.c 8.5 (Berkeley) 2/8/95";
35static const char sccsid[] = "@(#)inode.c 8.5 (Berkeley) 2/8/95";
36#endif /* not lint */
37
38#include <sys/param.h>
39#include <sys/time.h>
40#include <ufs/ufs/dinode.h>
41#include <ufs/ufs/dir.h>
42#include <ufs/ffs/fs.h>
43#include <pwd.h>
36#endif /* not lint */
37
38#include <sys/param.h>
39#include <sys/time.h>
40#include <ufs/ufs/dinode.h>
41#include <ufs/ufs/dir.h>
42#include <ufs/ffs/fs.h>
43#include <pwd.h>
44#include <stdio.h>
44#include <stdlib.h>
45#include <string.h>
46#include "fsck.h"
47
48static ino_t startinum;
49
45#include <stdlib.h>
46#include <string.h>
47#include "fsck.h"
48
49static ino_t startinum;
50
51static int iblock __P((struct inodesc *idesc, long ilevel, quad_t isize));
52
53int
50ckinode(dp, idesc)
51 struct dinode *dp;
52 register struct inodesc *idesc;
53{
54 register daddr_t *ap;
55 long ret, n, ndb, offset;
56 struct dinode dino;
57 quad_t remsize, sizepb;

--- 36 unchanged lines hidden (view full) ---

94 return (ret);
95 }
96 sizepb *= NINDIR(&sblock);
97 remsize -= sizepb;
98 }
99 return (KEEPON);
100}
101
54ckinode(dp, idesc)
55 struct dinode *dp;
56 register struct inodesc *idesc;
57{
58 register daddr_t *ap;
59 long ret, n, ndb, offset;
60 struct dinode dino;
61 quad_t remsize, sizepb;

--- 36 unchanged lines hidden (view full) ---

98 return (ret);
99 }
100 sizepb *= NINDIR(&sblock);
101 remsize -= sizepb;
102 }
103 return (KEEPON);
104}
105
106static int
102iblock(idesc, ilevel, isize)
103 struct inodesc *idesc;
104 long ilevel;
105 quad_t isize;
106{
107 register daddr_t *ap;
108 register daddr_t *aplim;
109 register struct bufarea *bp;
110 int i, n, (*func)(), nif;
111 quad_t sizepb;
112 char buf[BUFSIZ];
107iblock(idesc, ilevel, isize)
108 struct inodesc *idesc;
109 long ilevel;
110 quad_t isize;
111{
112 register daddr_t *ap;
113 register daddr_t *aplim;
114 register struct bufarea *bp;
115 int i, n, (*func)(), nif;
116 quad_t sizepb;
117 char buf[BUFSIZ];
113 extern int dirscan(), pass1check();
114
115 if (idesc->id_type == ADDR) {
116 func = idesc->id_func;
117 if (((n = (*func)(idesc)) & KEEPON) == 0)
118 return (n);
119 } else
120 func = dirscan;
121 if (chkrange(idesc->id_blkno, idesc->id_numfrags))

--- 37 unchanged lines hidden (view full) ---

159 bp->b_flags &= ~B_INUSE;
160 return (KEEPON);
161}
162
163/*
164 * Check that a block in a legal block number.
165 * Return 0 if in range, 1 if out of range.
166 */
118
119 if (idesc->id_type == ADDR) {
120 func = idesc->id_func;
121 if (((n = (*func)(idesc)) & KEEPON) == 0)
122 return (n);
123 } else
124 func = dirscan;
125 if (chkrange(idesc->id_blkno, idesc->id_numfrags))

--- 37 unchanged lines hidden (view full) ---

163 bp->b_flags &= ~B_INUSE;
164 return (KEEPON);
165}
166
167/*
168 * Check that a block in a legal block number.
169 * Return 0 if in range, 1 if out of range.
170 */
171int
167chkrange(blk, cnt)
168 daddr_t blk;
169 int cnt;
170{
171 register int c;
172
173 if ((unsigned)(blk + cnt) > maxfsblock)
174 return (1);

--- 73 unchanged lines hidden (view full) ---

248 lastinum += fullcnt;
249 }
250 (void)bread(fsreadfd, (char *)inodebuf, dblk, size); /* ??? */
251 dp = inodebuf;
252 }
253 return (dp++);
254}
255
172chkrange(blk, cnt)
173 daddr_t blk;
174 int cnt;
175{
176 register int c;
177
178 if ((unsigned)(blk + cnt) > maxfsblock)
179 return (1);

--- 73 unchanged lines hidden (view full) ---

253 lastinum += fullcnt;
254 }
255 (void)bread(fsreadfd, (char *)inodebuf, dblk, size); /* ??? */
256 dp = inodebuf;
257 }
258 return (dp++);
259}
260
261void
256resetinodebuf()
257{
258
259 startinum = 0;
260 nextino = 0;
261 lastinum = 0;
262 readcnt = 0;
263 inobufsize = blkroundup(&sblock, INOBUFSIZE);

--- 9 unchanged lines hidden (view full) ---

273 }
274 if (inodebuf == NULL &&
275 (inodebuf = (struct dinode *)malloc((unsigned)inobufsize)) == NULL)
276 errexit("Cannot allocate space for inode buffer\n");
277 while (nextino < ROOTINO)
278 (void)getnextinode(nextino);
279}
280
262resetinodebuf()
263{
264
265 startinum = 0;
266 nextino = 0;
267 lastinum = 0;
268 readcnt = 0;
269 inobufsize = blkroundup(&sblock, INOBUFSIZE);

--- 9 unchanged lines hidden (view full) ---

279 }
280 if (inodebuf == NULL &&
281 (inodebuf = (struct dinode *)malloc((unsigned)inobufsize)) == NULL)
282 errexit("Cannot allocate space for inode buffer\n");
283 while (nextino < ROOTINO)
284 (void)getnextinode(nextino);
285}
286
287void
281freeinodebuf()
282{
283
284 if (inodebuf != NULL)
285 free((char *)inodebuf);
286 inodebuf = NULL;
287}
288
289/*
290 * Routines to maintain information about directory inodes.
291 * This is built during the first pass and used during the
292 * second and third passes.
293 *
294 * Enter inodes into the cache.
295 */
288freeinodebuf()
289{
290
291 if (inodebuf != NULL)
292 free((char *)inodebuf);
293 inodebuf = NULL;
294}
295
296/*
297 * Routines to maintain information about directory inodes.
298 * This is built during the first pass and used during the
299 * second and third passes.
300 *
301 * Enter inodes into the cache.
302 */
303void
296cacheino(dp, inumber)
297 register struct dinode *dp;
298 ino_t inumber;
299{
300 register struct inoinfo *inp;
301 struct inoinfo **inpp;
302 unsigned int blks;
303

--- 43 unchanged lines hidden (view full) ---

347 }
348 errexit("cannot find inode %d\n", inumber);
349 return ((struct inoinfo *)0);
350}
351
352/*
353 * Clean up all the inode cache structure.
354 */
304cacheino(dp, inumber)
305 register struct dinode *dp;
306 ino_t inumber;
307{
308 register struct inoinfo *inp;
309 struct inoinfo **inpp;
310 unsigned int blks;
311

--- 43 unchanged lines hidden (view full) ---

355 }
356 errexit("cannot find inode %d\n", inumber);
357 return ((struct inoinfo *)0);
358}
359
360/*
361 * Clean up all the inode cache structure.
362 */
363void
355inocleanup()
356{
357 register struct inoinfo **inpp;
358
359 if (inphead == NULL)
360 return;
361 for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--)
362 free((char *)(*inpp));
363 free((char *)inphead);
364 free((char *)inpsort);
365 inphead = inpsort = NULL;
366}
367
364inocleanup()
365{
366 register struct inoinfo **inpp;
367
368 if (inphead == NULL)
369 return;
370 for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--)
371 free((char *)(*inpp));
372 free((char *)inphead);
373 free((char *)inpsort);
374 inphead = inpsort = NULL;
375}
376
377void
368inodirty()
369{
378inodirty()
379{
370
371 dirty(pbp);
372}
373
380 dirty(pbp);
381}
382
383void
374clri(idesc, type, flag)
375 register struct inodesc *idesc;
376 char *type;
377 int flag;
378{
379 register struct dinode *dp;
380
381 dp = ginode(idesc->id_number);

--- 8 unchanged lines hidden (view full) ---

390 n_files--;
391 (void)ckinode(dp, idesc);
392 clearinode(dp);
393 statemap[idesc->id_number] = USTATE;
394 inodirty();
395 }
396}
397
384clri(idesc, type, flag)
385 register struct inodesc *idesc;
386 char *type;
387 int flag;
388{
389 register struct dinode *dp;
390
391 dp = ginode(idesc->id_number);

--- 8 unchanged lines hidden (view full) ---

400 n_files--;
401 (void)ckinode(dp, idesc);
402 clearinode(dp);
403 statemap[idesc->id_number] = USTATE;
404 inodirty();
405 }
406}
407
408int
398findname(idesc)
399 struct inodesc *idesc;
400{
401 register struct direct *dirp = idesc->id_dirp;
402
403 if (dirp->d_ino != idesc->id_parent)
404 return (KEEPON);
405 bcopy(dirp->d_name, idesc->id_name, (size_t)dirp->d_namlen + 1);
406 return (STOP|FOUND);
407}
408
409findname(idesc)
410 struct inodesc *idesc;
411{
412 register struct direct *dirp = idesc->id_dirp;
413
414 if (dirp->d_ino != idesc->id_parent)
415 return (KEEPON);
416 bcopy(dirp->d_name, idesc->id_name, (size_t)dirp->d_namlen + 1);
417 return (STOP|FOUND);
418}
419
420int
409findino(idesc)
410 struct inodesc *idesc;
411{
412 register struct direct *dirp = idesc->id_dirp;
413
414 if (dirp->d_ino == 0)
415 return (KEEPON);
416 if (strcmp(dirp->d_name, idesc->id_name) == 0 &&
417 dirp->d_ino >= ROOTINO && dirp->d_ino <= maxino) {
418 idesc->id_parent = dirp->d_ino;
419 return (STOP|FOUND);
420 }
421 return (KEEPON);
422}
423
421findino(idesc)
422 struct inodesc *idesc;
423{
424 register struct direct *dirp = idesc->id_dirp;
425
426 if (dirp->d_ino == 0)
427 return (KEEPON);
428 if (strcmp(dirp->d_name, idesc->id_name) == 0 &&
429 dirp->d_ino >= ROOTINO && dirp->d_ino <= maxino) {
430 idesc->id_parent = dirp->d_ino;
431 return (STOP|FOUND);
432 }
433 return (KEEPON);
434}
435
436void
424pinode(ino)
425 ino_t ino;
426{
427 register struct dinode *dp;
428 register char *p;
429 struct passwd *pw;
430 char *ctime();
431

--- 9 unchanged lines hidden (view full) ---

441 printf("MODE=%o\n", dp->di_mode);
442 if (preen)
443 printf("%s: ", cdevname);
444 printf("SIZE=%qu ", dp->di_size);
445 p = ctime(&dp->di_mtime.ts_sec);
446 printf("MTIME=%12.12s %4.4s ", &p[4], &p[20]);
447}
448
437pinode(ino)
438 ino_t ino;
439{
440 register struct dinode *dp;
441 register char *p;
442 struct passwd *pw;
443 char *ctime();
444

--- 9 unchanged lines hidden (view full) ---

454 printf("MODE=%o\n", dp->di_mode);
455 if (preen)
456 printf("%s: ", cdevname);
457 printf("SIZE=%qu ", dp->di_size);
458 p = ctime(&dp->di_mtime.ts_sec);
459 printf("MTIME=%12.12s %4.4s ", &p[4], &p[20]);
460}
461
462void
449blkerror(ino, type, blk)
450 ino_t ino;
451 char *type;
452 daddr_t blk;
453{
454
455 pfatal("%ld %s I=%lu", blk, type, ino);
456 printf("\n");

--- 64 unchanged lines hidden (view full) ---

521 if (newinofmt)
522 typemap[ino] = IFTODT(type);
523 return (ino);
524}
525
526/*
527 * deallocate an inode
528 */
463blkerror(ino, type, blk)
464 ino_t ino;
465 char *type;
466 daddr_t blk;
467{
468
469 pfatal("%ld %s I=%lu", blk, type, ino);
470 printf("\n");

--- 64 unchanged lines hidden (view full) ---

535 if (newinofmt)
536 typemap[ino] = IFTODT(type);
537 return (ino);
538}
539
540/*
541 * deallocate an inode
542 */
543void
529freeino(ino)
530 ino_t ino;
531{
532 struct inodesc idesc;
544freeino(ino)
545 ino_t ino;
546{
547 struct inodesc idesc;
533 extern int pass4check();
534 struct dinode *dp;
535
536 bzero((char *)&idesc, sizeof(struct inodesc));
537 idesc.id_type = ADDR;
538 idesc.id_func = pass4check;
539 idesc.id_number = ino;
540 dp = ginode(ino);
541 (void)ckinode(dp, &idesc);
542 clearinode(dp);
543 inodirty();
544 statemap[ino] = USTATE;
545 n_files--;
546}
548 struct dinode *dp;
549
550 bzero((char *)&idesc, sizeof(struct inodesc));
551 idesc.id_type = ADDR;
552 idesc.id_func = pass4check;
553 idesc.id_number = ino;
554 dp = ginode(ino);
555 (void)ckinode(dp, &idesc);
556 clearinode(dp);
557 inodirty();
558 statemap[ino] = USTATE;
559 n_files--;
560}