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);