home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sbin / fsck / pass1b.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-20  |  3.1 KB  |  99 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[] = "@(#)pass1b.c    5.8 (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 <string.h>
  42. #include "fsck.h"
  43.  
  44. int    pass1bcheck();
  45. static  struct dups *duphead;
  46.  
  47. pass1b()
  48. {
  49.     register int c, i;
  50.     register struct dinode *dp;
  51.     struct inodesc idesc;
  52.     ino_t inumber;
  53.  
  54.     bzero((char *)&idesc, sizeof(struct inodesc));
  55.     idesc.id_type = ADDR;
  56.     idesc.id_func = pass1bcheck;
  57.     duphead = duplist;
  58.     inumber = 0;
  59.     for (c = 0; c < sblock.fs_ncg; c++) {
  60.         for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
  61.             if (inumber < ROOTINO)
  62.                 continue;
  63.             dp = ginode(inumber);
  64.             if (dp == NULL)
  65.                 continue;
  66.             idesc.id_number = inumber;
  67.             if (statemap[inumber] != USTATE &&
  68.                 (ckinode(dp, &idesc) & STOP))
  69.                 return;
  70.         }
  71.     }
  72. }
  73.  
  74. pass1bcheck(idesc)
  75.     register struct inodesc *idesc;
  76. {
  77.     register struct dups *dlp;
  78.     int nfrags, res = KEEPON;
  79.     daddr_t blkno = idesc->id_blkno;
  80.  
  81.     for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
  82.         if (chkrange(blkno, 1))
  83.             res = SKIP;
  84.         for (dlp = duphead; dlp; dlp = dlp->next) {
  85.             if (dlp->dup == blkno) {
  86.                 blkerror(idesc->id_number, "DUP", blkno);
  87.                 dlp->dup = duphead->dup;
  88.                 duphead->dup = blkno;
  89.                 duphead = duphead->next;
  90.             }
  91.             if (dlp == muldup)
  92.                 break;
  93.         }
  94.         if (muldup == 0 || duphead == muldup->next)
  95.             return (STOP);
  96.     }
  97.     return (res);
  98. }
  99.