1 1.24 chs /* $NetBSD: pass1b.c,v 1.24 2023/01/07 19:41:29 chs Exp $ */ 2 1.9 cgd 3 1.1 cgd /* 4 1.6 mycroft * Copyright (c) 1980, 1986, 1993 5 1.6 mycroft * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.17 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.11 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.9 cgd #if 0 35 1.12 lukem static char sccsid[] = "@(#)pass1b.c 8.4 (Berkeley) 4/28/95"; 36 1.9 cgd #else 37 1.24 chs __RCSID("$NetBSD: pass1b.c,v 1.24 2023/01/07 19:41:29 chs Exp $"); 38 1.9 cgd #endif 39 1.1 cgd #endif /* not lint */ 40 1.1 cgd 41 1.1 cgd #include <sys/param.h> 42 1.5 cgd #include <sys/time.h> 43 1.12 lukem 44 1.6 mycroft #include <ufs/ufs/dinode.h> 45 1.6 mycroft #include <ufs/ffs/fs.h> 46 1.8 cgd 47 1.1 cgd #include <string.h> 48 1.12 lukem 49 1.1 cgd #include "fsck.h" 50 1.8 cgd #include "extern.h" 51 1.14 lukem #include "fsutil.h" 52 1.1 cgd 53 1.1 cgd static struct dups *duphead; 54 1.21 xtraeme static int pass1bcheck(struct inodesc *); 55 1.1 cgd 56 1.8 cgd void 57 1.20 xtraeme pass1b(void) 58 1.1 cgd { 59 1.24 chs uint32_t c, i; 60 1.16 fvdl union dinode *dp; 61 1.1 cgd struct inodesc idesc; 62 1.1 cgd ino_t inumber; 63 1.1 cgd 64 1.7 mycroft memset(&idesc, 0, sizeof(struct inodesc)); 65 1.1 cgd idesc.id_type = ADDR; 66 1.1 cgd idesc.id_func = pass1bcheck; 67 1.1 cgd duphead = duplist; 68 1.1 cgd inumber = 0; 69 1.13 bouyer for (c = 0; c < sblock->fs_ncg; c++) { 70 1.14 lukem if (got_siginfo) { 71 1.14 lukem fprintf(stderr, 72 1.14 lukem "%s: phase 1b: cyl group %d of %d (%d%%)\n", 73 1.14 lukem cdevname(), c, sblock->fs_ncg, 74 1.14 lukem c * 100 / sblock->fs_ncg); 75 1.14 lukem got_siginfo = 0; 76 1.14 lukem } 77 1.19 christos #ifdef PROGRESS 78 1.18 christos progress_bar(cdevname(), "phase 1b", c, sblock->fs_ncg); 79 1.19 christos #endif /* PROGRESS */ 80 1.13 bouyer for (i = 0; i < sblock->fs_ipg; i++, inumber++) { 81 1.23 dholland if (inumber < UFS_ROOTINO) 82 1.1 cgd continue; 83 1.1 cgd dp = ginode(inumber); 84 1.1 cgd if (dp == NULL) 85 1.1 cgd continue; 86 1.1 cgd idesc.id_number = inumber; 87 1.22 bouyer idesc.id_uid = iswap32(DIP(dp, uid)); 88 1.22 bouyer idesc.id_gid = iswap32(DIP(dp, gid)); 89 1.16 fvdl if (inoinfo(inumber)->ino_state != USTATE && 90 1.1 cgd (ckinode(dp, &idesc) & STOP)) 91 1.1 cgd return; 92 1.1 cgd } 93 1.1 cgd } 94 1.19 christos #ifdef PROGRESS 95 1.18 christos progress_done(); 96 1.19 christos #endif /* PROGRESS */ 97 1.1 cgd } 98 1.1 cgd 99 1.10 christos static int 100 1.20 xtraeme pass1bcheck(struct inodesc *idesc) 101 1.1 cgd { 102 1.11 lukem struct dups *dlp; 103 1.1 cgd int nfrags, res = KEEPON; 104 1.15 fvdl daddr_t blkno = idesc->id_blkno; 105 1.1 cgd 106 1.1 cgd for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 107 1.1 cgd if (chkrange(blkno, 1)) 108 1.1 cgd res = SKIP; 109 1.1 cgd for (dlp = duphead; dlp; dlp = dlp->next) { 110 1.1 cgd if (dlp->dup == blkno) { 111 1.1 cgd blkerror(idesc->id_number, "DUP", blkno); 112 1.1 cgd dlp->dup = duphead->dup; 113 1.1 cgd duphead->dup = blkno; 114 1.1 cgd duphead = duphead->next; 115 1.1 cgd } 116 1.1 cgd if (dlp == muldup) 117 1.1 cgd break; 118 1.1 cgd } 119 1.1 cgd if (muldup == 0 || duphead == muldup->next) 120 1.1 cgd return (STOP); 121 1.1 cgd } 122 1.1 cgd return (res); 123 1.1 cgd } 124