home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sbin / fsck / pass4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-20  |  3.6 KB  |  133 lines

  1. /*
  2.  * Copyright (c) 1980, 1986 The Regents of the University of California.
  3.  * 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
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  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
  35. static char sccsid[] = "@(#)pass4.c    5.10 (Berkeley) 7/20/90";
  36. #endif /* not lint */
  37.  
  38. #include <sys/param.h>
  39. #include <ufs/dinode.h>
  40. #include <ufs/fs.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include "fsck.h"
  44.  
  45. int    pass4check();
  46.  
  47. pass4()
  48. {
  49.     register ino_t inumber;
  50.     register struct zlncnt *zlnp;
  51.     struct dinode *dp;
  52.     struct inodesc idesc;
  53.     int n;
  54.  
  55.     bzero((char *)&idesc, sizeof(struct inodesc));
  56.     idesc.id_type = ADDR;
  57.     idesc.id_func = pass4check;
  58.     for (inumber = ROOTINO; inumber <= lastino; inumber++) {
  59.         idesc.id_number = inumber;
  60.         switch (statemap[inumber]) {
  61.  
  62.         case FSTATE:
  63.         case DFOUND:
  64.             n = lncntp[inumber];
  65.             if (n)
  66.                 adjust(&idesc, (short)n);
  67.             else {
  68.                 for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
  69.                     if (zlnp->zlncnt == inumber) {
  70.                         zlnp->zlncnt = zlnhead->zlncnt;
  71.                         zlnp = zlnhead;
  72.                         zlnhead = zlnhead->next;
  73.                         free((char *)zlnp);
  74.                         clri(&idesc, "UNREF", 1);
  75.                         break;
  76.                     }
  77.             }
  78.             break;
  79.  
  80.         case DSTATE:
  81.             clri(&idesc, "UNREF", 1);
  82.             break;
  83.  
  84.         case DCLEAR:
  85.             dp = ginode(inumber);
  86.             if (dp->di_size == 0) {
  87.                 clri(&idesc, "ZERO LENGTH", 1);
  88.                 break;
  89.             }
  90.             /* fall through */
  91.         case FCLEAR:
  92.             clri(&idesc, "BAD/DUP", 1);
  93.             break;
  94.  
  95.         case USTATE:
  96.             break;
  97.  
  98.         default:
  99.             errexit("BAD STATE %d FOR INODE I=%d",
  100.                 statemap[inumber], inumber);
  101.         }
  102.     }
  103. }
  104.  
  105. pass4check(idesc)
  106.     register struct inodesc *idesc;
  107. {
  108.     register struct dups *dlp;
  109.     int nfrags, res = KEEPON;
  110.     daddr_t blkno = idesc->id_blkno;
  111.  
  112.     for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
  113.         if (chkrange(blkno, 1)) {
  114.             res = SKIP;
  115.         } else if (testbmap(blkno)) {
  116.             for (dlp = duplist; dlp; dlp = dlp->next) {
  117.                 if (dlp->dup != blkno)
  118.                     continue;
  119.                 dlp->dup = duplist->dup;
  120.                 dlp = duplist;
  121.                 duplist = duplist->next;
  122.                 free((char *)dlp);
  123.                 break;
  124.             }
  125.             if (dlp == 0) {
  126.                 clrbmap(blkno);
  127.                 n_blks--;
  128.             }
  129.         }
  130.     }
  131.     return (res);
  132. }
  133.