summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1994-10-13 01:09:51 +0000
committerMichael I. Bushnell <mib@gnu.org>1994-10-13 01:09:51 +0000
commit190f91d4bdc364fc06b2cb93bb4b8d2ded7d2607 (patch)
tree73254a85e7c73bd3ba311043fc29f49ee9773b28
parent1758f49fb3a9f9bd422b1f157446e46a4a8654ab (diff)
Initial revision
-rw-r--r--ufs-fsck/inode.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/ufs-fsck/inode.c b/ufs-fsck/inode.c
new file mode 100644
index 00000000..44b79de3
--- /dev/null
+++ b/ufs-fsck/inode.c
@@ -0,0 +1,60 @@
+/* Inode allocation, deallocation, etc.
+ Copyright (C) 1994 Free Software Foundation, Inc.
+ Written by Michael I. Bushnell.
+
+ This file is part of the GNU Hurd.
+
+ The GNU Hurd is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ The GNU Hurd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+static void
+inode_iterate (struct dinode *dp,
+ int (*fn (daddr_t, int)),
+ int doaddrblocks)
+{
+ mode_t mode = dp->di_model & IFMT;
+ int nb, maxb;
+
+ if (mode == IFBLK || mode == IFCHR
+ || (mode == IFLNK && sblock->fs_maxsymlinklen != -1
+ && (dp->di_size < sblock->fs_maxsymlinklen
+ || (sblock->fs_maxsymlinklen == 0 && dp->di_blocks == 0))))
+ return;
+
+ maxb = howmany (dp->di_size, sblock->fs_bsize);
+ for (nb = 0; nb < NDADDR; nb++)
+ {
+ int offset;
+ int nfrags;
+ int cont;
+
+ if (nb == maxb && (offset = blkoff (sblock, dp->di_size)))
+ nfrags = numfrags (sblock, fragroundup (sblock, offset));
+ else
+ nfrags = sblock->fs_frag;
+
+ if (dp->di_db[nb] != 0)
+ if ((*fn)(dp->di_db[nb], nfrags) != RET_GOOD)
+ return;
+ }
+
+ for (nb = 0; nb < NIADDR; nb++)
+ if (scaniblock (dp->di_db[nb], nb) != RET_GOOD)
+ return;
+
+ if (doaddrblocks && dp->di_trans)
+ (*fn)(dp->di_trans, sblock->fs_frag);
+}
+
+