svn commit: r214330 - stable/8/sys/geom/concat
Alexander Motin
mav at FreeBSD.org
Mon Oct 25 08:18:29 UTC 2010
Author: mav
Date: Mon Oct 25 08:18:29 2010
New Revision: 214330
URL: http://svn.freebsd.org/changeset/base/214330
Log:
MFC r212754:
Add support for dumping kernel to gconcat.
Dumping goes to the component, where dump partition begins.
Modified:
stable/8/sys/geom/concat/g_concat.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
Modified: stable/8/sys/geom/concat/g_concat.c
==============================================================================
--- stable/8/sys/geom/concat/g_concat.c Mon Oct 25 08:11:51 2010 (r214329)
+++ stable/8/sys/geom/concat/g_concat.c Mon Oct 25 08:18:29 2010 (r214330)
@@ -212,6 +212,39 @@ g_concat_access(struct g_provider *pp, i
}
static void
+g_concat_kernel_dump(struct bio *bp)
+{
+ struct g_concat_softc *sc;
+ struct g_concat_disk *disk;
+ struct bio *cbp;
+ struct g_kerneldump *gkd;
+ u_int i;
+
+ sc = bp->bio_to->geom->softc;
+ gkd = (struct g_kerneldump *)bp->bio_data;
+ for (i = 0; i < sc->sc_ndisks; i++) {
+ if (sc->sc_disks[i].d_start <= gkd->offset &&
+ sc->sc_disks[i].d_end > gkd->offset)
+ break;
+ }
+ if (i == sc->sc_ndisks)
+ g_io_deliver(bp, EOPNOTSUPP);
+ disk = &sc->sc_disks[i];
+ gkd->offset -= disk->d_start;
+ if (gkd->length > disk->d_end - disk->d_start - gkd->offset)
+ gkd->length = disk->d_end - disk->d_start - gkd->offset;
+ cbp = g_clone_bio(bp);
+ if (cbp == NULL) {
+ g_io_deliver(bp, ENOMEM);
+ return;
+ }
+ cbp->bio_done = g_std_done;
+ g_io_request(cbp, disk->d_consumer);
+ G_CONCAT_DEBUG(1, "Kernel dump will go to %s.",
+ disk->d_consumer->provider->name);
+}
+
+static void
g_concat_flush(struct g_concat_softc *sc, struct bio *bp)
{
struct bio_queue_head queue;
@@ -280,7 +313,12 @@ g_concat_start(struct bio *bp)
g_concat_flush(sc, bp);
return;
case BIO_GETATTR:
+ if (strcmp("GEOM::kerneldump", bp->bio_attribute) == 0) {
+ g_concat_kernel_dump(bp);
+ return;
+ }
/* To which provider it should be delivered? */
+ /* FALLTHROUGH */
default:
g_io_deliver(bp, EOPNOTSUPP);
return;
More information about the svn-src-all
mailing list