From 60c528cddd3eccbc942d73d3ee9471e4c2ebf103 Mon Sep 17 00:00:00 2001 From: mlelstv Date: Sat, 12 May 2018 10:33:06 +0000 Subject: Support dump on wedges. --- sys/dev/dksubr.c | 58 ++++++++++++++++++++++++++++++++++++---------------- sys/dev/dkwedge/dk.c | 6 +++--- 2 files changed, 43 insertions(+), 21 deletions(-) (limited to 'sys/dev') diff --git a/sys/dev/dksubr.c b/sys/dev/dksubr.c index ca782d354b1..cdcdf9a5934 100644 --- a/sys/dev/dksubr.c +++ b/sys/dev/dksubr.c @@ -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 -__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 #include @@ -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); diff --git a/sys/dev/dkwedge/dk.c b/sys/dev/dkwedge/dk.c index 150471552fb..30fc333d0b4 100644 --- a/sys/dev/dkwedge/dk.c +++ b/sys/dev/dkwedge/dk.c @@ -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 -__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 *va, size_t size) 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); -- cgit