Module Name: src Committed By: mlelstv Date: Sat Feb 27 12:04:20 UTC 2010
Modified Files: src/sys/kern: vfs_wapbl.c src/sys/ufs/ffs: ffs_wapbl.c Log Message: Store physical block numbers in superblock that point to the journal. Calculate position of both commit headers correctly for disks with large sectors. Correct calculation of circular buffer size. To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/kern/vfs_wapbl.c cvs rdiff -u -r1.14 -r1.15 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/kern/vfs_wapbl.c diff -u src/sys/kern/vfs_wapbl.c:1.32 src/sys/kern/vfs_wapbl.c:1.33 --- src/sys/kern/vfs_wapbl.c:1.32 Fri Feb 26 22:24:07 2010 +++ src/sys/kern/vfs_wapbl.c Sat Feb 27 12:04:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_wapbl.c,v 1.32 2010/02/26 22:24:07 mlelstv Exp $ */ +/* $NetBSD: vfs_wapbl.c,v 1.33 2010/02/27 12:04:19 mlelstv Exp $ */ /*- * Copyright (c) 2003, 2008, 2009 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #define WAPBL_INTERNAL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.32 2010/02/26 22:24:07 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.33 2010/02/27 12:04:19 mlelstv Exp $"); #include <sys/param.h> #include <sys/bitops.h> @@ -344,6 +344,10 @@ if (blksize % DEV_BSIZE) return EINVAL; + /* Kernel uses DEV_BSIZE units */ + off = btodb(off << log_dev_bshift); + count = btodb(count << log_dev_bshift); + /* XXXTODO: verify that the full load is writable */ /* @@ -379,7 +383,7 @@ /* Reserve two log device blocks for the commit headers */ wl->wl_circ_off = 2<<wl->wl_log_dev_bshift; - wl->wl_circ_size = ((count * blksize) - wl->wl_circ_off); + wl->wl_circ_size = ((count * DEV_BSIZE) - wl->wl_circ_off); /* truncate the log usage to a multiple of log_dev_bshift */ wl->wl_circ_size >>= wl->wl_log_dev_bshift; wl->wl_circ_size <<= wl->wl_log_dev_bshift; @@ -1855,7 +1859,8 @@ */ error = wapbl_write(wc, wc->wc_len, wl->wl_devvp, - wl->wl_logpbn + wc->wc_generation % 2); + wl->wl_logpbn + + ((wc->wc_generation % 2) << (wc->wc_log_dev_bshift - DEV_BSHIFT))); if (error) return error; @@ -2256,6 +2261,10 @@ return EINVAL; #ifdef _KERNEL + /* Kernel uses DEV_BSIZE units */ + off = btodb(off << log_dev_bshift); + count = btodb(count << log_dev_bshift); + #if 0 /* XXX vp->v_size isn't reliably set for VBLK devices, * especially root. However, we might still want to verify Index: src/sys/ufs/ffs/ffs_wapbl.c diff -u src/sys/ufs/ffs/ffs_wapbl.c:1.14 src/sys/ufs/ffs/ffs_wapbl.c:1.15 --- src/sys/ufs/ffs/ffs_wapbl.c:1.14 Tue Feb 23 20:41:41 2010 +++ src/sys/ufs/ffs/ffs_wapbl.c Sat Feb 27 12:04:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_wapbl.c,v 1.14 2010/02/23 20:41:41 mlelstv Exp $ */ +/* $NetBSD: ffs_wapbl.c,v 1.15 2010/02/27 12:04:19 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.14 2010/02/23 20:41:41 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_wapbl.c,v 1.15 2010/02/27 12:04:19 mlelstv Exp $"); #define WAPBL_INTERNAL @@ -553,6 +553,10 @@ *countp = (logend - logstart); *extradatap = 0; + /* convert to physical block numbers */ + *startp = dbtob(*startp) / secsize; + *countp = dbtob(*countp) / secsize; + fs->fs_journallocs[UFS_WAPBL_EPART_ADDR] = *startp; fs->fs_journallocs[UFS_WAPBL_EPART_COUNT] = *countp; fs->fs_journallocs[UFS_WAPBL_EPART_BLKSZ] = *blksizep; @@ -568,6 +572,10 @@ startp, countp, extradatap); ffs_sync(mp, MNT_WAIT, FSCRED); + /* convert to physical block numbers */ + *startp = dbtob(*startp) / secsize; + *countp = dbtob(*countp) / secsize; + fs->fs_journallocs[UFS_WAPBL_INFS_ADDR] = *startp; fs->fs_journallocs[UFS_WAPBL_INFS_COUNT] = *countp; fs->fs_journallocs[UFS_WAPBL_INFS_BLKSZ] = *blksizep;