diff options
-rw-r--r-- | sbin/fsck_ffs/dir.c | 8 | ||||
-rw-r--r-- | sbin/fsck_ffs/fsck.h | 3 | ||||
-rw-r--r-- | sbin/fsck_ffs/fsutil.c | 13 | ||||
-rw-r--r-- | sbin/fsck_ffs/inode.c | 33 | ||||
-rw-r--r-- | sbin/fsck_ffs/pass4.c | 31 |
5 files changed, 41 insertions, 47 deletions
diff --git a/sbin/fsck_ffs/dir.c b/sbin/fsck_ffs/dir.c index 831cf448527b..3cf56d872b72 100644 --- a/sbin/fsck_ffs/dir.c +++ b/sbin/fsck_ffs/dir.c @@ -532,7 +532,7 @@ linkup(ino_t orphan, ino_t parentdir, char *name) } inodirty(dp); idesc.id_type = ADDR; - idesc.id_func = pass4check; + idesc.id_func = freeblock; idesc.id_number = oldlfdir; adjust(&idesc, inoinfo(oldlfdir)->ino_linkcnt + 1); inoinfo(oldlfdir)->ino_linkcnt = 0; @@ -635,6 +635,7 @@ expanddir(union dinode *dp, char *name) { ufs2_daddr_t lastbn, newblk; struct bufarea *bp; + struct inodesc idesc; char *cp, firstblk[DIRBLKSIZ]; lastbn = lblkno(&sblock, DIP(dp, di_size)); @@ -679,7 +680,10 @@ bad: DIP_SET(dp, di_db[lastbn + 1], 0); DIP_SET(dp, di_size, DIP(dp, di_size) - sblock.fs_bsize); DIP_SET(dp, di_blocks, DIP(dp, di_blocks) - btodb(sblock.fs_bsize)); - freeblk(newblk, sblock.fs_frag); + /* Free the block we allocated above */ + idesc.id_blkno = newblk; + idesc.id_numfrags = sblock.fs_frag; + (void)freeblock(&idesc); return (0); } diff --git a/sbin/fsck_ffs/fsck.h b/sbin/fsck_ffs/fsck.h index 38a4e13888bc..8c7fe6d693c9 100644 --- a/sbin/fsck_ffs/fsck.h +++ b/sbin/fsck_ffs/fsck.h @@ -438,7 +438,7 @@ void finalIOstats(void); int findino(struct inodesc *); int findname(struct inodesc *); void flush(int fd, struct bufarea *bp); -void freeblk(ufs2_daddr_t blkno, long frags); +int freeblock(struct inodesc *); void freeino(ino_t ino); void freeinodebuf(void); void fsutilinit(void); @@ -465,7 +465,6 @@ int pass1check(struct inodesc *); void pass2(void); void pass3(void); void pass4(void); -int pass4check(struct inodesc *); void pass5(void); void pfatal(const char *fmt, ...) __printflike(1, 2); void propagate(void); diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c index 94ea2cf792bf..11d2ebd598fd 100644 --- a/sbin/fsck_ffs/fsutil.c +++ b/sbin/fsck_ffs/fsutil.c @@ -800,20 +800,9 @@ allocblk(long frags) } /* - * Free a previously allocated block + * Slow down IO so as to leave some disk bandwidth for other processes */ void -freeblk(ufs2_daddr_t blkno, long frags) -{ - struct inodesc idesc; - - idesc.id_blkno = blkno; - idesc.id_numfrags = frags; - (void)pass4check(&idesc); -} - -/* Slow down IO so as to leave some disk bandwidth for other processes */ -void slowio_start() { diff --git a/sbin/fsck_ffs/inode.c b/sbin/fsck_ffs/inode.c index d930f2f81998..2fcc6414918b 100644 --- a/sbin/fsck_ffs/inode.c +++ b/sbin/fsck_ffs/inode.c @@ -641,6 +641,37 @@ clearentry(struct inodesc *idesc) return (STOP|FOUND|ALTERED); } +int +freeblock(struct inodesc *idesc) +{ + struct dups *dlp; + ufs2_daddr_t blkno; + long nfrags, res; + + res = KEEPON; + blkno = idesc->id_blkno; + for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { + if (chkrange(blkno, 1)) { + res = SKIP; + } else if (testbmap(blkno)) { + for (dlp = duplist; dlp; dlp = dlp->next) { + if (dlp->dup != blkno) + continue; + dlp->dup = duplist->dup; + dlp = duplist; + duplist = duplist->next; + free((char *)dlp); + break; + } + if (dlp == NULL) { + clrbmap(blkno); + n_blks--; + } + } + } + return (res); +} + void prtinode(ino_t ino, union dinode *dp) { @@ -767,7 +798,7 @@ freeino(ino_t ino) memset(&idesc, 0, sizeof(struct inodesc)); idesc.id_type = ADDR; - idesc.id_func = pass4check; + idesc.id_func = freeblock; idesc.id_number = ino; dp = ginode(ino); (void)ckinode(dp, &idesc); diff --git a/sbin/fsck_ffs/pass4.c b/sbin/fsck_ffs/pass4.c index f48bc041af10..925be9f4fb4a 100644 --- a/sbin/fsck_ffs/pass4.c +++ b/sbin/fsck_ffs/pass4.c @@ -58,7 +58,7 @@ pass4(void) memset(&idesc, 0, sizeof(struct inodesc)); idesc.id_type = ADDR; - idesc.id_func = pass4check; + idesc.id_func = freeblock; for (cg = 0; cg < sblock.fs_ncg; cg++) { if (got_siginfo) { printf("%s: phase 4: cyl group %d of %d (%d%%)\n", @@ -124,32 +124,3 @@ pass4(void) } } } - -int -pass4check(struct inodesc *idesc) -{ - struct dups *dlp; - int nfrags, res = KEEPON; - ufs2_daddr_t blkno = idesc->id_blkno; - - for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { - if (chkrange(blkno, 1)) { - res = SKIP; - } else if (testbmap(blkno)) { - for (dlp = duplist; dlp; dlp = dlp->next) { - if (dlp->dup != blkno) - continue; - dlp->dup = duplist->dup; - dlp = duplist; - duplist = duplist->next; - free((char *)dlp); - break; - } - if (dlp == NULL) { - clrbmap(blkno); - n_blks--; - } - } - } - return (res); -} |