Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-7]: src/sys/kern Pull up following revision(s) (requested by mlel...



details:   https://anonhg.NetBSD.org/src/rev/465b1b4e62b9
branches:  netbsd-7
changeset: 799560:465b1b4e62b9
user:      martin <martin%NetBSD.org@localhost>
date:      Sun Aug 09 10:15:15 2015 +0000

description:
Pull up following revision(s) (requested by mlelstv in ticket #943):
        sys/kern/vfs_wapbl.c: revision 1.62
Refactor disk address calculation from physical block numbers in
the journal into a function. Make that function work correctly with
sector sizes != DEV_BSIZE when compiled outside the kernel (i.e.
fsck_ffs).
Fixes PR bin/45933

diffstat:

 sys/kern/vfs_wapbl.c |  38 ++++++++++++++++++++++++++++++++------
 1 files changed, 32 insertions(+), 6 deletions(-)

diffs (87 lines):

diff -r 887e8e54f5c9 -r 465b1b4e62b9 sys/kern/vfs_wapbl.c
--- a/sys/kern/vfs_wapbl.c      Sat Aug 08 15:46:48 2015 +0000
+++ b/sys/kern/vfs_wapbl.c      Sun Aug 09 10:15:15 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_wapbl.c,v 1.59 2014/02/25 18:30:11 pooka Exp $     */
+/*     $NetBSD: vfs_wapbl.c,v 1.59.4.1 2015/08/09 10:15:15 martin 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.59 2014/02/25 18:30:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,v 1.59.4.1 2015/08/09 10:15:15 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bitops.h>
@@ -2602,6 +2602,32 @@
 }
 #endif
 
+/*
+ * calculate the disk address for the i'th block in the wc_blockblist
+ * offset by j blocks of size blen.
+ *
+ * wc_daddr is always a kernel disk address in DEV_BSIZE units that
+ * was written to the journal.
+ *
+ * The kernel needs that address plus the offset in DEV_BSIZE units.
+ *
+ * Userland needs that address plus the offset in blen units.
+ *
+ */
+static daddr_t
+wapbl_block_daddr(struct wapbl_wc_blocklist *wc, int i, int j, int blen)
+{
+       daddr_t pbn;
+
+#ifdef _KERNEL
+       pbn = wc->wc_blocks[i].wc_daddr + btodb(j * blen);
+#else
+       pbn = dbtob(wc->wc_blocks[i].wc_daddr) / blen + j;
+#endif
+
+       return pbn;
+}
+
 static void
 wapbl_replay_process_blocks(struct wapbl_replay *wr, off_t *offp)
 {
@@ -2616,7 +2642,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 + btodb(j * fsblklen),
+                       wapbl_blkhash_ins(wr, wapbl_block_daddr(wc, i, j, fsblklen),
                            *offp);
                        wapbl_circ_advance(wr, fsblklen, offp);
                }
@@ -2637,7 +2663,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 + btodb(j * fsblklen));
+                       wapbl_blkhash_rem(wr, wapbl_block_daddr(wc, i, j, fsblklen));
        }
 }
 
@@ -2773,7 +2799,7 @@
                                        for (j = 0; j < n; j++) {
                                                struct wapbl_blk *wb =
                                                   wapbl_blkhash_get(wr,
-                                                  wc->wc_blocks[i].wc_daddr + btodb(j * fsblklen));
+                                                  wapbl_block_daddr(wc, i, j, fsblklen));
                                                if (wb && (wb->wb_off == off)) {
                                                        foundcnt++;
                                                        error =
@@ -2817,7 +2843,7 @@
                                                for (j = 0; j < n; j++) {
                                                        struct wapbl_blk *wb =
                                                           wapbl_blkhash_get(wr,
-                                                          wc->wc_blocks[i].wc_daddr + btodb(j * fsblklen));
+                                                          wapbl_block_daddr(wc, i, j, fsblklen));
                                                        if (wb &&
                                                          (wb->wb_off == off)) {
                                                                wapbl_blkhash_rem(wr, wb->wb_blk);



Home | Main Index | Thread Index | Old Index