PERFORCE change 84463 for review
Scott Long
scottl at FreeBSD.org
Wed Sep 28 22:12:55 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=84463
Change 84463 by scottl at 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) {
More information about the p4-projects
mailing list