summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authormlelstv <mlelstv@NetBSD.org>2018-05-12 10:33:06 +0000
committermlelstv <mlelstv@NetBSD.org>2018-05-12 10:33:06 +0000
commit60c528cddd3eccbc942d73d3ee9471e4c2ebf103 (patch)
tree4e8704a338d58f51bd08ff7fb2b290bf4a847fb6 /sys/dev
parent109711e3bbccf816e5c6dc448df1cfce192d4e53 (diff)
Support dump on wedges.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/dksubr.c58
-rw-r--r--sys/dev/dkwedge/dk.c6
2 files changed, 43 insertions, 21 deletions
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 <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);
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 <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 *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);