Author: mckusick Date: Sat Sep 19 20:06:12 2020 New Revision: 365912 URL: https://svnweb.freebsd.org/changeset/base/365912
Log: 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 Modified: head/sbin/fsdb/fsdb.c head/sbin/fsdb/fsdbutil.c head/tools/diag/prtblknos/Makefile head/tools/diag/prtblknos/main.c head/tools/diag/prtblknos/prtblknos.c Modified: head/sbin/fsdb/fsdb.c ============================================================================== --- head/sbin/fsdb/fsdb.c Sat Sep 19 19:48:15 2020 (r365911) +++ head/sbin/fsdb/fsdb.c Sat Sep 19 20:06:12 2020 (r365912) @@ -109,6 +109,8 @@ main(int argc, char *argv[]) sblock_init(); if (!setup(fsys)) errx(1, "cannot set up file system `%s'", fsys); + if (fswritefd < 0) + nflag++; printf("%s file system `%s'\nLast Mounted on %s\n", nflag? "Examining": "Editing", fsys, sblock.fs_fsmnt); rval = cmdloop(); Modified: head/sbin/fsdb/fsdbutil.c ============================================================================== --- head/sbin/fsdb/fsdbutil.c Sat Sep 19 19:48:15 2020 (r365911) +++ head/sbin/fsdb/fsdbutil.c Sat Sep 19 20:06:12 2020 (r365912) @@ -53,7 +53,7 @@ static const char rcsid[] = #include "fsdb.h" #include "fsck.h" -void prtblknos(struct uufsd *disk, union dinode *dp); +void prtblknos(struct fs *fs, union dinode *dp); char ** crack(char *line, int *argc) @@ -236,7 +236,7 @@ printactive(int doblocks) case IFSOCK: case IFIFO: if (doblocks) - prtblknos(&disk, curinode); + prtblknos(&sblock, curinode); else printstat("current inode", curinum, curinode); break; Modified: head/tools/diag/prtblknos/Makefile ============================================================================== --- head/tools/diag/prtblknos/Makefile Sat Sep 19 19:48:15 2020 (r365911) +++ head/tools/diag/prtblknos/Makefile Sat Sep 19 20:06:12 2020 (r365912) @@ -11,6 +11,8 @@ LIBADD+=ufs WARNS?= 3 +CFLAGS+=-DPRTBLKNOS + test: ${PROG} ./${PROG} > a Modified: head/tools/diag/prtblknos/main.c ============================================================================== --- head/tools/diag/prtblknos/main.c Sat Sep 19 19:48:15 2020 (r365911) +++ head/tools/diag/prtblknos/main.c Sat Sep 19 20:06:12 2020 (r365912) @@ -39,14 +39,15 @@ union dinode { struct ufs2_dinode *dp2; }; -void prtblknos(struct uufsd *disk, union dinode *dp); +void prtblknos(struct fs *fs, union dinode *dp); +struct uufsd disk; + int main(argc, argv) int argc; char *argv[]; { - struct uufsd disk; union dinodep dp; struct fs *fs; struct stat sb; @@ -102,7 +103,7 @@ main(argc, argv) warn("Read of inode %jd on %s failed: %s", (intmax_t)inonum, fsname, disk.d_error); - prtblknos(&disk, (union dinode *)dp.dp1); + prtblknos(fs, (union dinode *)dp.dp1); } exit(0); } Modified: head/tools/diag/prtblknos/prtblknos.c ============================================================================== --- head/tools/diag/prtblknos/prtblknos.c Sat Sep 19 19:48:15 2020 (r365911) +++ head/tools/diag/prtblknos/prtblknos.c Sat Sep 19 20:06:12 2020 (r365912) @@ -31,32 +31,37 @@ #include <err.h> #include <stdio.h> +#include <string.h> #include <libufs.h> +#ifdef PRTBLKNOS union dinode { struct ufs1_dinode dp1; 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 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); void -prtblknos(disk, dp) - struct uufsd *disk; +prtblknos(fs, dp) + struct fs *fs; union dinode *dp; { int i, mode, frags; ufs_lbn_t lbn, lastlbn, len, blksperindir; ufs2_daddr_t blkno; - struct fs *fs; off_t size; - fs = (struct fs *)&disk->d_sb; if (fs->fs_magic == FS_UFS1_MAGIC) { size = dp->dp1.di_size; mode = dp->dp1.di_mode; @@ -138,7 +143,7 @@ prtblknos(disk, dp) blkno = dp->dp1.di_ib[i]; else blkno = dp->dp2.di_ib[i]; - indirprt(disk, i, blksperindir, lbn, blkno, lastlbn); + indirprt(fs, i, blksperindir, lbn, blkno, lastlbn); blksperindir *= NINDIR(fs); lbn += blksperindir; len -= blksperindir; @@ -149,8 +154,8 @@ prtblknos(disk, dp) } static void -indirprt(disk, level, blksperindir, lbn, blkno, lastlbn) - struct uufsd *disk; +indirprt(fs, level, blksperindir, lbn, blkno, lastlbn) + struct fs *fs; int level; ufs_lbn_t blksperindir; ufs_lbn_t lbn; @@ -158,10 +163,8 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlb ufs_lbn_t lastlbn; { char indir[MAXBSIZE]; - struct fs *fs; ufs_lbn_t i, last; - fs = (struct fs *)&disk->d_sb; if (blkno == 0) { printblk(fs, lbn, blkno, blksperindir * NINDIR(fs) * fs->fs_frag, lastlbn); @@ -169,7 +172,14 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlb } printblk(fs, lbn, blkno, fs->fs_frag, -level); /* 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); /* List the unreadable part as a hole */ printblk(fs, lbn, 0, @@ -193,7 +203,7 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlb blkno = ((ufs1_daddr_t *)indir)[i]; else 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); } } _______________________________________________ svn-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"