Module Name: src Committed By: mlelstv Date: Sat May 12 10:33:06 UTC 2018
Modified Files: src/sys/dev: dksubr.c src/sys/dev/dkwedge: dk.c Log Message: Support dump on wedges. To generate a diff of this commit: cvs rdiff -u -r1.101 -r1.102 src/sys/dev/dksubr.c cvs rdiff -u -r1.96 -r1.97 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/dksubr.c diff -u src/sys/dev/dksubr.c:1.101 src/sys/dev/dksubr.c:1.102 --- src/sys/dev/dksubr.c:1.101 Mon Dec 4 22:15:52 2017 +++ src/sys/dev/dksubr.c Sat May 12 10:33:06 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dksubr.c,v 1.101 2017/12/04 22:15:52 jdolecek Exp $ */ +/* $NetBSD: dksubr.c,v 1.102 2018/05/12 10:33:06 mlelstv Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 1999, 2002, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.101 2017/12/04 22:15:52 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.102 2018/05/12 10:33:06 mlelstv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -762,10 +762,11 @@ dk_dump(struct dk_softc *dksc, dev_t dev daddr_t blkno, void *vav, size_t size) { const struct dkdriver *dkd = dksc->sc_dkdev.dk_driver; + struct disk_geom *dg = &dksc->sc_dkdev.dk_geom; char *va = vav; struct disklabel *lp; struct partition *p; - int part, towrt, nsects, sectoff, maxblkcnt, nblk; + int part, towrt, maxblkcnt, nblk; int maxxfer, rv = 0; /* @@ -804,23 +805,44 @@ dk_dump(struct dk_softc *dksc, dev_t dev blkno = dbtob(blkno) / lp->d_secsize; /* blkno in secsize units */ p = &lp->d_partitions[part]; - if (p->p_fstype != FS_SWAP) { - DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__, - p->p_fstype)); - return ENXIO; - } - nsects = p->p_size; - sectoff = p->p_offset; + if (part == RAW_PART) { + if (p->p_fstype != FS_UNUSED) { + DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__, + p->p_fstype)); + return ENXIO; + } + /* Check wether dump goes to a wedge */ + if (dksc->sc_dkdev.dk_nwedges == 0) { + DPRINTF(DKDB_DUMP, ("%s: dump to raw\n", __func__)); + return ENXIO; + } + /* Check transfer bounds against media size */ + if (blkno < 0 || (blkno + towrt) > dg->dg_secperunit) { + DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, " + "nsects=%jd\n", __func__, (intmax_t)blkno, towrt, dg->dg_secperunit)); + return EINVAL; + } + } else { + int nsects, sectoff; - /* Check transfer bounds against partition size. */ - if ((blkno < 0) || ((blkno + towrt) > nsects)) { - DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, " - "nsects=%d\n", __func__, (intmax_t)blkno, towrt, nsects)); - return EINVAL; - } + if (p->p_fstype != FS_SWAP) { + DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__, + p->p_fstype)); + return ENXIO; + } + nsects = p->p_size; + sectoff = p->p_offset; - /* Offset block number to start of partition. */ - blkno += sectoff; + /* Check transfer bounds against partition size. */ + if ((blkno < 0) || ((blkno + towrt) > nsects)) { + DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, " + "nsects=%d\n", __func__, (intmax_t)blkno, towrt, nsects)); + return EINVAL; + } + + /* Offset block number to start of partition. */ + blkno += sectoff; + } /* Start dumping and return when done. */ maxblkcnt = howmany(maxxfer, lp->d_secsize); Index: src/sys/dev/dkwedge/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.96 src/sys/dev/dkwedge/dk.c:1.97 --- src/sys/dev/dkwedge/dk.c:1.96 Sun Mar 5 23:07:12 2017 +++ src/sys/dev/dkwedge/dk.c Sat May 12 10:33:06 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.96 2017/03/05 23:07:12 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.97 2018/05/12 10:33:06 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.96 2017/03/05 23:07:12 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.97 2018/05/12 10:33:06 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1613,7 +1613,7 @@ dkdump(dev_t dev, daddr_t blkno, void *v rv = EINVAL; goto out; } - if (blkno + size / DEV_BSIZE > sc->sc_size) { + if (blkno < 0 || blkno + size / DEV_BSIZE > sc->sc_size) { printf("%s: blkno (%" PRIu64 ") + size / DEV_BSIZE (%zu) > " "sc->sc_size (%" PRIu64 ")\n", __func__, blkno, size / DEV_BSIZE, sc->sc_size);