aboutsummaryrefslogtreecommitdiff
path: root/sbin/fsck_ifs/inode.c
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2000-07-06 02:03:11 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2000-07-06 02:03:11 +0000
commit142d8d2f406cdf3f3bb9ff73c2f09b6cc6f669a4 (patch)
treee3a516356ec5c442750fd8f2fb9a232dc160c131 /sbin/fsck_ifs/inode.c
parent8b158403557f7a0ee714ef5ba33219cd08419456 (diff)
downloadsrc-142d8d2f406cdf3f3bb9ff73c2f09b6cc6f669a4.tar.gz
src-142d8d2f406cdf3f3bb9ff73c2f09b6cc6f669a4.zip
Teach fsck about snapshot files. These changes should have no
effect on operation of fsck on filesystems without snapshots. If you get compilation errors, be sure that you have copies of /usr/include/sys/mount.h (1.94), /usr/include/sys/stat.h (1.21), and /usr/include/ufs/ffs/fs.h (1.16) as of July 4, 2000 or later.
Notes
Notes: svn path=/head/; revision=62668
Diffstat (limited to 'sbin/fsck_ifs/inode.c')
-rw-r--r--sbin/fsck_ifs/inode.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sbin/fsck_ifs/inode.c b/sbin/fsck_ifs/inode.c
index dbf86f760f81..e241cdbbfeb5 100644
--- a/sbin/fsck_ifs/inode.c
+++ b/sbin/fsck_ifs/inode.c
@@ -71,6 +71,7 @@ ckinode(dp, idesc)
if (idesc->id_fix != IGNORE)
idesc->id_fix = DONTKNOW;
+ idesc->id_lbn = -1;
idesc->id_entryno = 0;
idesc->id_filesize = dp->di_size;
mode = dp->di_mode & IFMT;
@@ -80,6 +81,7 @@ ckinode(dp, idesc)
dino = *dp;
ndb = howmany(dino.di_size, sblock.fs_bsize);
for (ap = &dino.di_db[0]; ap < &dino.di_db[NDADDR]; ap++) {
+ idesc->id_lbn++;
if (--ndb == 0 && (offset = blkoff(&sblock, dino.di_size)) != 0)
idesc->id_numfrags =
numfrags(&sblock, fragroundup(&sblock, offset));
@@ -106,7 +108,7 @@ ckinode(dp, idesc)
continue;
}
idesc->id_blkno = *ap;
- if (idesc->id_type == ADDR)
+ if (idesc->id_type != DATA)
ret = (*idesc->id_func)(idesc);
else
ret = dirscan(idesc);
@@ -117,12 +119,14 @@ ckinode(dp, idesc)
remsize = dino.di_size - sblock.fs_bsize * NDADDR;
sizepb = sblock.fs_bsize;
for (ap = &dino.di_ib[0], n = 1; n <= NIADDR; ap++, n++) {
+ sizepb *= NINDIR(&sblock);
if (*ap) {
idesc->id_blkno = *ap;
ret = iblock(idesc, n, remsize);
if (ret & STOP)
return (ret);
} else {
+ idesc->id_lbn += sizepb / sblock.fs_bsize;
if (idesc->id_type == DATA && remsize > 0) {
/* An empty block in a directory XXX */
getpathname(pathbuf, idesc->id_number,
@@ -141,7 +145,6 @@ ckinode(dp, idesc)
}
}
}
- sizepb *= NINDIR(&sblock);
remsize -= sizepb;
}
return (KEEPON);
@@ -162,7 +165,7 @@ iblock(idesc, ilevel, isize)
char pathbuf[MAXPATHLEN + 1];
struct dinode *dp;
- if (idesc->id_type == ADDR) {
+ if (idesc->id_type != DATA) {
func = idesc->id_func;
if (((n = (*func)(idesc)) & KEEPON) == 0)
return (n);
@@ -193,6 +196,8 @@ iblock(idesc, ilevel, isize)
}
aplim = &bp->b_un.b_indir[nif];
for (ap = bp->b_un.b_indir; ap < aplim; ap++) {
+ if (ilevel == 0)
+ idesc->id_lbn++;
if (*ap) {
idesc->id_blkno = *ap;
if (ilevel == 0)