svn commit: r339983 - head/sbin/clri

Kirk McKusick mckusick at FreeBSD.org
Thu Nov 1 03:38:58 UTC 2018


Author: mckusick
Date: Thu Nov  1 03:38:57 2018
New Revision: 339983
URL: https://svnweb.freebsd.org/changeset/base/339983

Log:
  In preparation for adding inode check-hashes, convert the clri(8)
  program to use the libufs library interface. No functional change
  (as for now the libufs library does not do inode check-hashes).
  
  Reviewed by:  kib
  Sponsored by: Netflix

Modified:
  head/sbin/clri/clri.c

Modified: head/sbin/clri/clri.c
==============================================================================
--- head/sbin/clri/clri.c	Thu Nov  1 02:10:55 2018	(r339982)
+++ head/sbin/clri/clri.c	Thu Nov  1 03:38:57 2018	(r339983)
@@ -62,6 +62,11 @@ __FBSDID("$FreeBSD$");
 #include <stdio.h>
 #include <unistd.h>
 
+union dinodep {
+	struct ufs1_dinode *dp1;
+	struct ufs2_dinode *dp2;
+};
+
 static void
 usage(void)
 {
@@ -72,81 +77,51 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-	struct fs *fs;
-	struct ufs1_dinode *dp1;
-	struct ufs2_dinode *dp2;
-	char *ibuf[MAXBSIZE];
-	long generation, bsize;
-	off_t offset;
-	int fd, ret, inonum;
+	union dinodep dp;
+	struct uufsd disk;
+	long generation;
+	int inonum, exitval;
 	char *fsname;
-	void *v = ibuf;
 
 	if (argc < 3)
 		usage();
 
-	fsname = *++argv;
-
 	/* get the superblock. */
-	if ((fd = open(fsname, O_RDWR, 0)) < 0)
-		err(1, "%s", fsname);
-	if ((ret = sbget(fd, &fs, -1)) != 0) {
-		switch (ret) {
-		case ENOENT:
-			warn("Cannot find file system superblock");
-			return (1);
-		default:
-			warn("Unable to read file system superblock");
-			return (1);
-		}
+	fsname = *++argv;
+	if (ufs_disk_fillout(&disk, fsname) == -1) {
+		printf("loading superblock: %s\n", disk.d_error);
+		exit (1);
 	}
-	bsize = fs->fs_bsize;
 
 	/* remaining arguments are inode numbers. */
+	exitval = 0;
 	while (*++argv) {
 		/* get the inode number. */
-		if ((inonum = atoi(*argv)) <= 0)
-			errx(1, "%s is not a valid inode number", *argv);
+		if ((inonum = atoi(*argv)) < UFS_ROOTINO) {
+			printf("%s is not a valid inode number", *argv);
+			exitval = 1;
+			continue;
+		}
 		(void)printf("clearing %d\n", inonum);
 
-		/* read in the appropriate block. */
-		offset = ino_to_fsba(fs, inonum);	/* inode to fs blk */
-		offset = fsbtodb(fs, offset);		/* fs blk disk blk */
-		offset *= DEV_BSIZE;			/* disk blk to bytes */
-
-		/* seek and read the block */
-		if (lseek(fd, offset, SEEK_SET) < 0)
-			err(1, "%s", fsname);
-		if (read(fd, ibuf, bsize) != bsize)
-			err(1, "%s", fsname);
-
-		if (fs->fs_magic == FS_UFS2_MAGIC) {
-			/* get the inode within the block. */
-			dp2 = &(((struct ufs2_dinode *)v)
-			    [ino_to_fsbo(fs, inonum)]);
-
-			/* clear the inode, and bump the generation count. */
-			generation = dp2->di_gen + 1;
-			memset(dp2, 0, sizeof(*dp2));
-			dp2->di_gen = generation;
+		if (getino(&disk, (void **)&dp, inonum, NULL) == -1) {
+			printf("getino: %s\n", disk.d_error);
+			exitval = 1;
+			continue;
+		}
+		/* clear the inode, and bump the generation count. */
+		if (disk.d_fs.fs_magic == FS_UFS1_MAGIC) {
+			generation = dp.dp1->di_gen + 1;
+			memset(dp.dp1, 0, sizeof(*dp.dp1));
+			dp.dp1->di_gen = generation;
 		} else {
-			/* get the inode within the block. */
-			dp1 = &(((struct ufs1_dinode *)v)
-			    [ino_to_fsbo(fs, inonum)]);
-
-			/* clear the inode, and bump the generation count. */
-			generation = dp1->di_gen + 1;
-			memset(dp1, 0, sizeof(*dp1));
-			dp1->di_gen = generation;
+			generation = dp.dp2->di_gen + 1;
+			memset(dp.dp2, 0, sizeof(*dp.dp2));
+			dp.dp2->di_gen = generation;
 		}
-
-		/* backup and write the block */
-		if (lseek(fd, (off_t)-bsize, SEEK_CUR) < 0)
-			err(1, "%s", fsname);
-		if (write(fd, ibuf, bsize) != bsize)
-			err(1, "%s", fsname);
-		(void)fsync(fd);
+		putino(&disk);
+		(void)fsync(disk.d_fd);
 	}
-	(void)close(fd);
-	exit(0);
+	(void)ufs_disk_close(&disk);
+	exit(exitval);
 }


More information about the svn-src-all mailing list