Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jun 2007 22:11:54 GMT
From:      Scott Long <scottl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 121937 for review
Message-ID:  <200706182211.l5IMBsq2098972@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



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