The fsdb(8) utility uses the fsck_ffs(8) disk I/O interfaces, so
switch from using libufs's bread() to using fsck_ffs's getdatablk() when importing tools/diag/prtblnos's prtblknos(). Sponsored by: Netflix
This commit is contained in:
parent
9ad1d357e0
commit
68d7185b64
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=365912
@ -109,6 +109,8 @@ main(int argc, char *argv[])
|
|||||||
sblock_init();
|
sblock_init();
|
||||||
if (!setup(fsys))
|
if (!setup(fsys))
|
||||||
errx(1, "cannot set up file system `%s'", fsys);
|
errx(1, "cannot set up file system `%s'", fsys);
|
||||||
|
if (fswritefd < 0)
|
||||||
|
nflag++;
|
||||||
printf("%s file system `%s'\nLast Mounted on %s\n",
|
printf("%s file system `%s'\nLast Mounted on %s\n",
|
||||||
nflag? "Examining": "Editing", fsys, sblock.fs_fsmnt);
|
nflag? "Examining": "Editing", fsys, sblock.fs_fsmnt);
|
||||||
rval = cmdloop();
|
rval = cmdloop();
|
||||||
|
@ -53,7 +53,7 @@ static const char rcsid[] =
|
|||||||
#include "fsdb.h"
|
#include "fsdb.h"
|
||||||
#include "fsck.h"
|
#include "fsck.h"
|
||||||
|
|
||||||
void prtblknos(struct uufsd *disk, union dinode *dp);
|
void prtblknos(struct fs *fs, union dinode *dp);
|
||||||
|
|
||||||
char **
|
char **
|
||||||
crack(char *line, int *argc)
|
crack(char *line, int *argc)
|
||||||
@ -236,7 +236,7 @@ printactive(int doblocks)
|
|||||||
case IFSOCK:
|
case IFSOCK:
|
||||||
case IFIFO:
|
case IFIFO:
|
||||||
if (doblocks)
|
if (doblocks)
|
||||||
prtblknos(&disk, curinode);
|
prtblknos(&sblock, curinode);
|
||||||
else
|
else
|
||||||
printstat("current inode", curinum, curinode);
|
printstat("current inode", curinum, curinode);
|
||||||
break;
|
break;
|
||||||
|
@ -11,6 +11,8 @@ LIBADD+=ufs
|
|||||||
|
|
||||||
WARNS?= 3
|
WARNS?= 3
|
||||||
|
|
||||||
|
CFLAGS+=-DPRTBLKNOS
|
||||||
|
|
||||||
test: ${PROG}
|
test: ${PROG}
|
||||||
./${PROG} > a
|
./${PROG} > a
|
||||||
|
|
||||||
|
@ -39,14 +39,15 @@ union dinode {
|
|||||||
struct ufs2_dinode *dp2;
|
struct ufs2_dinode *dp2;
|
||||||
};
|
};
|
||||||
|
|
||||||
void prtblknos(struct uufsd *disk, union dinode *dp);
|
void prtblknos(struct fs *fs, union dinode *dp);
|
||||||
|
|
||||||
|
struct uufsd disk;
|
||||||
|
|
||||||
int
|
int
|
||||||
main(argc, argv)
|
main(argc, argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
struct uufsd disk;
|
|
||||||
union dinodep dp;
|
union dinodep dp;
|
||||||
struct fs *fs;
|
struct fs *fs;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
@ -102,7 +103,7 @@ main(argc, argv)
|
|||||||
warn("Read of inode %jd on %s failed: %s",
|
warn("Read of inode %jd on %s failed: %s",
|
||||||
(intmax_t)inonum, fsname, disk.d_error);
|
(intmax_t)inonum, fsname, disk.d_error);
|
||||||
|
|
||||||
prtblknos(&disk, (union dinode *)dp.dp1);
|
prtblknos(fs, (union dinode *)dp.dp1);
|
||||||
}
|
}
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
@ -31,32 +31,37 @@
|
|||||||
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <libufs.h>
|
#include <libufs.h>
|
||||||
|
|
||||||
|
#ifdef PRTBLKNOS
|
||||||
union dinode {
|
union dinode {
|
||||||
struct ufs1_dinode dp1;
|
struct ufs1_dinode dp1;
|
||||||
struct ufs2_dinode dp2;
|
struct ufs2_dinode dp2;
|
||||||
};
|
};
|
||||||
|
extern struct uufsd disk;
|
||||||
|
#else /* used by fsdb */
|
||||||
|
#include <fsck.h>
|
||||||
|
static struct bufarea *bp;
|
||||||
|
#endif
|
||||||
|
|
||||||
void prtblknos(struct uufsd *disk, union dinode *dp);
|
void prtblknos(struct fs *fs, union dinode *dp);
|
||||||
|
|
||||||
static const char *distance(struct fs *, ufs2_daddr_t, ufs2_daddr_t);
|
static const char *distance(struct fs *, ufs2_daddr_t, ufs2_daddr_t);
|
||||||
static void printblk(struct fs *, ufs_lbn_t, ufs2_daddr_t, int, ufs_lbn_t);
|
static void printblk(struct fs *, ufs_lbn_t, ufs2_daddr_t, int, ufs_lbn_t);
|
||||||
static void indirprt(struct uufsd *, int, ufs_lbn_t, ufs_lbn_t, ufs2_daddr_t,
|
static void indirprt(struct fs *, int, ufs_lbn_t, ufs_lbn_t, ufs2_daddr_t,
|
||||||
ufs_lbn_t);
|
ufs_lbn_t);
|
||||||
|
|
||||||
void
|
void
|
||||||
prtblknos(disk, dp)
|
prtblknos(fs, dp)
|
||||||
struct uufsd *disk;
|
struct fs *fs;
|
||||||
union dinode *dp;
|
union dinode *dp;
|
||||||
{
|
{
|
||||||
int i, mode, frags;
|
int i, mode, frags;
|
||||||
ufs_lbn_t lbn, lastlbn, len, blksperindir;
|
ufs_lbn_t lbn, lastlbn, len, blksperindir;
|
||||||
ufs2_daddr_t blkno;
|
ufs2_daddr_t blkno;
|
||||||
struct fs *fs;
|
|
||||||
off_t size;
|
off_t size;
|
||||||
|
|
||||||
fs = (struct fs *)&disk->d_sb;
|
|
||||||
if (fs->fs_magic == FS_UFS1_MAGIC) {
|
if (fs->fs_magic == FS_UFS1_MAGIC) {
|
||||||
size = dp->dp1.di_size;
|
size = dp->dp1.di_size;
|
||||||
mode = dp->dp1.di_mode;
|
mode = dp->dp1.di_mode;
|
||||||
@ -138,7 +143,7 @@ prtblknos(disk, dp)
|
|||||||
blkno = dp->dp1.di_ib[i];
|
blkno = dp->dp1.di_ib[i];
|
||||||
else
|
else
|
||||||
blkno = dp->dp2.di_ib[i];
|
blkno = dp->dp2.di_ib[i];
|
||||||
indirprt(disk, i, blksperindir, lbn, blkno, lastlbn);
|
indirprt(fs, i, blksperindir, lbn, blkno, lastlbn);
|
||||||
blksperindir *= NINDIR(fs);
|
blksperindir *= NINDIR(fs);
|
||||||
lbn += blksperindir;
|
lbn += blksperindir;
|
||||||
len -= blksperindir;
|
len -= blksperindir;
|
||||||
@ -149,8 +154,8 @@ prtblknos(disk, dp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
indirprt(disk, level, blksperindir, lbn, blkno, lastlbn)
|
indirprt(fs, level, blksperindir, lbn, blkno, lastlbn)
|
||||||
struct uufsd *disk;
|
struct fs *fs;
|
||||||
int level;
|
int level;
|
||||||
ufs_lbn_t blksperindir;
|
ufs_lbn_t blksperindir;
|
||||||
ufs_lbn_t lbn;
|
ufs_lbn_t lbn;
|
||||||
@ -158,10 +163,8 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlbn)
|
|||||||
ufs_lbn_t lastlbn;
|
ufs_lbn_t lastlbn;
|
||||||
{
|
{
|
||||||
char indir[MAXBSIZE];
|
char indir[MAXBSIZE];
|
||||||
struct fs *fs;
|
|
||||||
ufs_lbn_t i, last;
|
ufs_lbn_t i, last;
|
||||||
|
|
||||||
fs = (struct fs *)&disk->d_sb;
|
|
||||||
if (blkno == 0) {
|
if (blkno == 0) {
|
||||||
printblk(fs, lbn, blkno,
|
printblk(fs, lbn, blkno,
|
||||||
blksperindir * NINDIR(fs) * fs->fs_frag, lastlbn);
|
blksperindir * NINDIR(fs) * fs->fs_frag, lastlbn);
|
||||||
@ -169,7 +172,14 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlbn)
|
|||||||
}
|
}
|
||||||
printblk(fs, lbn, blkno, fs->fs_frag, -level);
|
printblk(fs, lbn, blkno, fs->fs_frag, -level);
|
||||||
/* read in the indirect block. */
|
/* read in the indirect block. */
|
||||||
if (bread(disk, fsbtodb(fs, blkno), indir, fs->fs_bsize) == -1) {
|
#ifdef PRTBLKNOS
|
||||||
|
if (bread(&disk, fsbtodb(fs, blkno), indir, fs->fs_bsize) == -1) {
|
||||||
|
#else /* used by fsdb */
|
||||||
|
bp = getdatablk(blkno, fs->fs_bsize, BT_LEVEL1 + level);
|
||||||
|
if (bp->b_errs == 0) {
|
||||||
|
memcpy(indir, bp->b_un.b_buf, fs->fs_bsize);
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
warn("Read of indirect block %jd failed", (intmax_t)blkno);
|
warn("Read of indirect block %jd failed", (intmax_t)blkno);
|
||||||
/* List the unreadable part as a hole */
|
/* List the unreadable part as a hole */
|
||||||
printblk(fs, lbn, 0,
|
printblk(fs, lbn, 0,
|
||||||
@ -193,7 +203,7 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlbn)
|
|||||||
blkno = ((ufs1_daddr_t *)indir)[i];
|
blkno = ((ufs1_daddr_t *)indir)[i];
|
||||||
else
|
else
|
||||||
blkno = ((ufs2_daddr_t *)indir)[i];
|
blkno = ((ufs2_daddr_t *)indir)[i];
|
||||||
indirprt(disk, level - 1, blksperindir / NINDIR(fs),
|
indirprt(fs, level - 1, blksperindir / NINDIR(fs),
|
||||||
lbn + blksperindir * i, blkno, lastlbn);
|
lbn + blksperindir * i, blkno, lastlbn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user