Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev Support dump on wedges.
details: https://anonhg.NetBSD.org/src/rev/8da561613125
branches: trunk
changeset: 319001:8da561613125
user: mlelstv <mlelstv%NetBSD.org@localhost>
date: Sat May 12 10:33:06 2018 +0000
description:
Support dump on wedges.
diffstat:
sys/dev/dksubr.c | 58 +++++++++++++++++++++++++++++++++++----------------
sys/dev/dkwedge/dk.c | 6 ++--
2 files changed, 43 insertions(+), 21 deletions(-)
diffs (119 lines):
diff -r cd3db14ccc1c -r 8da561613125 sys/dev/dksubr.c
--- a/sys/dev/dksubr.c Sat May 12 01:31:07 2018 +0000
+++ b/sys/dev/dksubr.c Sat May 12 10:33:06 2018 +0000
@@ -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 @@
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,24 +805,45 @@
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;
+
+ /* 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;
}
- /* Offset block number to start of partition. */
- blkno += sectoff;
-
/* Start dumping and return when done. */
maxblkcnt = howmany(maxxfer, lp->d_secsize);
while (towrt > 0) {
diff -r cd3db14ccc1c -r 8da561613125 sys/dev/dkwedge/dk.c
--- a/sys/dev/dkwedge/dk.c Sat May 12 01:31:07 2018 +0000
+++ b/sys/dev/dkwedge/dk.c Sat May 12 10:33:06 2018 +0000
@@ -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 @@
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);
Home |
Main Index |
Thread Index |
Old Index