Module Name:    src
Committed By:   mlelstv
Date:           Sat Feb 27 16:51:03 UTC 2010

Modified Files:
        src/sys/kern: vfs_wapbl.c

Log Message:
Move block number computations to callers of wapl_read/wapl_write and
conditionally build DEV_BSIZE adjustments for kernel. fsck_ffs shares
the same code but accesses physical blocks.

Also compute correct block numbers for each physical sector.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/kern/vfs_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.33 src/sys/kern/vfs_wapbl.c:1.34
--- src/sys/kern/vfs_wapbl.c:1.33	Sat Feb 27 12:04:19 2010
+++ src/sys/kern/vfs_wapbl.c	Sat Feb 27 16:51:03 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_wapbl.c,v 1.33 2010/02/27 12:04:19 mlelstv Exp $	*/
+/*	$NetBSD: vfs_wapbl.c,v 1.34 2010/02/27 16:51:03 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.33 2010/02/27 12:04:19 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.34 2010/02/27 16:51:03 mlelstv Exp $");
 
 #include <sys/param.h>
 #include <sys/bitops.h>
@@ -344,10 +344,6 @@
 	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 */
 
 	/*
@@ -383,7 +379,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 * DEV_BSIZE) - wl->wl_circ_off);
+	wl->wl_circ_size = ((count * blksize) - 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;
@@ -740,6 +736,7 @@
 	size_t slen;
 	off_t off = *offp;
 	int error;
+	daddr_t pbn;
 
 	KDASSERT(((len >> wl->wl_log_dev_bshift) <<
 	    wl->wl_log_dev_bshift) == len);
@@ -748,16 +745,22 @@
 		off = wl->wl_circ_off;
 	slen = wl->wl_circ_off + wl->wl_circ_size - off;
 	if (slen < len) {
-		error = wapbl_write(data, slen, wl->wl_devvp,
-		    wl->wl_logpbn + btodb(off));
+		pbn = wl->wl_logpbn + (off >> wl->wl_log_dev_bshift);
+#ifdef _KERNEL
+		pbn = btodb(pbn << wl->wl_log_dev_bshift);
+#endif
+		error = wapbl_write(data, slen, wl->wl_devvp, pbn);
 		if (error)
 			return error;
 		data = (uint8_t *)data + slen;
 		len -= slen;
 		off = wl->wl_circ_off;
 	}
-	error = wapbl_write(data, len, wl->wl_devvp,
-			    wl->wl_logpbn + btodb(off));
+	pbn = wl->wl_logpbn + (off >> wl->wl_log_dev_bshift);
+#ifdef _KERNEL
+	pbn = btodb(pbn << wl->wl_log_dev_bshift);
+#endif
+	error = wapbl_write(data, len, wl->wl_devvp, pbn);
 	if (error)
 		return error;
 	off += len;
@@ -1832,6 +1835,7 @@
 	struct timespec ts;
 	int error;
 	int force = 1;
+	daddr_t pbn;
 
 	/* XXX Calc checksum here, instead we do this for now */
 	error = VOP_IOCTL(wl->wl_devvp, DIOCCACHESYNC, &force, FWRITE, FSCRED);
@@ -1858,9 +1862,11 @@
 	 * over second commit header before trying to write both headers.
 	 */
 
-	error = wapbl_write(wc, wc->wc_len, wl->wl_devvp,
-	    wl->wl_logpbn +
-	    ((wc->wc_generation % 2) << (wc->wc_log_dev_bshift - DEV_BSHIFT)));
+	pbn = wl->wl_logpbn + (wc->wc_generation % 2);
+#ifdef _KERNEL
+	pbn = btodb(pbn << wc->wc_log_dev_bshift);
+#endif
+	error = wapbl_write(wc, wc->wc_len, wl->wl_devvp, pbn);
 	if (error)
 		return error;
 
@@ -2183,23 +2189,31 @@
 	size_t slen;
 	off_t off = *offp;
 	int error;
+	daddr_t pbn;
 
 	KASSERT(((len >> wr->wr_log_dev_bshift) <<
 	    wr->wr_log_dev_bshift) == len);
