svn commit: r332798 - head/tools/diag/prtblknos

Kirk McKusick mckusick at FreeBSD.org
Thu Apr 19 22:43:57 UTC 2018


Author: mckusick
Date: Thu Apr 19 22:43:55 2018
New Revision: 332798
URL: https://svnweb.freebsd.org/changeset/base/332798

Log:
  Fix incorrect output for a file consisting of a single full-size
  block followed by a discontiguous fragment.
  
  Add checks for unallocated inodes and inodes with unknown mode
  types.
  
  Cleanup variable declarations by changing from type `int' to types
  like ufs_lbn_t, ufs2_daddr_t, etc.
  
  Reported by: bde

Modified:
  head/tools/diag/prtblknos/Makefile
  head/tools/diag/prtblknos/main.c
  head/tools/diag/prtblknos/prtblknos.c

Modified: head/tools/diag/prtblknos/Makefile
==============================================================================
--- head/tools/diag/prtblknos/Makefile	Thu Apr 19 22:28:41 2018	(r332797)
+++ head/tools/diag/prtblknos/Makefile	Thu Apr 19 22:43:55 2018	(r332798)
@@ -9,6 +9,8 @@ SRCS=	main.c prtblknos.c
 
 LIBADD+=ufs
 
+WARNS?=	3
+
 test:	${PROG}
 	./${PROG} > a
 

Modified: head/tools/diag/prtblknos/main.c
==============================================================================
--- head/tools/diag/prtblknos/main.c	Thu Apr 19 22:28:41 2018	(r332797)
+++ head/tools/diag/prtblknos/main.c	Thu Apr 19 22:43:55 2018	(r332798)
@@ -53,14 +53,17 @@ main(argc, argv)
 	struct statfs sfb;
 	char *xargv[4];
 	char ibuf[64];
-	char *fsname;
-	int inonum, error;
+	char *fsname, *filename;
+	ino_t inonum;
+	int error;
 
+	filename = NULL;
 	if (argc == 2) {
-		if (stat(argv[1], &sb) != 0)
-			err(1, "stat(%s)", argv[1]);
-		if (statfs(argv[1], &sfb) != 0)
-			err(1, "statfs(%s)", argv[1]);
+		filename = argv[1];
+		if (lstat(filename, &sb) != 0)
+			err(1, "stat(%s)", filename);
+		if (statfs(filename, &sfb) != 0)
+			err(1, "statfs(%s)", filename);
 		xargv[0] = argv[0];
 		xargv[1] = sfb.f_mntfromname;
 		sprintf(ibuf, "%jd", (intmax_t)sb.st_ino);
@@ -87,12 +90,17 @@ main(argc, argv)
 	while (*++argv) {
 		/* get the inode number. */
 		if ((inonum = atoi(*argv)) <= 0 ||
-		     inonum >= fs->fs_ipg * fs->fs_ncg)
+		     inonum >= (ino_t)fs->fs_ipg * fs->fs_ncg)
 			warnx("%s is not a valid inode number", *argv);
-		(void)printf("%d: ", inonum);
+		if (filename == NULL)
+			(void)printf("inode #%jd: ", (intmax_t)inonum);
+		else
+			(void)printf("%s (inode #%jd): ", filename,
+			    (intmax_t)inonum);
 
 		if ((error = getino(&disk, (void **)&dp, inonum, NULL)) < 0)
-			warn("Read of inode %d on %s failed", inonum, fsname);
+			warn("Read of inode %jd on %s failed",
+			    (intmax_t)inonum, fsname);
 
 		prtblknos(&disk, dp);
 	}

Modified: head/tools/diag/prtblknos/prtblknos.c
==============================================================================
--- head/tools/diag/prtblknos/prtblknos.c	Thu Apr 19 22:28:41 2018	(r332797)
+++ head/tools/diag/prtblknos/prtblknos.c	Thu Apr 19 22:43:55 2018	(r332798)
@@ -40,16 +40,18 @@ union dinode {
 
 void prtblknos(struct uufsd *disk, union dinode *dp);
 
-static void  indirprt(struct uufsd *, int, int, int, ufs2_daddr_t, int);
-static char *distance(struct fs *, daddr_t, daddr_t);
-static void  printblk(struct fs *, int, ufs2_daddr_t, int, int);
+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,
+		ufs_lbn_t);
 
 void
 prtblknos(disk, dp)
 	struct uufsd *disk;
 	union dinode *dp;
 {
-	int i, len, lbn, mode, frags, numblks, blksperindir;
+	int i, mode, frags;
+	ufs_lbn_t lbn, lastlbn, len, blksperindir;
 	ufs2_daddr_t blkno;
 	struct fs *fs;
 	off_t size;
@@ -63,6 +65,12 @@ prtblknos(disk, dp)
 		mode = dp->dp2.di_mode;
 	}
 	switch (mode & IFMT) {
+	default:
+		printf("unknown inode type 0%d\n", (mode & IFMT));
+		return;
+	case 0:
+		printf("unallocated inode\n");
+		return;
 	case IFIFO:
 		printf("fifo\n");
 		return;
@@ -97,20 +105,20 @@ prtblknos(disk, dp)
 			printf("empty file\n");
 			return;
 		}
-		printf("regular file, size %ld\n", size);
+		printf("regular file, size %jd\n", (intmax_t)size);
 		break;
 	case IFDIR:
 		if (size == 0) {
 			printf("empty directory\n");
 			return;
 		}
-		printf("directory, size %ld\n", size);
+		printf("directory, size %jd\n", (intmax_t)size);
 		break;
 	}
-	numblks = howmany(size, fs->fs_bsize);
-	len = numblks < UFS_NDADDR ? numblks : UFS_NDADDR;
+	lastlbn = howmany(size, fs->fs_bsize);
+	len = lastlbn < UFS_NDADDR ? lastlbn : UFS_NDADDR;
 	for (i = 0; i < len; i++) {
-		if (i < numblks - 1)
+		if (i < lastlbn - 1)
 			frags = fs->fs_frag;
 		else
 			frags = howmany(size % fs->fs_bsize,
@@ -119,39 +127,39 @@ prtblknos(disk, dp)
 			blkno = dp->dp1.di_db[i];
 		else
 			blkno = dp->dp2.di_db[i];
-		printblk(fs, i, blkno, frags, numblks);
+		printblk(fs, i, blkno, frags, lastlbn);
 	}
 
 	blksperindir = 1;
-	len = numblks - UFS_NDADDR;
+	len = lastlbn - UFS_NDADDR;
 	lbn = UFS_NDADDR;
 	for (i = 0; len > 0 && i < UFS_NIADDR; i++) {
 		if (fs->fs_magic == FS_UFS1_MAGIC)
 			blkno = dp->dp1.di_ib[i];
 		else
 			blkno = dp->dp2.di_ib[i];
-		indirprt(disk, i, blksperindir, lbn, blkno, numblks);
+		indirprt(disk, i, blksperindir, lbn, blkno, lastlbn);
 		blksperindir *= NINDIR(fs);
 		lbn += blksperindir;
 		len -= blksperindir;
 	}
 
 	/* dummy print to flush out last extent */
-	printblk(fs, numblks, 0, frags, 0);
+	printblk(fs, lastlbn, 0, frags, 0);
 }
 
 static void
 indirprt(disk, level, blksperindir, lbn, blkno, lastlbn)
 	struct uufsd *disk;
 	int level;
-	int blksperindir;
-	int lbn;
+	ufs_lbn_t blksperindir;
+	ufs_lbn_t lbn;
 	ufs2_daddr_t blkno;
-	int lastlbn;
+	ufs_lbn_t lastlbn;
 {
 	char indir[MAXBSIZE];
 	struct fs *fs;
-	int i, last;
+	ufs_lbn_t i, last;
 
 	fs = (struct fs *)&disk->d_sb;
 	if (blkno == 0) {
@@ -190,13 +198,13 @@ indirprt(disk, level, blksperindir, lbn, blkno, lastlb
 	}
 }
 
-static char *
+static const char *
 distance(fs, lastblk, firstblk)
 	struct fs *fs;
-	daddr_t lastblk;
-	daddr_t firstblk;
+	ufs2_daddr_t lastblk;
+	ufs2_daddr_t firstblk;
 {
-	daddr_t delta;
+	ufs2_daddr_t delta;
 	int firstcg, lastcg;
 	static char buf[100];
 
@@ -216,28 +224,30 @@ distance(fs, lastblk, firstblk)
 }
 	
 
-static char *indirname[UFS_NIADDR] = { "First", "Second", "Third" };
+static const char *indirname[UFS_NIADDR] = { "First", "Second", "Third" };
 
 static void
-printblk(fs, lbn, blkno, numblks, lastlbn)
+printblk(fs, lbn, blkno, numfrags, lastlbn)
 	struct fs *fs;
-	int lbn;
+	ufs_lbn_t lbn;
 	ufs2_daddr_t blkno;
-	int numblks;
-	int lastlbn;
+	int numfrags;
+	ufs_lbn_t lastlbn;
 {
 	static int seq;
-	static daddr_t lastindirblk, lastblk, firstblk;
+	static ufs2_daddr_t totfrags, lastindirblk, lastblk, firstblk;
 
 	if (lastlbn <= 0)
 		goto flush;
 	if (seq == 0) {
-		seq = howmany(numblks, fs->fs_frag);
+		seq = howmany(numfrags, fs->fs_frag);
+		totfrags = numfrags;
 		firstblk = blkno;
 		return;
 	}
 	if (lbn == 0) {
-		seq = howmany(numblks, fs->fs_frag);
+		seq = howmany(numfrags, fs->fs_frag);
+		totfrags = numfrags;
 		lastblk = 0;
 		firstblk = blkno;
 		lastindirblk = 0;
@@ -247,7 +257,8 @@ printblk(fs, lbn, blkno, numblks, lastlbn)
 	    (firstblk == BLK_NOCOPY && blkno == BLK_NOCOPY) ||
 	    (firstblk == BLK_SNAP && blkno == BLK_SNAP) ||
 	    blkno == firstblk + seq * fs->fs_frag)) {
-		seq += howmany(numblks, fs->fs_frag);
+		seq += howmany(numfrags, fs->fs_frag);
+		totfrags += numfrags;
 		return;
 	}
 flush:
@@ -255,35 +266,36 @@ flush:
 		goto prtindir;
 	if (firstblk <= BLK_SNAP) {
 		if (seq == 1)
-			printf("\tlbn %d %s\n", lbn - seq,
+			printf("\tlbn %jd %s\n", (intmax_t)(lbn - seq),
 			    firstblk == 0 ? "hole" :
 			    firstblk == BLK_NOCOPY ? "nocopy" :
 			    "snapblk");
 		else
-			printf("\tlbn %d-%d %s\n",
-			    lbn - seq, lbn - 1,
+			printf("\tlbn %jd-%jd %s\n",
+			    (intmax_t)lbn - seq, (intmax_t)lbn - 1,
 			    firstblk == 0 ? "hole" :
 			    firstblk == BLK_NOCOPY ? "nocopy" :
 			    "snapblk");
 	} else if (seq == 1) {
-		if (numblks == 1)
-			printf("\tlbn %d blkno %jd%s\n", lbn - seq,
+		if (totfrags == 1)
+			printf("\tlbn %jd blkno %jd%s\n", (intmax_t)(lbn - seq),
 			   (intmax_t)firstblk, distance(fs, lastblk, firstblk));
 		else
-			printf("\tlbn %d blkno %jd-%jd%s\n", lbn - seq,
-			    (intmax_t)firstblk,
-			    (intmax_t)(firstblk + numblks - 1),
+			printf("\tlbn %jd blkno %jd-%jd%s\n",
+			    (intmax_t)(lbn - seq), (intmax_t)firstblk,
+			    (intmax_t)(firstblk + totfrags - 1),
 			    distance(fs, lastblk, firstblk));
-		lastblk = firstblk + numblks - 1;
+		lastblk = firstblk + totfrags - 1;
 	} else {
-		printf("\tlbn %d-%d blkno %jd-%jd%s\n", lbn - seq, lbn - 1,
-		    (intmax_t)firstblk, (intmax_t)(firstblk +
-		    (seq - 1) * fs->fs_frag + numblks - 1),
+		printf("\tlbn %jd-%jd blkno %jd-%jd%s\n", (intmax_t)(lbn - seq),
+		    (intmax_t)(lbn - 1), (intmax_t)firstblk,
+		    (intmax_t)(firstblk + totfrags - 1),
 		    distance(fs, lastblk, firstblk));
-		lastblk = firstblk + (seq - 1) * fs->fs_frag + numblks - 1;
+		lastblk = firstblk + totfrags - 1;
 	}
 	if (lastlbn > 0 || blkno == 0) {
 		seq = 1;
+		totfrags = numfrags;
 		firstblk = blkno;
 		return;
 	}
@@ -291,9 +303,9 @@ prtindir:
 	if (seq != 0 && (fs->fs_metaspace == 0 || lastindirblk == 0))
 		lastindirblk = lastblk;
 	printf("%s-level indirect, blkno %jd-%jd%s\n", indirname[-lastlbn],
-	    (intmax_t)blkno, (intmax_t)(blkno + numblks - 1),
+	    (intmax_t)blkno, (intmax_t)(blkno + numfrags - 1),
 	    distance(fs, lastindirblk, blkno));
-	lastindirblk = blkno + numblks - 1;
+	lastindirblk = blkno + numfrags - 1;
 	if (fs->fs_metaspace == 0)
 		lastblk = lastindirblk;
 	seq = 0;


More information about the svn-src-all mailing list