summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorthomas <thomas@FreeBSD.org>2007-03-13 20:38:16 +0000
committerthomas <thomas@FreeBSD.org>2007-03-13 20:38:16 +0000
commitc78849acb1988c2846dbd4d0d57cf70690cf787e (patch)
treec45763b486877a7831e62eddfaa8041feeab407c /sys
parentdae5ad79a87b958282fcc79465afcee5898b10e1 (diff)
downloadFreeBSD-src-c78849acb1988c2846dbd4d0d57cf70690cf787e.zip
FreeBSD-src-c78849acb1988c2846dbd4d0d57cf70690cf787e.tar.gz
(reinit_bus): When the ATAPI bus is reset, do not schedule an automated
CAM rescan if the ATAPI device entries have not changed. The ATAPI bus may be reset for a variety of reasons, including any time an ATAPI request times out. It is not necessary to rescan at the CAM level in such a case, unless a device has appeared or disappeared, or has otherwise changed. PR: kern/103602 MFC after: 2 weeks
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/atapi-cam.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/dev/ata/atapi-cam.c b/sys/dev/ata/atapi-cam.c
index 3eebf72..3b4178a 100644
--- a/sys/dev/ata/atapi-cam.c
+++ b/sys/dev/ata/atapi-cam.c
@@ -275,15 +275,17 @@ atapi_cam_reinit(device_t dev) {
static void
reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) {
- struct ata_device *atadev;
+ struct ata_device *old_atadev[2], *atadev;
device_t *children;
- int nchildren, i;
+ int nchildren, i, dev_changed;
if (device_get_children(scp->parent, &children, &nchildren) != 0) {
return;
}
mtx_lock(&scp->state_lock);
+ old_atadev[0] = scp->atadev[0];
+ old_atadev[1] = scp->atadev[1];
scp->atadev[0] = NULL;
scp->atadev[1] = NULL;
@@ -299,6 +301,8 @@ reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) {
scp->atadev[1] = atadev;
}
}
+ dev_changed = (old_atadev[0] != scp->atadev[0])
+ || (old_atadev[1] != scp->atadev[1]);
mtx_unlock(&scp->state_lock);
free(children, M_TEMP);
@@ -307,6 +311,10 @@ reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) {
break;
case RESET:
xpt_async(AC_BUS_RESET, scp->path, NULL);
+
+ if (!dev_changed)
+ break;
+
/*FALLTHROUGH*/
case ATTACH:
cam_rescan(scp->sim);
OpenPOWER on IntegriCloud