+
 	if (off < wr->wr_circ_off)
 		off = wr->wr_circ_off;
 	slen = wr->wr_circ_off + wr->wr_circ_size - off;
 	if (slen < len) {
-		error = wapbl_read(data, slen, wr->wr_devvp,
-		    wr->wr_logpbn + (off >> wr->wr_log_dev_bshift));
+		pbn = wr->wr_logpbn + (off >> wr->wr_log_dev_bshift);
+#ifdef _KERNEL
+		pbn = btodb(pbn << wr->wr_log_dev_bshift);
+#endif
+		error = wapbl_read(data, slen, wr->wr_devvp, pbn);
 		if (error)
 			return error;
 		data = (uint8_t *)data + slen;
 		len -= slen;
 		off = wr->wr_circ_off;
 	}
-	error = wapbl_read(data, len, wr->wr_devvp,
-	    wr->wr_logpbn + (off >> wr->wr_log_dev_bshift));
+	pbn = wr->wr_logpbn + (off >> wr->wr_log_dev_bshift);
+#ifdef _KERNEL
+	pbn = btodb(pbn << wr->wr_log_dev_bshift);
+#endif
+	error = wapbl_read(data, len, wr->wr_devvp, pbn);
 	if (error)
 		return error;
 	off += len;
@@ -2247,6 +2261,7 @@
 	/* Use this until we read the actual log header */
 	int log_dev_bshift = ilog2(blksize);
 	size_t used;
+	daddr_t pbn;
 
 	WAPBL_PRINTF(WAPBL_PRINT_REPLAY,
 	    ("wapbl_replay_start: vp=%p off=%"PRId64 " count=%zu blksize=%zu\n",
@@ -2261,10 +2276,6 @@
 		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
@@ -2272,7 +2283,6 @@
 	if ((off + count) * blksize > vp->v_size)
 		return EINVAL;
 #endif
-
 	if ((error = VOP_BMAP(vp, off, &devvp, &logpbn, 0)) != 0) {
 		return error;
 	}
@@ -2283,7 +2293,11 @@
 
 	scratch = wapbl_malloc(MAXBSIZE);
 
-	error = wapbl_read(scratch, 2<<log_dev_bshift, devvp, logpbn);
+	pbn = logpbn;
+#ifdef _KERNEL
+	pbn = btodb(pbn << log_dev_bshift);
+#endif
+	error = wapbl_read(scratch, 2<<log_dev_bshift, devvp, pbn);
 	if (error)
 		goto errout;
 
@@ -2392,7 +2406,7 @@
 		 */
 		n = wc->wc_blocks[i].wc_dlen >> wr->wr_fs_dev_bshift;
 		for (j = 0; j < n; j++) {
-			wapbl_blkhash_ins(wr, wc->wc_blocks[i].wc_daddr + j,
+			wapbl_blkhash_ins(wr, wc->wc_blocks[i].wc_daddr + btodb(j * fsblklen),
 			    *offp);
 			wapbl_circ_advance(wr, fsblklen, offp);
 		}
@@ -2404,6 +2418,7 @@
 {
 	struct wapbl_wc_blocklist *wc =
 	    (struct wapbl_wc_blocklist *)wr->wr_scratch;
+	int fsblklen = 1 << wr->wr_fs_dev_bshift;
 	int i, j, n;
 
 	for (i = 0; i < wc->wc_blkcount; i++) {
@@ -2412,7 +2427,7 @@
 		 */
 		n = wc->wc_blocks[i].wc_dlen >> wr->wr_fs_dev_bshift;
 		for (j = 0; j < n; j++)
-			wapbl_blkhash_rem(wr, wc->wc_blocks[i].wc_daddr + j);
+			wapbl_blkhash_rem(wr, wc->wc_blocks[i].wc_daddr + btodb(j * fsblklen));
 	}
 }
 
@@ -2548,7 +2563,7 @@
 					for (j = 0; j < n; j++) {
 						struct wapbl_blk *wb =
 						   wapbl_blkhash_get(wr,
-						   wc->wc_blocks[i].wc_daddr + j);
+						   wc->wc_blocks[i].wc_daddr + btodb(j * fsblklen));
 						if (wb && (wb->wb_off == off)) {
 							foundcnt++;
 							error =
@@ -2592,7 +2607,7 @@
 						for (j = 0; j < n; j++) {
 							struct wapbl_blk *wb =
 							   wapbl_blkhash_get(wr,
-							   wc->wc_blocks[i].wc_daddr + j);
+							   wc->wc_blocks[i].wc_daddr + btodb(j * fsblklen));
 							if (wb &&
 							  (wb->wb_off == off)) {
 								wapbl_blkhash_rem(wr, wb->wb_blk);

Reply via email to