Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Sep 2005 05:12:54 GMT
From:      Scott Long <scottl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 84463 for review
Message-ID:  <200509290512.j8T5CsZV090869@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=84463

Change 84463 by scottl@scottl-junior on 2005/09/29 05:12:10

	Crudely hack tunefs so that it can create its own journal file.

Affected files ...

.. //depot/projects/soc2005/ufsj/src/sbin/tunefs/tunefs.c#5 edit

Differences ...

==== //depot/projects/soc2005/ufsj/src/sbin/tunefs/tunefs.c#5 (text+ko) ====

@@ -75,17 +75,64 @@
 void usage(void);
 void printfs(void);
 
+ino_t
+create_journal(void)
+{
+	struct stat sb;
+	struct statfs fs;
+	struct ufs_args args;
+	struct ufsj_superblock *jsb;
+	int fd, jsize, i;
+	uint64_t jblocks;
+
+	args.fspec = (void *)disk.d_name;
+	if (mount("ufs", "/mnt", 0, &args) < 0)
+		err(1, "%s", disk.d_name);
+	if (stat("/mnt/.jounal", &sb) == 0) {
+		unlink("/mnt/.journal");
+	}
+
+	if (statfs("/mnt", &fs) < 0)
+		err(1, "%s", disk.d_name);
+	jblocks = fs.f_blocks * .01;
+
+	fd = open("/mnt/.journal", O_RDWR | O_CREAT);
+	if (fd < 0)
+		err(1, "%s", disk.d_name);
+
+	jsb = malloc(512);
+	memset(jsb, 0, 512);
+	for (i = 0; i < jblocks; i++) {
+		write(fd, jsb, 512);
+	}
+	lseek(fd, 0, SEEK_SET);
+	free(jsb);
+
+	jsize = sizeof(struct ufsj_superblock);
+	jsb = (struct ufsj_superblock *)malloc(jsize);
+	memset(jsb, 0, jsize);
+	jsb->j_magic = UFSJ_MAGIC;
+	jsb->j_fsmagic = 0x19540119;
+	jsb->j_flags = J_ENABLED;
+	write(fd, jsb, jsize);
+	close(fd);
+	free(jsb);
+	unmount("/mnt", 0);
+
+	stat("/mnt/.journal", &sb);
+	return (sb.st_ino);
+}
+
 int
 main(int argc, char *argv[])
 {
-	char *avalue, *Lvalue, *lvalue, *nvalue;
+	char *avalue, *jvalue, *Lvalue, *lvalue, *nvalue;
 	const char *special, *on;
 	const char *name;
 	int active;
 	int Aflag, aflag, eflag, evalue, fflag, fvalue, Lflag, lflag;
 	int mflag, mvalue, nflag, oflag, ovalue, pflag, sflag, svalue;
 	int ch, found_arg, i;
-	ino_t jvalue;
 	int jflag;
 	const char *chg[2];
 	struct ufs_args args;
@@ -95,9 +142,9 @@
 		usage();
 	Aflag = aflag = eflag = fflag = Lflag = lflag = mflag = 0;
 	nflag = oflag = pflag = sflag = 0;
-	avalue = Lvalue = lvalue = nvalue = NULL;
+	avalue = jvalue = Lvalue = lvalue = nvalue = NULL;
 	evalue = fvalue = mvalue = ovalue = svalue = 0;
-	jvalue = jflag = 0;
+	jflag = 0;
 	active = 0;
 	found_arg = 0;		/* At least one arg is required. */
 	while ((ch = getopt(argc, argv, "Aa:e:f:j:L:l:m:n:o:ps:")) != -1)
@@ -143,9 +190,12 @@
 		case 'j':
 			found_arg = 1;
 			name = "journalling";
-			jvalue = strtoul(optarg, NULL, 0);
-			if ((jvalue == 1) || (jvalue == 2))
-				errx(10, "Inode value cannot be 1 or 2");
+			jvalue = optarg;
+			if (strcmp(jvalue, "enable") != 0 &&
+			    strcmp(jvalue, "disable") != 0) {
+				errx(10, "bad %s (options are %s)",
+				    name, "`enable' or `disable'");
+			}
 			jflag = 1;
 			break;
 		case 'L':
@@ -297,13 +347,28 @@
 	}
 	if (jflag) {
 		name = "journalling";
-		if (jvalue == 0) {
+		if (strcmp(jvalue, "enable") == 0) {
+			ino_t jino;
+
+			if (sblock.fs_flags & FS_JOURNAL) {
+				warnx("%s remains unchanges as enabled", name);
+			} else if (sblock.fs_clean == 0) {
+				warnx("%s cannot be enabled until fsck is run",
+				    name);
+			} else if (sblock.fs_flags & FS_DOSOFTDEP) {
+				warnx("Soft updates is already enabled, cannot "
+				    "enable %s", name);
+			} else {
+				/* XXX Create journal file */
+				jino = create_journal();
+				/* set journal inode to the journal file */
+				sblock.fs_journal_inode = jino;
+				sblock.fs_flags |= FS_JOURNAL;
+			}
+		} else if (strcmp(jvalue, "disable") == 0) {
 			sblock.fs_flags &= ~FS_JOURNAL;
-		} else if (sblock.fs_flags & FS_DOSOFTDEP) {
-			warnx("Soft updates is already enabled, cannot journal.");
-		} else {
-			sblock.fs_flags |= FS_JOURNAL;
-			sblock.fs_journal_inode = jvalue;
+			sblock.fs_journal_inode = 0;
+			/* XXX delete the journal file */
 		}
 	}
 	if (lflag) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509290512.j8T5CsZV090869>