diff options
author | thomas <thomas@FreeBSD.org> | 2007-03-13 20:38:16 +0000 |
---|---|---|
committer | thomas <thomas@FreeBSD.org> | 2007-03-13 20:38:16 +0000 |
commit | c78849acb1988c2846dbd4d0d57cf70690cf787e (patch) | |
tree | c45763b486877a7831e62eddfaa8041feeab407c /sys | |
parent | dae5ad79a87b958282fcc79465afcee5898b10e1 (diff) | |
download | FreeBSD-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.c | 12 |
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); |