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>