Module Name:    src
Committed By:   mlelstv
Date:           Tue Feb 23 20:41:41 UTC 2010

Modified Files:
        src/sys/ufs/ffs: ffs_wapbl.c

Log Message:
Replace individual queries for partition information with
new helper function.
Use this information to query physical sector sizes for WAPBL
instead of hardcoded defaults.
No longer limits physical sector sizes to 512 bytes.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/ufs/ffs/ffs_wapbl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/ufs/ffs/ffs_wapbl.c
diff -u src/sys/ufs/ffs/ffs_wapbl.c:1.13 src/sys/ufs/ffs/ffs_wapbl.c:1.14
--- src/sys/ufs/ffs/ffs_wapbl.c:1.13	Sun Sep 13 14:13:23 2009
+++ src/sys/ufs/ffs/ffs_wapbl.c	Tue Feb 23 20:41:41 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_wapbl.c,v 1.13 2009/09/13 14:13:23 bouyer Exp $	*/
+/*	$NetBSD: ffs_wapbl.c,v 1.14 2010/02/23 20:41:41 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 2003,2006,2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_wapbl.c,v 1.13 2009/09/13 14:13:23 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_wapbl.c,v 1.14 2010/02/23 20:41:41 mlelstv Exp $");
 
 #define WAPBL_INTERNAL
 
@@ -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;
 }
 
 /*

Reply via email to