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"

Reply via email to