Date: Tue, 25 Jun 2013 07:27:24 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r252201 - in stable/9/sys/cam: ata scsi Message-ID: <201306250727.r5P7ROJY013301@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Tue Jun 25 07:27:23 2013 New Revision: 252201 URL: http://svnweb.freebsd.org/changeset/base/252201 Log: MFC r251792: Restore use of polling mode for disk cache flush in case of kernel panic. While I am not sure that any extra hardware access is a good idea after panic, that is an existing behaviour that should better work correctly. Modified: stable/9/sys/cam/ata/ata_da.c stable/9/sys/cam/scsi/scsi_da.c Directory Properties: stable/9/sys/ (props changed) Modified: stable/9/sys/cam/ata/ata_da.c ============================================================================== --- stable/9/sys/cam/ata/ata_da.c Tue Jun 25 07:17:30 2013 (r252200) +++ stable/9/sys/cam/ata/ata_da.c Tue Jun 25 07:27:23 2013 (r252201) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include <sys/eventhandler.h> #include <sys/malloc.h> #include <sys/cons.h> +#include <sys/proc.h> #include <sys/reboot.h> #include <geom/geom_disk.h> #endif /* _KERNEL */ @@ -1932,11 +1933,16 @@ adaflush(void) int error; CAM_PERIPH_FOREACH(periph, &adadriver) { - /* If we paniced with lock held - not recurse here. */ - if (cam_periph_owned(periph)) + softc = (struct ada_softc *)periph->softc; + if (SCHEDULER_STOPPED()) { + /* If we paniced with the lock held, do not recurse. */ + if (!cam_periph_owned(periph) && + (softc->flags & ADA_FLAG_OPEN)) { + adadump(softc->disk, NULL, 0, 0, 0); + } continue; + } cam_periph_lock(periph); - softc = (struct ada_softc *)periph->softc; /* * We only sync the cache if the drive is still open, and * if the drive is capable of it.. Modified: stable/9/sys/cam/scsi/scsi_da.c ============================================================================== --- stable/9/sys/cam/scsi/scsi_da.c Tue Jun 25 07:17:30 2013 (r252200) +++ stable/9/sys/cam/scsi/scsi_da.c Tue Jun 25 07:27:23 2013 (r252201) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include <sys/malloc.h> #include <sys/cons.h> #include <sys/endian.h> +#include <sys/proc.h> #include <geom/geom.h> #include <geom/geom_disk.h> #endif /* _KERNEL */ @@ -3617,8 +3618,16 @@ dashutdown(void * arg, int howto) int error; CAM_PERIPH_FOREACH(periph, &dadriver) { - cam_periph_lock(periph); softc = (struct da_softc *)periph->softc; + if (SCHEDULER_STOPPED()) { + /* If we paniced with the lock held, do not recurse. */ + if (!cam_periph_owned(periph) && + (softc->flags & DA_FLAG_OPEN)) { + dadump(softc->disk, NULL, 0, 0, 0); + } + continue; + } + cam_periph_lock(periph); /* * We only sync the cache if the drive is still open, and
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306250727.r5P7ROJY013301>