Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sbin/fsdb fix blks command.
details: https://anonhg.NetBSD.org/src/rev/b426c6de731c
branches: trunk
changeset: 570003:b426c6de731c
user: yamt <yamt%NetBSD.org@localhost>
date: Fri Sep 17 12:18:55 2004 +0000
description:
fix blks command.
- use 64-bit variables for lbns.
- correct file block offsets in the case of absent indirect blocks.
diffstat:
sbin/fsdb/fsdb.c | 78 +++++++++++++++++++++++++++++--------------------------
1 files changed, 41 insertions(+), 37 deletions(-)
diffs (180 lines):
diff -r 901459dbe974 -r b426c6de731c sbin/fsdb/fsdb.c
--- a/sbin/fsdb/fsdb.c Fri Sep 17 10:55:07 2004 +0000
+++ b/sbin/fsdb/fsdb.c Fri Sep 17 12:18:55 2004 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fsdb.c,v 1.28 2004/01/04 00:13:00 wiz Exp $ */
+/* $NetBSD: fsdb.c,v 1.29 2004/09/17 12:18:55 yamt Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: fsdb.c,v 1.28 2004/01/04 00:13:00 wiz Exp $");
+__RCSID("$NetBSD: fsdb.c,v 1.29 2004/09/17 12:18:55 yamt Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -77,10 +77,12 @@
static int chinumfunc __P((struct inodesc *));
static int chnamefunc __P((struct inodesc *));
static int dotime __P((char *, int32_t *, int32_t *));
-static void print_blks32 __P((int32_t *buf, int size, int *blknum));
-static void print_blks64 __P((int64_t *buf, int size, int *blknum));
-static void print_indirblks32 __P((uint32_t blk, int ind_level, int *blknum));
-static void print_indirblks64 __P((uint64_t blk, int ind_level, int *blknum));
+static void print_blks32 __P((int32_t *buf, int size, uint64_t *blknum));
+static void print_blks64 __P((int64_t *buf, int size, uint64_t *blknum));
+static void print_indirblks32 __P((uint32_t blk, int ind_level,
+ uint64_t *blknum));
+static void print_indirblks64 __P((uint64_t blk, int ind_level,
+ uint64_t *blknum));
static int compare_blk32 __P((uint32_t *, uint32_t));
static int compare_blk64 __P((uint64_t *, uint64_t));
static int founddatablk __P((uint64_t));
@@ -463,7 +465,7 @@
CMDFUNCSTART(blks)
{
- int blkno = 0;
+ uint64_t blkno = 0;
int i, type;
if (!curinode) {
warnx("no current inode");
@@ -488,19 +490,13 @@
print_blks32(curinode->dp1.di_db, NDADDR, &blkno);
if (is_ufs2) {
- for (i = 0; i < NIADDR; i++) {
- if (curinode->dp2.di_ib[i] != 0)
- print_indirblks64(
- iswap64(curinode->dp2.di_ib[i]), i,
- &blkno);
- }
+ for (i = 0; i < NIADDR; i++)
+ print_indirblks64(iswap64(curinode->dp2.di_ib[i]), i,
+ &blkno);
} else {
- for (i = 0; i < NIADDR; i++) {
- if (curinode->dp1.di_ib[i] != 0)
- print_indirblks32(
- iswap32(curinode->dp1.di_ib[i]), i,
- &blkno);
- }
+ for (i = 0; i < NIADDR; i++)
+ print_indirblks32(iswap32(curinode->dp1.di_ib[i]), i,
+ &blkno);
}
return 0;
}
@@ -775,7 +771,7 @@
print_blks32(buf, size, blknum)
int32_t *buf;
int size;
- int *blknum;
+ uint64_t *blknum;
{
int chars;
char prbuf[CHARS_PER_LINES+1];
@@ -791,7 +787,7 @@
chars = 0;
}
if (chars == 0)
- printf("%d: ", *blknum);
+ printf("%" PRIu64 ": ", *blknum);
printf("%s", prbuf);
chars += strlen(prbuf);
}
@@ -802,7 +798,7 @@
print_blks64(buf, size, blknum)
int64_t *buf;
int size;
- int *blknum;
+ uint64_t *blknum;
{
int chars;
char prbuf[CHARS_PER_LINES+1];
@@ -819,7 +815,7 @@
chars = 0;
}
if (chars == 0)
- printf("%d: ", *blknum);
+ printf("%" PRIu64 ": ", *blknum);
printf("%s", prbuf);
chars += strlen(prbuf);
}
@@ -832,25 +828,29 @@
print_indirblks32(blk,ind_level, blknum)
uint32_t blk;
int ind_level;
- int *blknum;
+ uint64_t *blknum;
{
#define MAXNINDIR (MAXBSIZE / sizeof(int32_t))
+ const int ptrperblk_shift = sblock->fs_bshift - 2;
+ const int ptrperblk = 1 << ptrperblk_shift;
int32_t idblk[MAXNINDIR];
int i;
+
+ if (blk == 0) {
+ *blknum += (uint64_t)ptrperblk << (ptrperblk_shift * ind_level);
+ return;
+ }
printf("Indirect block %lld (level %d):\n", (long long)blk,
ind_level+1);
bread(fsreadfd, (char *)idblk, fsbtodb(sblock, blk),
(int)sblock->fs_bsize);
if (ind_level <= 0) {
- print_blks32(idblk, sblock->fs_bsize / sizeof(int32_t), blknum);
+ print_blks32(idblk, ptrperblk, blknum);
} else {
ind_level--;
- for (i = 0; i < sblock->fs_bsize / sizeof(int32_t); i++) {
- if(idblk[i] != 0)
- print_indirblks32(iswap32(idblk[i]),
- ind_level, blknum);
- }
+ for (i = 0; i < ptrperblk; i++)
+ print_indirblks32(iswap32(idblk[i]), ind_level, blknum);
}
#undef MAXNINDIR
}
@@ -859,25 +859,29 @@
print_indirblks64(blk,ind_level, blknum)
uint64_t blk;
int ind_level;
- int *blknum;
+ uint64_t *blknum;
{
#define MAXNINDIR (MAXBSIZE / sizeof(int64_t))
+ const int ptrperblk_shift = sblock->fs_bshift - 3;
+ const int ptrperblk = 1 << ptrperblk_shift;
int64_t idblk[MAXNINDIR];
int i;
+
+ if (blk == 0) {
+ *blknum += (uint64_t)ptrperblk << (ptrperblk_shift * ind_level);
+ return;
+ }
printf("Indirect block %lld (level %d):\n", (long long)blk,
ind_level+1);
bread(fsreadfd, (char *)idblk, fsbtodb(sblock, blk),
(int)sblock->fs_bsize);
if (ind_level <= 0) {
- print_blks64(idblk, sblock->fs_bsize / sizeof(int64_t), blknum);
+ print_blks64(idblk, ptrperblk, blknum);
} else {
ind_level--;
- for (i = 0; i < sblock->fs_bsize / sizeof(int64_t); i++) {
- if(idblk[i] != 0)
- print_indirblks64(iswap64(idblk[i]),
- ind_level, blknum);
- }
+ for (i = 0; i < ptrperblk; i++)
+ print_indirblks64(iswap64(idblk[i]), ind_level, blknum);
}
#undef MAXNINDIR
}
Home |
Main Index |
Thread Index |
Old Index