inode.c (57573) | inode.c (62668) |
---|---|
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 --- 22 unchanged lines hidden (view full) --- 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35#if 0 36static const char sccsid[] = "@(#)inode.c 8.8 (Berkeley) 4/28/95"; 37#endif 38static const char rcsid[] = | 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 --- 22 unchanged lines hidden (view full) --- 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35#if 0 36static const char sccsid[] = "@(#)inode.c 8.8 (Berkeley) 4/28/95"; 37#endif 38static const char rcsid[] = |
39 "$FreeBSD: head/sbin/fsck_ffs/inode.c 57573 2000-02-28 20:02:41Z mckusick $"; | 39 "$FreeBSD: head/sbin/fsck_ffs/inode.c 62668 2000-07-06 02:03:11Z mckusick $"; |
40#endif /* not lint */ 41 42#include <sys/param.h> 43#include <sys/time.h> 44 45#include <ufs/ufs/dinode.h> 46#include <ufs/ufs/dir.h> 47#include <ufs/ffs/fs.h> --- 18 unchanged lines hidden (view full) --- 66 long n, ndb, offset; 67 struct dinode dino; 68 quad_t remsize, sizepb; 69 mode_t mode; 70 char pathbuf[MAXPATHLEN + 1]; 71 72 if (idesc->id_fix != IGNORE) 73 idesc->id_fix = DONTKNOW; | 40#endif /* not lint */ 41 42#include <sys/param.h> 43#include <sys/time.h> 44 45#include <ufs/ufs/dinode.h> 46#include <ufs/ufs/dir.h> 47#include <ufs/ffs/fs.h> --- 18 unchanged lines hidden (view full) --- 66 long n, ndb, offset; 67 struct dinode dino; 68 quad_t remsize, sizepb; 69 mode_t mode; 70 char pathbuf[MAXPATHLEN + 1]; 71 72 if (idesc->id_fix != IGNORE) 73 idesc->id_fix = DONTKNOW; |
74 idesc->id_lbn = -1; |
|
74 idesc->id_entryno = 0; 75 idesc->id_filesize = dp->di_size; 76 mode = dp->di_mode & IFMT; 77 if (mode == IFBLK || mode == IFCHR || (mode == IFLNK && 78 dp->di_size < (unsigned)sblock.fs_maxsymlinklen)) 79 return (KEEPON); 80 dino = *dp; 81 ndb = howmany(dino.di_size, sblock.fs_bsize); 82 for (ap = &dino.di_db[0]; ap < &dino.di_db[NDADDR]; ap++) { | 75 idesc->id_entryno = 0; 76 idesc->id_filesize = dp->di_size; 77 mode = dp->di_mode & IFMT; 78 if (mode == IFBLK || mode == IFCHR || (mode == IFLNK && 79 dp->di_size < (unsigned)sblock.fs_maxsymlinklen)) 80 return (KEEPON); 81 dino = *dp; 82 ndb = howmany(dino.di_size, sblock.fs_bsize); 83 for (ap = &dino.di_db[0]; ap < &dino.di_db[NDADDR]; ap++) { |
84 idesc->id_lbn++; |
|
83 if (--ndb == 0 && (offset = blkoff(&sblock, dino.di_size)) != 0) 84 idesc->id_numfrags = 85 numfrags(&sblock, fragroundup(&sblock, offset)); 86 else 87 idesc->id_numfrags = sblock.fs_frag; 88 if (*ap == 0) { 89 if (idesc->id_type == DATA && ndb >= 0) { 90 /* An empty block in a directory XXX */ --- 10 unchanged lines hidden (view full) --- 101 rerun = 1; 102 inodirty(); 103 104 } 105 } 106 continue; 107 } 108 idesc->id_blkno = *ap; | 85 if (--ndb == 0 && (offset = blkoff(&sblock, dino.di_size)) != 0) 86 idesc->id_numfrags = 87 numfrags(&sblock, fragroundup(&sblock, offset)); 88 else 89 idesc->id_numfrags = sblock.fs_frag; 90 if (*ap == 0) { 91 if (idesc->id_type == DATA && ndb >= 0) { 92 /* An empty block in a directory XXX */ --- 10 unchanged lines hidden (view full) --- 103 rerun = 1; 104 inodirty(); 105 106 } 107 } 108 continue; 109 } 110 idesc->id_blkno = *ap; |
109 if (idesc->id_type == ADDR) | 111 if (idesc->id_type != DATA) |
110 ret = (*idesc->id_func)(idesc); 111 else 112 ret = dirscan(idesc); 113 if (ret & STOP) 114 return (ret); 115 } 116 idesc->id_numfrags = sblock.fs_frag; 117 remsize = dino.di_size - sblock.fs_bsize * NDADDR; 118 sizepb = sblock.fs_bsize; 119 for (ap = &dino.di_ib[0], n = 1; n <= NIADDR; ap++, n++) { | 112 ret = (*idesc->id_func)(idesc); 113 else 114 ret = dirscan(idesc); 115 if (ret & STOP) 116 return (ret); 117 } 118 idesc->id_numfrags = sblock.fs_frag; 119 remsize = dino.di_size - sblock.fs_bsize * NDADDR; 120 sizepb = sblock.fs_bsize; 121 for (ap = &dino.di_ib[0], n = 1; n <= NIADDR; ap++, n++) { |
122 sizepb *= NINDIR(&sblock); |
|
120 if (*ap) { 121 idesc->id_blkno = *ap; 122 ret = iblock(idesc, n, remsize); 123 if (ret & STOP) 124 return (ret); 125 } else { | 123 if (*ap) { 124 idesc->id_blkno = *ap; 125 ret = iblock(idesc, n, remsize); 126 if (ret & STOP) 127 return (ret); 128 } else { |
129 idesc->id_lbn += sizepb / sblock.fs_bsize; |
|
126 if (idesc->id_type == DATA && remsize > 0) { 127 /* An empty block in a directory XXX */ 128 getpathname(pathbuf, idesc->id_number, 129 idesc->id_number); 130 pfatal("DIRECTORY %s: CONTAINS EMPTY BLOCKS", 131 pathbuf); 132 if (reply("ADJUST LENGTH") == 1) { 133 dp = ginode(idesc->id_number); 134 dp->di_size -= remsize; 135 remsize = 0; 136 printf( 137 "YOU MUST RERUN FSCK AFTERWARDS\n"); 138 rerun = 1; 139 inodirty(); 140 break; 141 } 142 } 143 } | 130 if (idesc->id_type == DATA && remsize > 0) { 131 /* An empty block in a directory XXX */ 132 getpathname(pathbuf, idesc->id_number, 133 idesc->id_number); 134 pfatal("DIRECTORY %s: CONTAINS EMPTY BLOCKS", 135 pathbuf); 136 if (reply("ADJUST LENGTH") == 1) { 137 dp = ginode(idesc->id_number); 138 dp->di_size -= remsize; 139 remsize = 0; 140 printf( 141 "YOU MUST RERUN FSCK AFTERWARDS\n"); 142 rerun = 1; 143 inodirty(); 144 break; 145 } 146 } 147 } |
144 sizepb *= NINDIR(&sblock); | |
145 remsize -= sizepb; 146 } 147 return (KEEPON); 148} 149 150static int 151iblock(idesc, ilevel, isize) 152 struct inodesc *idesc; --- 4 unchanged lines hidden (view full) --- 157 ufs_daddr_t *aplim; 158 struct bufarea *bp; 159 int i, n, (*func)(), nif; 160 quad_t sizepb; 161 char buf[BUFSIZ]; 162 char pathbuf[MAXPATHLEN + 1]; 163 struct dinode *dp; 164 | 148 remsize -= sizepb; 149 } 150 return (KEEPON); 151} 152 153static int 154iblock(idesc, ilevel, isize) 155 struct inodesc *idesc; --- 4 unchanged lines hidden (view full) --- 160 ufs_daddr_t *aplim; 161 struct bufarea *bp; 162 int i, n, (*func)(), nif; 163 quad_t sizepb; 164 char buf[BUFSIZ]; 165 char pathbuf[MAXPATHLEN + 1]; 166 struct dinode *dp; 167 |
165 if (idesc->id_type == ADDR) { | 168 if (idesc->id_type != DATA) { |
166 func = idesc->id_func; 167 if (((n = (*func)(idesc)) & KEEPON) == 0) 168 return (n); 169 } else 170 func = dirscan; 171 if (chkrange(idesc->id_blkno, idesc->id_numfrags)) 172 return (SKIP); 173 bp = getdatablk(idesc->id_blkno, sblock.fs_bsize); --- 14 unchanged lines hidden (view full) --- 188 *ap = 0; 189 dirty(bp); 190 } 191 } 192 flush(fswritefd, bp); 193 } 194 aplim = &bp->b_un.b_indir[nif]; 195 for (ap = bp->b_un.b_indir; ap < aplim; ap++) { | 169 func = idesc->id_func; 170 if (((n = (*func)(idesc)) & KEEPON) == 0) 171 return (n); 172 } else 173 func = dirscan; 174 if (chkrange(idesc->id_blkno, idesc->id_numfrags)) 175 return (SKIP); 176 bp = getdatablk(idesc->id_blkno, sblock.fs_bsize); --- 14 unchanged lines hidden (view full) --- 191 *ap = 0; 192 dirty(bp); 193 } 194 } 195 flush(fswritefd, bp); 196 } 197 aplim = &bp->b_un.b_indir[nif]; 198 for (ap = bp->b_un.b_indir; ap < aplim; ap++) { |
199 if (ilevel == 0) 200 idesc->id_lbn++; |
|
196 if (*ap) { 197 idesc->id_blkno = *ap; 198 if (ilevel == 0) 199 n = (*func)(idesc); 200 else 201 n = iblock(idesc, ilevel, isize); 202 if (n & STOP) { 203 bp->b_flags &= ~B_INUSE; --- 463 unchanged lines hidden --- | 201 if (*ap) { 202 idesc->id_blkno = *ap; 203 if (ilevel == 0) 204 n = (*func)(idesc); 205 else 206 n = iblock(idesc, ilevel, isize); 207 if (n & STOP) { 208 bp->b_flags &= ~B_INUSE; --- 463 unchanged lines hidden --- |