Module Name:    src
Committed By:   mlelstv
Date:           Wed Aug  4 21:44:42 UTC 2021

Modified Files:
        src/sys/dev/dkwedge: dk.c

Log Message:
Swap and Dump uses DEV_BSIZE units. Translate from device sectors like
regular I/O (strategy).


To generate a diff of this commit:
cvs rdiff -u -r1.105 -r1.106 src/sys/dev/dkwedge/dk.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/dev/dkwedge/dk.c
diff -u src/sys/dev/dkwedge/dk.c:1.105 src/sys/dev/dkwedge/dk.c:1.106
--- src/sys/dev/dkwedge/dk.c:1.105	Wed Jun  2 17:56:40 2021
+++ src/sys/dev/dkwedge/dk.c	Wed Aug  4 21:44:41 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: dk.c,v 1.105 2021/06/02 17:56:40 mlelstv Exp $	*/
+/*	$NetBSD: dk.c,v 1.106 2021/08/04 21:44:41 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.105 2021/06/02 17:56:40 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.106 2021/08/04 21:44:41 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_dkwedge.h"
@@ -1639,6 +1639,7 @@ static int
 dksize(dev_t dev)
 {
 	struct dkwedge_softc *sc = dkwedge_lookup(dev);
+	uint64_t p_size;
 	int rv = -1;
 
 	if (sc == NULL)
@@ -1651,12 +1652,13 @@ dksize(dev_t dev)
 
 	/* Our content type is static, no need to open the device. */
 
+	p_size   = sc->sc_size << sc->sc_parent->dk_blkshift;
 	if (strcmp(sc->sc_ptype, DKW_PTYPE_SWAP) == 0) {
 		/* Saturate if we are larger than INT_MAX. */
-		if (sc->sc_size > INT_MAX)
+		if (p_size > INT_MAX)
 			rv = INT_MAX;
 		else
-			rv = (int) sc->sc_size;
+			rv = (int) p_size;
 	}
 
 	mutex_exit(&sc->sc_parent->dk_rawlock);
@@ -1675,6 +1677,7 @@ dkdump(dev_t dev, daddr_t blkno, void *v
 {
 	struct dkwedge_softc *sc = dkwedge_lookup(dev);
 	const struct bdevsw *bdev;
+	uint64_t p_size, p_offset;
 	int rv = 0;
 
 	if (sc == NULL)
@@ -1697,16 +1700,20 @@ dkdump(dev_t dev, daddr_t blkno, void *v
 		rv = EINVAL;
 		goto out;
 	}
-	if (blkno < 0 || blkno + size / DEV_BSIZE > sc->sc_size) {
+
+	p_offset = sc->sc_offset << sc->sc_parent->dk_blkshift;
+	p_size   = sc->sc_size << sc->sc_parent->dk_blkshift;
+
+	if (blkno < 0 || blkno + size / DEV_BSIZE > p_size) {
 		printf("%s: blkno (%" PRIu64 ") + size / DEV_BSIZE (%zu) > "
-		    "sc->sc_size (%" PRIu64 ")\n", __func__, blkno,
-		    size / DEV_BSIZE, sc->sc_size);
+		    "p_size (%" PRIu64 ")\n", __func__, blkno,
+		    size / DEV_BSIZE, p_size);
 		rv = EINVAL;
 		goto out;
 	}
 
 	bdev = bdevsw_lookup(sc->sc_pdev);
-	rv = (*bdev->d_dump)(sc->sc_pdev, blkno + sc->sc_offset, va, size);
+	rv = (*bdev->d_dump)(sc->sc_pdev, blkno + p_offset, va, size);
 
 out:
 	mutex_exit(&sc->sc_parent->dk_rawlock);

Reply via email to