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} |