Index: ffs_wapbl.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ffs/ffs_wapbl.c,v
retrieving revision 1.13
diff -u -r1.13 ffs_wapbl.c
--- ffs_wapbl.c	13 Sep 2009 14:13:23 -0000	1.13
+++ ffs_wapbl.c	21 Feb 2010 15:28:28 -0000
@@ -45,7 +45,6 @@
 #include <sys/mount.h>
 #include <sys/file.h>
 #include <sys/disk.h>
-#include <sys/disklabel.h>
 #include <sys/ioctl.h>
 #include <sys/errno.h>
 #include <sys/kauth.h>
@@ -80,11 +79,12 @@
 static int wapbl_log_position(struct mount *, struct fs *, struct vnode *,
     daddr_t *, size_t *, size_t *, uint64_t *);
 static int wapbl_create_infs_log(struct mount *, struct fs *, struct vnode *,
-    daddr_t *, size_t *, size_t *, uint64_t *);
+    daddr_t *, size_t *, uint64_t *);
 static void wapbl_find_log_start(struct mount *, struct vnode *, off_t,
     daddr_t *, daddr_t *, size_t *);
 static int wapbl_remove_log(struct mount *);
-static int wapbl_allocate_log_file(struct mount *, struct vnode *);
+static int wapbl_allocate_log_file(struct mount *, struct vnode *,
+    daddr_t *, size_t *, uint64_t *);
 
 /*
  * Return the super block layout format - UFS1 or UFS2.
@@ -330,13 +330,6 @@
 			if (error)
 				return error;
 
-			/* XXX any other consistancy checks here? */
-			if (blksize != DEV_BSIZE) {
-				printf("%s: bad blocksize %zu\n", __func__,
-				    blksize);
-				return EINVAL;
-			}
-
 			error = wapbl_start(&mp->mnt_wapbl, mp, devvp, off,
 			    count, blksize, mp->mnt_wapbl_replay,
 			    ffs_wapbl_sync_metadata,
@@ -502,10 +495,10 @@
     daddr_t *startp, size_t *countp, size_t *blksizep, uint64_t *extradatap)
 {
 	struct ufsmount *ump = VFSTOUFS(mp);
-	struct partinfo dpart;
 	daddr_t logstart, logend, desired_logsize;
-	size_t blksize;
-	int error;
+	uint64_t numsecs;
+	unsigned secsize;
+	int error, location;
 
 	if (fs->fs_journal_version == UFS_WAPBL_VERSION) {
 		switch (fs->fs_journal_location) {
@@ -544,48 +537,51 @@
 
 	/* Is there space after after filesystem on partition for log? */
 	logstart = fsbtodb(fs, fs->fs_size);
-	error = VOP_IOCTL(devvp, DIOCGPART, &dpart, FREAD, FSCRED);
-	if (!error) {
-		logend  = dpart.part->p_size;
-		blksize = dpart.disklab->d_secsize;
-	} else {
-		struct dkwedge_info dkw;
-		error = VOP_IOCTL(devvp, DIOCGWEDGEINFO, &dkw, FREAD, FSCRED);
-		if (error)
-			return error;
-
-		blksize = DEV_BSIZE;
-		logend = dkw.dkw_size;
-	}
+	error = getdisksize(devvp, &numsecs, &secsize);
+	if (error)
+		return error;
+	KDASSERT(secsize != 0);
+	logend = btodb(numsecs * secsize);
 
-	if ((logend - logstart) * blksize >= desired_logsize) {
-		KDASSERT(blksize != 0);
+	if (dbtob(logend - logstart) >= desired_logsize) {
 		DPRINTF("enough space, use end-of-partition log\n");
 
+		location = UFS_WAPBL_JOURNALLOC_END_PARTITION;
+		*blksizep = secsize;
+
 		*startp = logstart;
 		*countp = (logend - logstart);
-		*blksizep = blksize;
 		*extradatap = 0;
 
-		/* update superblock with log location */
-		fs->fs_journal_version = UFS_WAPBL_VERSION;
-		fs->fs_journal_location = UFS_WAPBL_JOURNALLOC_END_PARTITION;
-		fs->fs_journal_flags = 0;
 		fs->fs_journallocs[UFS_WAPBL_EPART_ADDR] = *startp;
 		fs->fs_journallocs[UFS_WAPBL_EPART_COUNT] = *countp;
 		fs->fs_journallocs[UFS_WAPBL_EPART_BLKSZ] = *blksizep;
 		fs->fs_journallocs[UFS_WAPBL_EPART_UNUSED] = *extradatap;
+	} else {
+		DPRINTF("end-of-partition has only %" PRId64 " free\n",
+		    logend - logstart);
 
-		error = ffs_sbupdate(ump, MNT_WAIT);
-		return error;
+		location = UFS_WAPBL_JOURNALLOC_IN_FILESYSTEM;
+		*blksizep = secsize;
+
+		error = wapbl_create_infs_log(mp, fs, devvp,
+		                  startp, countp, extradatap);
+		ffs_sync(mp, MNT_WAIT, FSCRED);
+
+		fs->fs_journallocs[UFS_WAPBL_INFS_ADDR] = *startp;
+		fs->fs_journallocs[UFS_WAPBL_INFS_COUNT] = *countp;
+		fs->fs_journallocs[UFS_WAPBL_INFS_BLKSZ] = *blksizep;
+		fs->fs_journallocs[UFS_WAPBL_INFS_INO] = *extradatap;
 	}
-	DPRINTF("end-of-partition has only %" PRId64 " free\n",
-	    logend - logstart);
 
-	error = wapbl_create_infs_log(mp, fs, devvp, startp, countp, blksizep,
-	    extradatap);
+	if (error == 0) {
+		/* update superblock with log location */
+		fs->fs_journal_version = UFS_WAPBL_VERSION;
+		fs->fs_journal_location = location;
+		fs->fs_journal_flags = 0;
 
-	ffs_sync(mp, MNT_WAIT, FSCRED);
+		error = ffs_sbupdate(ump, MNT_WAIT);
+	}
 
 	return error;
 }
@@ -595,7 +591,7 @@
  */
 static int
 wapbl_create_infs_log(struct mount *mp, struct fs *fs, struct vnode *devvp,
-    daddr_t *startp, size_t *countp, size_t *blksizep, uint64_t *extradatap)
+    daddr_t *startp, size_t *countp, uint64_t *extradatap)
 {
 	struct vnode *vp, *rvp;
 	struct inode *ip;
@@ -621,7 +617,8 @@
 	DIP_ASSIGN(ip, nlink, 1);
 	ffs_update(vp, NULL, NULL, UPDATE_WAIT);
 
-	if ((error = wapbl_allocate_log_file(mp, vp)) != 0) {
+	if ((error = wapbl_allocate_log_file(mp, vp,
+	                 startp, countp, extradatap)) != 0) {
 		/*
 		 * If we couldn't allocate the space for the log file,
 		 * remove the inode by setting its link count back to
@@ -640,16 +637,12 @@
 	 */
 	vput(vp);
 
-	*startp = fs->fs_journallocs[UFS_WAPBL_INFS_ADDR];
-	*countp = fs->fs_journallocs[UFS_WAPBL_INFS_COUNT];
-	*blksizep = fs->fs_journallocs[UFS_WAPBL_INFS_BLKSZ];
-	*extradatap = fs->fs_journallocs[UFS_WAPBL_INFS_INO];
-
 	return 0;
 }
 
 int
-wapbl_allocate_log_file(struct mount *mp, struct vnode *vp)
+wapbl_allocate_log_file(struct mount *mp, struct vnode *vp,
+    daddr_t *startp, size_t *countp, uint64_t *extradatap)
 {
 	struct ufsmount *ump = VFSTOUFS(mp);
 	struct fs *fs = ump->um_fs;
@@ -688,17 +681,11 @@
 		return error;
 	}
 
-	fs->fs_journal_version = UFS_WAPBL_VERSION;
-	fs->fs_journal_location = UFS_WAPBL_JOURNALLOC_IN_FILESYSTEM;
-	fs->fs_journal_flags = 0;
-	fs->fs_journallocs[UFS_WAPBL_INFS_ADDR] =
-	    lfragtosize(fs, addr) / DEV_BSIZE;
-	fs->fs_journallocs[UFS_WAPBL_INFS_COUNT] = logsize / DEV_BSIZE;
-	fs->fs_journallocs[UFS_WAPBL_INFS_BLKSZ] = DEV_BSIZE;
-	fs->fs_journallocs[UFS_WAPBL_INFS_INO] = VTOI(vp)->i_number;
+	*startp     = fsbtodb(fs, addr);
+	*countp     = btodb(logsize);
+	*extradatap = VTOI(vp)->i_number;
 
-	error = ffs_sbupdate(ump, MNT_WAIT);
-	return error;
+	return 0;
 }
 
 /*
