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

Reply via email to