From owner-p4-projects@FreeBSD.ORG Mon Jun 18 22:11:55 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 65E3D16A46F; Mon, 18 Jun 2007 22:11:55 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 14A5616A46B for ; Mon, 18 Jun 2007 22:11:55 +0000 (UTC) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id F298A13C457 for ; Mon, 18 Jun 2007 22:11:54 +0000 (UTC) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l5IMBsST098985 for ; Mon, 18 Jun 2007 22:11:54 GMT (envelope-from scottl@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l5IMBsq2098972 for perforce@freebsd.org; Mon, 18 Jun 2007 22:11:54 GMT (envelope-from scottl@freebsd.org) Date: Mon, 18 Jun 2007 22:11:54 GMT Message-Id: <200706182211.l5IMBsq2098972@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to scottl@freebsd.org using -f From: Scott Long To: Perforce Change Reviews Cc: Subject: PERFORCE change 121937 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jun 2007 22:11:55 -0000 http://perforce.freebsd.org/chv.cgi?CH=121937 Change 121937 by scottl@scottl-deimos on 2007/06/18 22:11:39 Integrate cam_xpt.h Affected files ... .. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#11 integrate .. //depot/user/scottl/ufsj/src/sbin/tunefs/tunefs.c#5 edit .. //depot/user/scottl/ufsj/src/sys/ufs/ufs/ufs_journal.c#8 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.h#11 (text+ko) ==== @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/cam/cam_xpt.h,v 1.8 2007/04/15 08:49:09 scottl Exp $ + * $FreeBSD: src/sys/cam/cam_xpt.h,v 1.9 2007/05/16 16:54:23 scottl Exp $ */ #ifndef _CAM_CAM_XPT_H @@ -80,6 +80,8 @@ void xpt_rescan(union ccb *ccb); void xpt_lock_buses(void); void xpt_unlock_buses(void); +cam_status xpt_register_async(int event, ac_callback_t *cbfunc, + void *cbarg, struct cam_path *path); cam_status xpt_compile_path(struct cam_path *new_path, struct cam_periph *perph, path_id_t path_id, ==== //depot/user/scottl/ufsj/src/sbin/tunefs/tunefs.c#5 (text+ko) ==== @@ -76,6 +76,7 @@ void usage(void); void printfs(void); int create_journal(struct fs *, const char *dev); +daddr_t get_free_block(struct fs *, int *); int main(int argc, char *argv[]) @@ -442,53 +443,69 @@ int create_journal(struct fs *fs, const char *dev) { - struct ufsj_superblock jsb; - struct ufs_args args; - struct stat jstat; - char jbuf; - int j, error; + struct ufsj_superblock *jsb; + daddr_t jblock, blkno; + uint32_t bavail, maxjblocks, jblocks; + int lastcg; if ((fs->fs_flags & FS_UNCLEAN) || (fs->fs_clean == 0)) { warnx("%s filesystem not clean", dev); return (-1); } - bzero(&args, sizeof(args)); - args.fspec = (char *)dev; - if (mount("ufs", "/mnt", 0, &args) < 0) { - warnx("Could not mount %s: %d", dev, error); - return (error); + /* + * Calculate the journal size + */ + bavail = freespace(fs, fs->fs_minfree); + maxjblocks = (fs->fs_bsize - (sizeof(struct ufsj_superblock) + + sizeof(daddr_t) / sizeof(daddr_t))) / sizeof(daddr_t); + jblocks = MIN(bavail * (1 - fs->fs_minfree), maxjblocks); + printf("bavail= %d, maxjblocks= %d, jblocks= %d\n", bavail, maxjblocks, + jblocks); + + /* + * Allocate the journal superblock + */ + jsb = malloc(fs->fs_bsize); + if (jsb == NULL) { + warnx("Cannot allocate memory for journal\n"); + return (-1); } - j = open("/mnt/.ffsjournal", O_CREAT|O_TRUNC|O_RDWR, 0600); - if (j < 0) { - warnx("Could not open journal file: %d", errno); - return (errno); + /* + * Allocate a block for the journal superblock to reside in. + */ + lastcg = 0; + jblock = get_free_block(fs, &lastcg); + if (jblock == 0) { + free(jsb); + warnx("Cannot allocate journal superblock on %s\n", dev); + return (-1); } - bzero(&jsb, sizeof(struct ufsj_superblock)); - jsb.j_magic = UFSJ_MAGIC; - jsb.j_fsmagic = fs->fs_magic; - jsb.j_flags = J_ENABLED; - write(j, &jsb, sizeof(struct ufsj_superblock)); - if (lseek(j, 1024 * 1024 - 1, SEEK_SET) < 0) { - warnx("Could not seek journal file: %d", errno); - close(j); - unlink("/mnt/.ffsjournal"); - return (EIO); - } - jbuf = 0; - write(j, &jbuf, 1); - close(j); - bzero(&jstat, sizeof(struct stat)); - if (stat("/mnt/.ffsjournal", &jstat) != 0) { - warnx("Could not stat journal file: %d", errno); - unlink("/mnt/.ffsjournal"); - return (EIO); - } - fs->fs_journal_inode = jstat.st_ino; - fs->fs_flags |= FS_JOURNAL; - unmount("/mnt", 0); + return (0); } +daddr_t +get_free_block(struct fs *fs, int *lastcg) +{ +#if 0 + struct cg *cg; + daddr_t fbbaddr; + int i, error; + + for (i = *lastcg; i < fs->fs_ncg; i++) { + if ((error = cgread1(&disk, i)) < 0) { + warnx("Error %d reading cg %d\n", error, i); + return (0); + } + cg = &disk.d_cg; + fbbaddr = cg->cg_freeoff + cgstart(fs, i); + printf("Reading free block bitmap for cg %d at %ld\n", i, fbbaddr); + break; + } +#endif + printf("CGSIZE= %d\n", CGSIZE(fs)); + return (0); +} ==== //depot/user/scottl/ufsj/src/sys/ufs/ufs/ufs_journal.c#8 (text+ko) ==== @@ -124,12 +124,20 @@ printf("Checking journal superblock\n"); jsb = (struct ufsj_superblock *)jbp->b_data; - if ((jsb->j_magic != UFSJ_MAGIC) || (jsb->j_fsmagic != fs->fs_magic) || - ((jsb->j_flags & J_ENABLED) == 0)) { - error = 0; /* XXX Does this really warrant an error? */ + if ((jsb->j_magic != UFSJ_MAGIC) || (jsb->j_fsmagic != fs->fs_magic)) { + printf("v_usecount= %d\n", jvp->v_usecount); + printf("Bad journal magic\n"); + printf("0x%x 0x%x 0x%x 0x%x\n", jsb->j_magic, UFSJ_MAGIC, jsb->j_fsmagic, fs->fs_magic); + error = EINVAL; goto out; } + printf("v_usecount= %d\n", jvp->v_usecount); + if ((jsb->j_flags & J_ENABLED) == 0) { + printf("Journal is not enabled\n"); + error = 0; + goto out; + } journal->gen = jsb->j_gen; journal->start = jsb->j_start; journal->len = jsb->j_len; @@ -143,7 +151,9 @@ ump->um_journal = journal; flags = jsb->j_flags; jvp->v_vflag |= VV_SYSTEM; + printf("v_usecount= %d\n", jvp->v_usecount); brelse(jbp); + printf("v_usecount= %d\n", jvp->v_usecount); jbp = NULL; mtx_init(&journal->jmtx, "jmtx", "Journal lock", MTX_DEF); @@ -161,12 +171,19 @@ printf("Journal started\n"); mp->mnt_flag |= MNT_JOURNAL; + printf("v_usecount= %d\n", jvp->v_usecount); return (0); out: - if (jbp != NULL) + printf("v_usecount= %d\n", jvp->v_usecount); + if (jbp != NULL) { + printf("releasing jbp\n"); brelse(jbp); + } + printf("releasing vnode ref\n"); + printf("v_usecount= %d\n", jvp->v_usecount); vrele(jvp); + printf("v_usecount= %d\n", jvp->v_usecount); free(journal, M_UFSMNT); return (error); } @@ -182,24 +199,28 @@ struct vnode *jvp; int error, jflags; + printf("ufsj_stop: called\n"); + if ((mp->mnt_flag | MNT_JOURNAL) != 0) + return (0); ump = VFSTOUFS(mp); - journal = ump->um_journal; + if ((journal = ump->um_journal) == NULL) + return (0); jflags = 0; jvp = journal->jvp; + jbp = NULL; ufsj_flush(journal); if (journal->head != 0 && journal->tail != 0) { jflags = J_DIRTY; printf("Warning, journal not flushed\n"); - } - - if ((error = VFS_VGET(mp, journal->fs->fs_journal_inode, LK_NOWAIT | - LK_EXCLUSIVE, &jvp)) != 0) { + vput(jvp); + error = EIO; goto out; } printf("ufsj_stop: reading jsb\n"); + VOP_LOCK(jvp, LK_EXCLUSIVE|LK_RETRY, td); if ((error = bread(jvp, journal->jsb_off, JSBLOCKSIZE, NOCRED, &jbp)) == 0) { jsb = (struct ufsj_superblock *)jbp->b_data; @@ -211,11 +232,11 @@ if ((error = bwrite(jbp)) != 0) printf("Error %d writing journal superblock!\n", error); } else { - printf("ufsj_stop: read of sb failed\n"); + printf("ufsj_stop: read of sb failed: %d\n", error); brelse(jbp); } - vn_close(jvp, FREAD|FWRITE, td->td_ucred, td); + vput(jvp); vflush(mp, 0, flags, td); out: @@ -323,6 +344,7 @@ static int ufsj_replay(struct ufs_journal *journal) { + printf("ufsj_replay\n"); return (0); }